指挥搬运工走动
本文是系列文章第十篇,讲如何在推箱子游戏程序中实现下述功能:玩家用手指触摸屏幕来指挥搬运工走动。系列文章第九篇“绘制游戏区域”是本文的前提。在第九篇中,我们在游戏界面上绘制了游戏区域(即二维网格)和搬运工,如图1所示。
图1 系列文章第九篇达成的效果
本文目标
玩家指挥搬运工走动的功能,描述如下:
1. 当玩家手指触摸搬运工的上方(下方、左侧、右侧)单元格,则搬运工将走到上方(下方、左侧、右侧)单元格。如图2所示。
2. 不允许出边界。
3. 玩家触摸到搬运工上方(下方、左侧、右侧)单元格之外的区域,则视为无效指令,搬运工不走动。
你将学到的知识内容
1. 利用回调函数onTouchEvent处理屏幕触摸事件。
2. 利用invalidate或postInvalidate方法刷新视图。
实现思路
在游戏界面,玩家触摸手机屏幕的时候,将引发Android系统执行onTouchEvent回调函数,在此回调函数内执行以下工作:
1. 判断触摸位置是否落在搬运工的上方(下方、左侧、右侧)单元格。
2. 若是,则修改搬运工的位置到上方(下方、左侧、右侧)单元格;要求重新绘制画面。游戏画面重新绘制后,玩家将看到搬运工走动了。
那么,如何判断触摸位置是否落在搬运工的上方(下方、左侧、右侧)单元格呢?以判断是否落在上方单元格为例,答案是:
1. 记住搬运工当前所处的单元格(记作(mManRow, mManColumn),也就是说搬运工处在mManRow行mManColumn列)。
2. 我们知道,每一单元格是一个正方形,记它的宽度为mCellWidth。搬运工上方单元格的矩形区域above的左上角是:
1) 左端:mManColumn * mCellWidth
2) 上端:(mManRow – 1) * mCellWidth
上方单元格的矩形区域above的右下角是:
3) 右端:(mManColumn + 1) * mCellWidth
4) 下端:mManRow * mCellWidth
3. 获取通过onTouchEvent回调函数的参数传入的触摸位置(touch_x, touch_y)。
4. 如果触摸位置(touch_x, touch_y)落在上方单元格above内,则得出“是”的结论,否则得出“否”的结论。
类似地,我们可以判断触摸位置是否落在搬运工下方(below)、左侧(left)、右侧(right)的单元格内。
实现步骤
我们遵循以下步骤来实现游戏界面上玩家指挥搬运工走动功能:
1. 实现搬运工向下走动。
2. 实现搬运工向右走动。
3. 禁止搬运工走出边界。
4. 搬运工向上、向左走动功能留作作业。