手势操作的Snake游戏_拿来主义迅速上手

手势操作的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的逻辑细节进行剖析。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值