Cocos2d-x   发布时间:2022-05-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Cocos2D两个方法的重构一例大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

在RPG游戏项目的GameSpace类中原来有一个方法:

-(instanCETypE)initWithGameScene:(GameScene *)gameScene mapName:(NSString*)@H_974_7@mapName;

功能主要为用指定的地图初始化游戏空间布局,后来由于使用方便的原因,增加了一个类似的方法:

-(instanCETypE)initWithGameScene:(GameScene *)gameScene mapName:(NSString *)@H_974_7@mapName spawnAtTilePos:(CGPoint)tilePoint;

该方法比原来的方法仅仅多了一个参数,用来初始化player出现在地图场景中的瓦块位置.

这样就出现了功能类似的2个方法,这势必造成代码的重复,会对将来的代码修改带来非常坏的影响,所以今天我们就想办法对其重构.

首先我们将第一个方法前面的几行代码提炼出去,形成一个新的方法:

-(void)instancePreInit:(GameScene*)gameScene mapName:(NSString*)@H_974_7@mapName{ _viewSize = [CCDirector sharedDirector].viewSize;

    _gameScene = gameScene;
    _tiled@H_117_9@map = [CCTiledMap tiled@H_117_9@mapWithFile:mapName];

    _tiled@H_117_9@map.anchorPoint = ccp(0,0);
    [self addChild:_tiled@H_117_9@map];

    _@H_974_7@mh = [[@H_117_9@mapHelper alloc]initWithGameScene:gameScene andTiledMap:_tiled@H_117_9@map];

    CCTiledMapLayer *barrierLayer = [_tiled@H_117_9@map layerNamed:@"BarrierLayer"];
    barrierLayer.visible = NO;

    _objGroup = [_tiled@H_117_9@map objectGroupNamed:@"Objects"];

    _gd = [GameData sharedInstance];

    _bgLayer = [_tiled@H_117_9@map layerNamed:@"BGLayer"];
    NSAssert(_bgLayer,@"ERR:地图中没有_bgLayer层!!!");
}

然后在2个方法中分别用该方法替换原有的代码:

-(instanCETypE)initWithGameScene:(GameScene *)gameScene mapName:(NSString *)mapName
                  spawnAtTilePos:(CGPoint)tilePoint{
    self = [super init];
    if (self) {
        //原功能代码
        [self instancePreInit:gameScene mapName:mapName];
        //其他代码

另一个方法也类似,现在我们来处理后面的代码.

现在创建后续初始化方法,把以上两个方法的后半段代码抽取到其中:

-(void)instanceSufInit:(CGPoint)spawnPos{
    GameData *gd = [GameData sharedInstance];
    NSString *className = gd.players[0][@"playerName"];
    _panda = [GameCharacter gcWithName:className wihtGameScene:_gameScene];

    _panda.position = spawnPos;

    self.contentSize = [CCDirector sharedDirector].viewSize;
    [_bgLayer addChild:_panda z:50];
    [self setPlayerFaCETo];

    if (gd.players.count > 1) {
        GameCharacter *followGC = nil;
        GameCharacter *targetGC = _panda;
        NSInteger maxFollowCount = MIN(2,gd.players.count-1);
        for (int i = 1; i <= maxFollowCount; i++) {
            className = gd.players[i][@"playerName"];
            followGC = [GameCharacter gcWithName:className wihtGameScene:_gameScene];
            [_bgLayer addChild:followGC];
            [followGC follow:targetGC];
            targetGC = followGc;
        }
    }

    self.userInteractionEnabled = YES;

    _walkableTiles = [NSMutableArray array];
    [self initWalkableTiles];

    _npcArray = [NSMutableArray array];
    _interactThingAry = [NSMutableArray array];
    _followAry = [NSMutableArray array];
}

但是在第一个方法中,对瓦块坐标要做一些修正以居中在瓦块显示,但在第二个方法中不需要修正,所以先要将这点重构之然后再调用后缀方法:

CGPoint spawnPos = [self getPlayerSpawnPos];
        spawnPos = [_mh centerObjectsPos:spawnPos];
        [self instanceSufInit:spawnPos];

第二个方法重构后的代码如下:

CGPoint spawnPos = [_mh positionForTilePos:tilePoint];
[self instanceSufInit:spawnPos];

现在2个方法共享同样的前缀和后缀方法,也消除了冗余代码,我们就这样完成了本次重构.

大佬总结

以上是大佬教程为你收集整理的Cocos2D两个方法的重构一例全部内容,希望文章能够帮你解决Cocos2D两个方法的重构一例所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。