(NO.00005)iOS实现炸弹人游戏(五):游戏数据的初始化(二)

来源:互联网 发布:excel防止数据丢失 编辑:程序博客网 时间:2024/06/06 05:35

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


我们现在来依次看一下上篇中提到的各个方法,首先介绍的是updateStateLabel方法:

#pragma mark MainScene游戏相关辅助方法//更新主角状态标签,格式为:神速 无敌 爆裂 穿墙 穿弹 遥控-(void)updateStateLabel{    NSString *state = [NSString stringWithFormat:@"%@%@%@%@%@%@",                       _isPlayerSpeedUp ? @"神速":@"    ",                       _player.isInvincible ? @"无敌":@"    ",                       !_isFearBomb ? @"爆裂":@"    ",                       _player.canAcrossBrick ? @"穿墙":@"    ",                       _player.canAcrossBomb ? @"穿弹":@"    ",                       _isManualExplode ? @"遥控":@"    "];    [_hudLayer updateStateLabel:state];}

代码很好理解,就是根据当前主角的状态创建状态字符串然后显示在标签中,当然更可取的方法是使用图标来显示,这个可以留作以后扩展.

接下来看一下initNoWallTiles方法,该方法的作用是遍历所有非墙的瓦块坐标,为后面的方法调用做准备,起到一个缓存数据换速度的目的:

//初始化不是墙的所有瓦块坐标,还要排除(0,0),(0,1),(1,0)三个瓦块.-(void)initNoWallTiles{    CGPoint badTilePos1 = ccp(0, 0);    CGPoint badTilePos2 = ccp(0, 1);    CGPoint badTilePos3 = ccp(1, 0);    for (int x = 0; x < _tileMap.mapSize.width; x++) {        for (int y = 0; y < _tileMap.mapSize.height; y++) {            CGPoint tilePos = ccp(x, y);            if (CGPointEqualToPoint(tilePos, badTilePos1) ||                CGPointEqualToPoint(tilePos, badTilePos2) ||                CGPointEqualToPoint(tilePos, badTilePos3)) {                continue;            }else if (![self isWallAtTileCoord:tilePos]) {                [_notWallTiles addObject:[NSValue valueWithCGPoint:tilePos]];            }        }    }    NSAssert(_notWallTiles.count == 249, @"_notWallTiles must equ 249");}

代码中依次遍历了所有瓦块,将非墙瓦块的坐标加入到_notWallTiles数组中,这样后面的随机生成地图方法里我们可以很方便的使用这些数据了.注意其中剔除了3个坐标,分别为:

(0,0) , (0,1) 和 (1,0)

因为游戏主角炸弹人需要在(0,0)处产生,所以(0,1)和(1,0)自然不能放置砖块,否则主角自身就会”死路一条”,最后用一个断言来检查非墙瓦块的个数是否为249,这个是事先手动计算好的,总共为30x10=300个瓦块,减去6*8=48个不可摧毁墙体,再减去3个上述坐标,最后剩余249个瓦块可以操作.

1 1
原创粉丝点击