手势操作的Snake游戏_拿来主义迅速上手
本文是snake on a phone 贪吃蛇游戏的项目解析系列文章,基于google sample code 改编而成,项目地址 https://github.com/lonely917/snake-on-a-phone-fling-version
内容持续更新,接上一篇文章Snake on a phone——Android开源项目实战,贪吃蛇游戏
SnakeView是游戏主题视图,包括对Dpad按键类型事件的监听,我们尝试为其添加手势监听器。前面的文章已经讲到SnakeView的onKeyDown中对方向键事件监听,然后执行逻辑,由于手机没有方向键也就不会产生对应事件,我们在手势监测中判断出滑动方向后主动触发或者说模拟一次按键操作即可实现游戏的正常运行,至于游戏细节我们待游戏跑出来后再去分析或者更改。首先让SnakeView实现OnGestureListener
public class SnakeView extends TileView implements OnGestureListener
要实现接口的一些方法,我们的主要控制逻辑写在onFling中
onDown
onFling
onScroll.....
在onFling中判断滑动的方向,并模拟按键操作。其中limit是一个阈值,滑动举例超过这个才被认为是一次操作,我这里设定了100。
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
Log.d("DETECTOR", "onfling: "+e1.toString());
Log.d("DETECTOR", "onfling: "+e2.toString());
Log.d("DETECTOR", "onfling: "+"x speed->"+velocityX+";y speed->"+velocityY);
int x_move = (int) (e2.getX()-e1.getX());
int y_move = (int) (e2.getY()-e1.getY());
//阈值
int limit = 100;
if(x_move > limit)
{
//向右滑动
onKeyDown(KeyEvent.KEYCODE_DPAD_RIGHT, null);
}
else if(x_move < limit*(-1))
{
//向左滑动
onKeyDown(KeyEvent.KEYCODE_DPAD_LEFT, null);
}
else if(y_move > limit)
{
//向下滑动 注意坐标方向不同于我们熟悉的数学坐标轴方向
onKeyDown(KeyEvent.KEYCODE_DPAD_DOWN, null);
}
else if(y_move < limit *(-1))
{
//向上滑动
onKeyDown(KeyEvent.KEYCODE_DPAD_UP, null);
}
return false;
}
监听内容写完我们还没有将此监听器和我们的View关联起来,以下是定义和初始化部分,
//定义手势监测
private GestureDetector gestureDetector;
private void initSnakeView() {
setFocusable(true);
Resources r = this.getContext().getResources();
resetTiles(4);
loadTile(RED_STAR, r.getDrawable(R.drawable.redstar));
loadTile(YELLOW_STAR, r.getDrawable(R.drawable.yellowstar));
loadTile(GREEN_STAR, r.getDrawable(R.drawable.greenstar));
//初始化gestureDetector
gestureDetector = new GestureDetector(getContext(), this);
}
initSnakeView的其他部分我们暂时不需要关心,使得手势操作生效还需要在onTouchEvent中将事件交给gestureDetector
public boolean onTouchEvent(MotionEvent event) {
//在这里关联手势操作
gestureDetector.onTouchEvent(event);
//比较重要的一点,对于按下操作ActionDown一定要返回true,否则接收不到后续move 和 up的事件
if(event.getAction() == MotionEvent.ACTION_DOWN)
return true;
return super.onTouchEvent(event);
}
这里有个很重要的地方就是需要对ACTION_DOWN事件进行处理,返回true,表示自按下事件后的后续操作我都来接管,否则的话这个onTouchEvent只能接触到一ActionDowm事件,后续的move和up都不会收到,全都交给viewgroup处理的。于是运行游戏,我们可以通过滑动来进行操作了。
至此我们的游戏改装完成,后续我们对SnakeView的逻辑细节进行剖析。