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

本文详细介绍使用Cocos2d-x v3.4版本进行游戏开发的过程,包括实例变量设置、帮助方法实现如坐标验证、道具检测等,并展示了touchBegan方法及初始化方法的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.
如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! 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可以穿墙入室,所以我们需要让它与地图障碍物发生碰撞,这也是下一篇的内容 ;)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大熊猫侯佩

赏点钱让我买杯可乐好吗 ;)

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值