“如何使用Cocos2D 2.X制作基于平铺的游戏”使用cocos2d V3制作本教程

我有一个小问题。 在本教程中如何使用Cocos2D 2.X制作基于Tile的游戏使用了cocos2d V2.0,我想在cocos2d V3.0中做这个。 所以,这是行不通的! 谢谢! (我不会说英文)

我觉得在这一行的问题 – 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(@"%@", NSStringFromCGPoint(touchLocation)); } -(void)setPlayerPosition:(CGPoint)position { _player.position = position; } 

问题在于,用户交互的区域默认绑定到场景的contentSize (屏幕大小)。

在调用setViewPointCenter方法时,您正在将场景位置移出触摸事件未处理的区域。

你必须像这样扩展tile地图的contentSize的这个区域:

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