"Comment faire un jeu basé sur des tuiles avec Cocos2D 2.X" Faire ce tutoriel avec cocos2d V3

J'ai un petit problème. Dans ce tutoriel Comment faire un jeu basé sur des tuiles avec Cocos2D 2.X utilisé cocos2d V2.0, je veux faire cela dans cocos2d V3.0. Donc, ça ne marche pas! Merci! (Je ne parle pas anglais)

Je pense que le problème dans cette ligne – self.position = viewPoint;

@property (strong) CCTiledMap *tileMap; @property (strong) CCTiledMapLayer *background; @property (strong) CCSprite *player; - (id)init { // Apple recommend assigning self with supers return value self = [super init]; if (!self) return(nil); // Enable touch handling on scene node self.userInteractionEnabled = YES; self.tileMap = [CCTiledMap tiledMapWithFile:@"TileMap.tmx"]; self.background = [_tileMap layerNamed:@"Background"]; [self addChild:_tileMap z:-1]; CCTiledMapObjectGroup *objectGroup = [_tileMap objectGroupNamed:@"Objects"]; NSAssert(objectGroup != nil, @"tile map has no objects object layer"); NSDictionary *spawnPoint = [objectGroup objectNamed:@"SpawnPoint"]; int x = [spawnPoint[@"x"] integerValue]; int y = [spawnPoint[@"y"] integerValue]; _player = [CCSprite spriteWithImageNamed:@"Player.png"]; _player.position = ccp(x,y); [self addChild:_player]; [self setViewPointCenter:_player.position]; // done return self; } - (void)setViewPointCenter:(CGPoint) position { CGSize winSize = [CCDirector sharedDirector].viewSize; int x = MAX(position.x, winSize.width/2); int y = MAX(position.y, winSize.height/2); x = MIN(x, (_tileMap.mapSize.width * _tileMap.tileSize.width) - winSize.width / 2); y = MIN(y, (_tileMap.mapSize.height * _tileMap.tileSize.height) - winSize.height/2); CGPoint actualPosition = ccp(x, y); CGPoint centerOfView = ccp(winSize.width/2, winSize.height/2); CGPoint viewPoint = ccpSub(centerOfView, actualPosition); self.position = viewPoint; } -(void)touchBegan:(UITouch *)touch withEvent:(UIEvent *)event { CGPoint touchLocation = [touch locationInView:touch.view]; touchLocation = [[CCDirector sharedDirector] convertToGL:touchLocation]; touchLocation = [self convertToNodeSpace:touchLocation]; CGPoint playerPos = _player.position; CGPoint diff = ccpSub(touchLocation, playerPos); if ( abs(diff.x) > abs(diff.y) ) { if (diff.x > 0) { playerPos.x += _tileMap.tileSize.width; } else { playerPos.x -= _tileMap.tileSize.width; } } else { if (diff.y > 0) { playerPos.y += _tileMap.tileSize.height; } else { playerPos.y -= _tileMap.tileSize.height; } } CCLOG(@"playerPos %@",CGPointCreateDictionaryRepresentation(playerPos)); // safety check on the bounds of the map if (playerPos.x <= (_tileMap.mapSize.width * _tileMap.tileSize.width) && playerPos.y <= (_tileMap.mapSize.height * _tileMap.tileSize.height) && playerPos.y >= 0 && playerPos.x >= 0 ) { [self setPlayerPosition:playerPos]; } [self setViewPointCenter:_player.position]; NSLog(@"%@", NSSsortingngFromCGPoint(touchLocation)); } -(void)setPlayerPosition:(CGPoint)position { _player.position = position; } 

Le problème est que la zone de l'interaction de l'user est liée par défaut au contentSize de la scène (taille de l'écran).

Lorsque vous appelez votre méthode setViewPointCenter , vous déplacez la position de la scène hors de cette zone où l'événement tactile n'est pas géré.

Vous devez étendre cette zone du contentSize de la carte de tuiles comme ça:

 [self setContentSize:[_tileMap contentSize]]; self.userInteractionEnabled = YES;