本文共 1817 字,大约阅读时间需要 6 分钟。
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.
如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! 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个瓦块可以操作.