(3)4或8方向限定移动类型
如果你已经看到这里,我们已经对要制作的东西做了两次分类 第一次将整个“游戏”分类,取了“俯视”的一部分 第二次将“俯视”分类,取了4或8方向限定移动类型(下文简称“限定移动”) 这样的“化整为零”是结构化面向过程程序设计和面向对象程序设计的正确思路,我们将继续这个思路,直到问题简化到能用具体办法解决为止。 后文会用类似下面粗体字的明确书签标志当前的划分层次,避免逻辑混乱 每个类型本人会举大量经典游戏作为例子,方便对号入座 限定移动可以分为完全限定移动和不完全限定移动。 前者的每个元素(玩家、敌人、地图元素等)必须与地图的分格一一对应 后者只是限制了玩家的操作是4方向或8方向的,但是未必对应地图的分格
3.1 游戏->俯视->限定移动->完全限定移动 特点:某游戏主要使用键盘操作,玩家只能向上下左右移动,障碍物是矩形障碍,大小和坐标非常统一,对齐到网格,等同于玩家大小的障碍。 举例:传统rpg、传统slg、吃豆精灵、推箱子、包括部分方块类。此类游戏的首选碰撞方式是“数组地图”,数组地图是一个二维数组:
var map:Array = [
[1,1,1,1,1,1,1,1,1,1],
[1,0,0,0,0,0,1,0,0,1],
[1,0,0,0,1,1,1,0,0,1],
[1,0,0,0,1,0,0,0,0,1],
[1,0,0,0,1,1,1,1,0,1],
[1,0,0,0,0,0,0,0,0,1],
[1,1,1,1,1,1,1,1,1,1]];
这是一张简易的数组地图。我们可以用“0”来表示“空地”,用“1”来表示“石头” 玩家有自己在数组地图上的坐标。 玩家(player)的现坐标为(3,2),注意,数组是从0开始计数的,而不是1 如果操作玩家向左移动,那么检测(3-1,2)是否为0,该位置是0,返回false,玩家可以移动 如果该位置操作玩家向右移动,检测到(3+1,2)是1,返回true,发生“碰撞”,禁止玩家的移动 玩家和敌人在地图上随时写入数组,如玩家用2标识,敌人用3标识, 某单位移动时将数组地图对应该单位坐标清零,并在该单位的新坐标处把0修改为该单位标识 此类游戏存在投射性武器不写入数组 武器检测碰撞时,根据武器的坐标计算出该武器属于数组地图的哪一格 例如真实地图的每格宽度为20 炮弹真实坐标(212.5,113),以bullet.x和bullet.y表示:
var bulletMapX:uint = Math.floor(bullet.x/20);
var bulletMapY:uint = Math.floor(bullet.y/20);
//其中的 |