大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.
如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;)
现在打开MainScene.m文件,首先设置实例变量:
- @implementation MainScene{
- CGSize _viewSize;
-
- CatSprite *_cat;
-
- CCTiledMap *_tileMap;
- CCTiledMapLayer *_bgLayer;
- CCTiledMapLayer *_objectLayer;
- //在cocos2Dv3中没有CCSpriteBatchNode类,而CCNode已经做了优化,所以用CCNode代替.
- CCNode *_batchNode;
- }
然后将帮助方法添加进去,里面有不少要修改的地方,大家可以对比原代码和我转换后方法中的区别:
- -(BOOL)isValidTileCoord:(CGPoint)tileCoord {
- if (tileCoord.x < 0 || tileCoord.y < 0 ||
- tileCoord.x >= _tileMap.mapSize.width ||
- tileCoord.y >= _tileMap.mapSize.height) {
- return FALSE;
- } else {
- return TRUE;
- }
- }
-
- -(BOOL)isProp:(NSString*)prop atTileCoord:(CGPoint)tileCoord
- forLayer:(CCTiledMapLayer *)layer {
- if (![self isValidTileCoord:tileCoord]) return NO;
- int gid = [layer tileGIDAt:tileCoord];
- NSDictionary * properties = [_tileMap propertiesForGID:gid];
- if (properties == nil) return NO;
- return [properties objectForKey:prop] != nil;
- }
-
- -(BOOL)isWallAtTileCoord:(CGPoint)tileCoord {
- return [self isProp:@"Wall" atTileCoord:tileCoord forLayer:_bgLayer];
- }
-
- -(BOOL)isBoneAtTileCoord:(CGPoint)tileCoord {
- return [self isProp:@"Bone" atTileCoord:tileCoord forLayer:_objectLayer];
- }
-
- -(BOOL)isDogAtTileCoord:(CGPoint)tileCoord {
- return [self isProp:@"Dog" atTileCoord:tileCoord forLayer:_objectLayer];
- }
-
- -(BOOL)isExitAtTileCoord:(CGPoint)tileCoord {
- return [self isProp:@"Exit" atTileCoord:tileCoord forLayer:_objectLayer];
- }
-
- -(void)removeObjectAtTileCoord:(CGPoint)tileCoord {
- [_objectLayer removeTileAt:tileCoord];
- }
-
- - (CGPoint)tileCoordForPosition:(CGPoint)position {
- int x = position.x / _tileMap.tileSize.width;
- int y = ((_tileMap.mapSize.height * _tileMap.tileSize.height) - position.y) / _tileMap.tileSize.height;
- return ccp(x,y);
- }
-
- -(void)setViewpointCenter:(CGPoint) position {
- int x = MAX(position.x,_viewSize.width / 2);
- int y = MAX(position.y,_viewSize.height / 2);
- x = MIN(x,(_tileMap.mapSize.width * _tileMap.tileSize.width)
- - _viewSize.width / 2);
- y = MIN(y,(_tileMap.mapSize.height * _tileMap.tileSize.height)
- - _viewSize.height/2);
- CGPoint actualPosition = ccp(x,y);
-
- CGPoint centerOfView = ccp(_viewSize.width/2,_viewSize.height/2);
- CGPoint viewPoint = ccpSub(centerOfView,actualPosition);
-
- _tileMap.position = viewPoint;
-
- }
-
- - (CGPoint)positionForTileCoord:(CGPoint)tileCoord {
- int x = (tileCoord.x * _tileMap.tileSize.width) + _tileMap.tileSize.width/2;
- int y = (_tileMap.mapSize.height * _tileMap.tileSize.height) - (tileCoord.y * _tileMap.tileSize.height) - _tileMap.tileSize.height/2;
- return ccp(x,y);
- }
-
- -(void)update:(CCTime)delta{
- [self setViewpointCenter:_cat.position];
- }
接下来是比较重要的touchBegan和初始化方法.这里我将原来在init中的代码基本上都放到了didLoadFromCCB方法中,道理是一样的:
- -(void)touchBegan:(CCTouch *)touch withEvent:(CCTouchEvent *)event{
- CGPoint location = [[CCDirector sharedDirector] convertTouchToGL:touch];
- location = [_tileMap convertToNodeSpace:location];
- [_cat moveToward:location];
- }
-
- -(void)didLoadFromCCB{
- _viewSize = [CCDirector sharedDirector].viewSize;
-
- [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"CatMaze.plist"];
-
- _tileMap = [CCTiledMap tiledMapWithFile:@"CatMaze.tmx"];
- [self addChild:_tileMap];
-
- CGPoint spawnTileCoord = ccp(24,0);
- CGPoint spawnPos = [self positionForTileCoord:spawnTileCoord];
- [self setViewpointCenter:spawnPos];
-
- _bgLayer = [_tileMap layerNamed:@"Background"];
- _objectLayer = [_tileMap layerNamed:@"Objects"];
- _batchNode = [CCNode node];
- [_tileMap addChild:_batchNode];
- _cat = [[CatSprite alloc] initWithMainScene:self];
- _cat.position = spawnPos;
- [_batchNode addChild:_cat];
-
- self.userInteractionEnabled = YES;
- }
注意Cocos2D v3.4中的触碰开启只需要简单的一句:
- self.userInteractionEnabled = YES;
原来的那么多都可以省略了.现在编译运行游戏,效果如下图所示:
可以看到现在cat可以移动到屏幕最左边附近了,所以我们没有白费劲.现在的cat可以穿墙入室,所以我们需要让它与地图障碍物发生碰撞,这也是下一篇的内容 ;)