Cocos2D将v1.0的tileMap游戏转换到v3.4中一例(四)

前端之家收集整理的这篇文章主要介绍了Cocos2D将v1.0的tileMap游戏转换到v3.4中一例(四)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.
如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;)


现在打开MainScene.m文件,首先设置实例变量:

  1. @implementation MainScene{
  2. CGSize _viewSize;
  3.  
  4. CatSprite *_cat;
  5.  
  6. CCTiledMap *_tileMap;
  7. CCTiledMapLayer *_bgLayer;
  8. CCTiledMapLayer *_objectLayer;
  9. //在cocos2Dv3中没有CCSpriteBatchNode类,而CCNode已经做了优化,所以用CCNode代替.
  10. CCNode *_batchNode;
  11. }

然后将帮助方法添加进去,里面有不少要修改的地方,大家可以对比原代码和我转换后方法中的区别:

  1. -(BOOL)isValidTileCoord:(CGPoint)tileCoord {
  2. if (tileCoord.x < 0 || tileCoord.y < 0 ||
  3. tileCoord.x >= _tileMap.mapSize.width ||
  4. tileCoord.y >= _tileMap.mapSize.height) {
  5. return FALSE;
  6. } else {
  7. return TRUE;
  8. }
  9. }
  10.  
  11. -(BOOL)isProp:(NSString*)prop atTileCoord:(CGPoint)tileCoord
  12. forLayer:(CCTiledMapLayer *)layer {
  13. if (![self isValidTileCoord:tileCoord]) return NO;
  14. int gid = [layer tileGIDAt:tileCoord];
  15. NSDictionary * properties = [_tileMap propertiesForGID:gid];
  16. if (properties == nil) return NO;
  17. return [properties objectForKey:prop] != nil;
  18. }
  19.  
  20. -(BOOL)isWallAtTileCoord:(CGPoint)tileCoord {
  21. return [self isProp:@"Wall" atTileCoord:tileCoord forLayer:_bgLayer];
  22. }
  23.  
  24. -(BOOL)isBoneAtTileCoord:(CGPoint)tileCoord {
  25. return [self isProp:@"Bone" atTileCoord:tileCoord forLayer:_objectLayer];
  26. }
  27.  
  28. -(BOOL)isDogAtTileCoord:(CGPoint)tileCoord {
  29. return [self isProp:@"Dog" atTileCoord:tileCoord forLayer:_objectLayer];
  30. }
  31.  
  32. -(BOOL)isExitAtTileCoord:(CGPoint)tileCoord {
  33. return [self isProp:@"Exit" atTileCoord:tileCoord forLayer:_objectLayer];
  34. }
  35.  
  36. -(void)removeObjectAtTileCoord:(CGPoint)tileCoord {
  37. [_objectLayer removeTileAt:tileCoord];
  38. }
  39.  
  40. - (CGPoint)tileCoordForPosition:(CGPoint)position {
  41. int x = position.x / _tileMap.tileSize.width;
  42. int y = ((_tileMap.mapSize.height * _tileMap.tileSize.height) - position.y) / _tileMap.tileSize.height;
  43. return ccp(x,y);
  44. }
  45.  
  46. -(void)setViewpointCenter:(CGPoint) position {
  47. int x = MAX(position.x,_viewSize.width / 2);
  48. int y = MAX(position.y,_viewSize.height / 2);
  49. x = MIN(x,(_tileMap.mapSize.width * _tileMap.tileSize.width)
  50. - _viewSize.width / 2);
  51. y = MIN(y,(_tileMap.mapSize.height * _tileMap.tileSize.height)
  52. - _viewSize.height/2);
  53. CGPoint actualPosition = ccp(x,y);
  54.  
  55. CGPoint centerOfView = ccp(_viewSize.width/2,_viewSize.height/2);
  56. CGPoint viewPoint = ccpSub(centerOfView,actualPosition);
  57.  
  58. _tileMap.position = viewPoint;
  59.  
  60. }
  61.  
  62. - (CGPoint)positionForTileCoord:(CGPoint)tileCoord {
  63. int x = (tileCoord.x * _tileMap.tileSize.width) + _tileMap.tileSize.width/2;
  64. int y = (_tileMap.mapSize.height * _tileMap.tileSize.height) - (tileCoord.y * _tileMap.tileSize.height) - _tileMap.tileSize.height/2;
  65. return ccp(x,y);
  66. }
  67.  
  68. -(void)update:(CCTime)delta{
  69. [self setViewpointCenter:_cat.position];
  70. }

接下来是比较重要的touchBegan和初始化方法.这里我将原来在init中的代码基本上都放到了didLoadFromCCB方法中,道理是一样的:

  1. -(void)touchBegan:(CCTouch *)touch withEvent:(CCTouchEvent *)event{
  2. CGPoint location = [[CCDirector sharedDirector] convertTouchToGL:touch];
  3. location = [_tileMap convertToNodeSpace:location];
  4. [_cat moveToward:location];
  5. }
  6.  
  7. -(void)didLoadFromCCB{
  8. _viewSize = [CCDirector sharedDirector].viewSize;
  9.  
  10. [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"CatMaze.plist"];
  11.  
  12. _tileMap = [CCTiledMap tiledMapWithFile:@"CatMaze.tmx"];
  13. [self addChild:_tileMap];
  14.  
  15. CGPoint spawnTileCoord = ccp(24,0);
  16. CGPoint spawnPos = [self positionForTileCoord:spawnTileCoord];
  17. [self setViewpointCenter:spawnPos];
  18.  
  19. _bgLayer = [_tileMap layerNamed:@"Background"];
  20. _objectLayer = [_tileMap layerNamed:@"Objects"];
  21. _batchNode = [CCNode node];
  22. [_tileMap addChild:_batchNode];
  23. _cat = [[CatSprite alloc] initWithMainScene:self];
  24. _cat.position = spawnPos;
  25. [_batchNode addChild:_cat];
  26.  
  27. self.userInteractionEnabled = YES;
  28. }

注意Cocos2D v3.4中的触碰开启只需要简单的一句:

  1. self.userInteractionEnabled = YES;

原来的那么多都可以省略了.现在编译运行游戏,效果如下图所示:

可以看到现在cat可以移动到屏幕最左边附近了,所以我们没有白费劲.现在的cat可以穿墙入室,所以我们需要让它与地图障碍物发生碰撞,这也是下一篇内容 ;)

猜你在找的Cocos2d-x相关文章