前言
上文中我们实现了炸弹人与墙的碰撞检测,以及设置移动步长来解决发现的问题。本文会加入1个AI敌人,敌人使用A*算法追踪炸弹人。
加入敌人,追踪炸弹人
本文主要内容
回顾上文更新后的领域模型
开发策略
首先实现“加入敌人”功能。通过参考“炸弹人游戏开发系列(4):炸弹人显示与移动“中的实现,可以初步分析出需要加入敌人图片、敌人帧数据和精灵数据、敌人精灵类EnemySprite、敌人层EnemyLayer和敌人层管理类EnemyLayerManager。
然后实现“追踪炸弹人”功能。需要新建一个算法类FindPath,负责使用A*算法计算并返回路径数据。
敌人精灵类与算法类的交互关系:
并行开发
可以并行开发“加入敌人”和“追踪炸弹人”。
先定义一个FindPath类的的接口,指定findPath方法输入参数和返回参数的格式。
实现“加入敌人”功能时,可以按照接口指定的格式使用假的路径数据来测试EnemySprite类;实现“追踪炸弹人”功能时,按照接口指定格式使用假的坐标数据来测试FindPath类。
在EnemySprit和FindPath都实现后,再集成在一起测试。因为两者接口一致,因此集成时不会有什么困难。
加入敌人
扩大地图
现在地图大小为4*4,太小了。
加入一个敌人后:
- 可玩性太低
很快游戏就结束了;玩家操作炸弹人躲避敌人的空间太小了。 - 不方便演示和测试游戏
由于游戏很快就结束,因此不方便演示和测试游戏。
因此,将地图扩大为20*20。
要实现这个功能,只需要修改MapData和TerrainData即可。
相关代码
MapData
//地图数据 (function () { var ground = bomberConfig.map.type.GROUND, wall = bomberConfig.map.type.WALL; var mapData = [ [ wall, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground ], [ wall, ground, wall, wall, wall, wall, wall, wall, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground ], [ wall, ground, ground, ground, wall, ground, ground, wall, wall, ground, ground, ground, ground, wall, ground, ground, ground, ground, ground, ground ], [ wall, ground, ground, ground, wall, ground, ground, wall, wall, wall, ground, wall, ground, wall, ground, ground, ground, ground, ground, ground ], [ wall, ground, ground, ground, wall, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground ], [ wall, ground, wall, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground ], [ wall, ground, ground, ground, wall, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground ], [ wall, ground, ground, ground, wall, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground ], [ wall, ground, ground, ground, wall, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground ], [ wall, ground, ground, ground, wall, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground ], [ wall, ground, ground, ground, wall, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground ], [ wall, ground, ground, ground, wall, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground ], [ wall, ground, ground, ground, wall, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground ], [ wall, ground, ground, ground, wall, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground ], [ wall, ground, ground, ground, wall, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground ], [ wall, ground, ground, ground, wall, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground ], [ wall, ground, ground, ground, wall, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground ], [ wall, ground, ground, ground, wall, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground ], [ wall, ground, ground, ground, wall, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground ], [ wall, ground, ground, ground, wall, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground, ground ] ]; window.mapData = mapData; }());