做这个案例花了很长的时间,主要的时间是用在了寻找一个合适的游戏角色上,虽然网上有很多的4方向的人物动作图,但部分是工种不匹配,总不能找个英俊潇洒的美男子,或是弱不经风的大小姐来干推箱子这种体力活吧,更不用说携带管制刀具的剑士,或是呼风唤雨的法师角色,倒也有角色气质符合的,但分辨率实在太低,最后实在找不到合适的图片,就对照一个Q版大叔的形象,用更高一点的像素仿照着自己画了一个。
为了体现箱子的笨重感,给游戏设置了一个人物行进速度,无障碍行走时走得相对快一些,推着箱子时则走路速度减半,让游戏看起来更为真实一些,这个速度由变量“行走速度”来控制。
“人物定位”消息由地图角色发送,地图角色发送消息的同时也准备好了人物编号以及人物位置信息,自取即可。因为需要利用按键操作人物,所以设置了一个“按键防抖”变量,当角色检测到按键动作并做出反馈的整个过程中,我们利用这个“按键防抖”变量来无效化玩家多余的操作,因为人物移动后会带来变量与列表的数据改动。所以需要等所有数据都落实后,再重新将控制权交还用户。
因为我们把一个地图的数据存在“关卡数据”列表的某一个单项中,所以通过修改变量“当前关卡”的值,我们可以很方便的进入下一个关卡,需要注意的是,在新老地图交替的这段时间里,我们也要避免误按键导致的数据错乱,所以在接到“进入下关”消息之后,博主第一时间把按键防抖的值修改掉了。
在小鸟数据“拼图游戏”的实现过程中,我们需要去检测二维数组(列表模拟)的边界,确保图片位置不会超限。在推箱子游戏的地图中,因为存在围墙的设计,而围墙在这个游戏里被认为是无法跨越的,有了这一道天然的屏障,我们可以省去检测边界这一个流程,仅仅只需要判断在当前的按键方向下,人物是否可以移动。
如上图,游戏角色在4种情况下可以移动:
1,无箱子阻挡,目标格是普通地板;
2,无箱子阻挡,目标格是目标地板;
3,有箱子阻挡,箱子后面是普通地板;
4,有箱子阻挡,箱子后面是目标地板。
前两种情况直接移动后修改一下人物编号,确保人物位置与编号数据不要错乱就好,后两种情况,在人物移动的同时,我们需要发送一条消息,通知对应方向上的箱子同时进行移动。无法移动至目标方格的情况下,为了反馈玩家的操作,我们还需要再设置一套先前进再后退的动作,展示角色被阻挡后退回原地的过程。