andengine -3-处理触摸事件

来源:互联网 发布:女士棉袄淘宝网 编辑:程序博客网 时间:2024/05/21 11:01

l 使用场景触摸监听:

我会解释如何使用触摸监听

· 首先,应当实现IOnSceneTouchListener接口

· 然后检查事件 动作。

@Override

public boolean onSceneTouchEvent(Scene pScene, final TouchEvent pSceneTouchEvent)

{

    if (pSceneTouchEvent.isActionDown())

    {

        //execute action.

    }

    return false;

}

最后,注册到场景:

scene.setOnSceneTouchListener(this);

l 创建左/右按钮

在大多数游戏中,你都要控制某个对象。所以控制器显得有必要。在这个例子中,我会展示如何创建左/右按钮(控制主角左/右移动)

1.创建按钮

本例使用 矩形实体(Rectangle Entity)简单明了。当然你可以使用任何其他实体如Sprite 或 AnimatedSprite。

按钮会被关联到HUD

private void createControllers()

{

    HUD yourHud = new HUD();

    

    final Rectangle left = new Rectangle(20, 200, 60, 60, vbo)

    {

        public boolean onAreaTouched(TouchEvent touchEvent, float X, float Y)

        {

            if (touchEvent.isActionUp())

            {

                // move player left

            }

            return true;

        };

    };

    

    final Rectangle right = new Rectangle(100, 200, 60, 60, vbo)

    {

        public boolean onAreaTouched(TouchEvent touchEvent, float X, float Y)

        {

            if (touchEvent.isActionUp())

            {

                // move player right

            }

            return true;

        };

    };

    // 可见,实际接受触摸事件消息的是场景!    

    yourHud.registerTouchArea(left);

    yourHud.registerTouchArea(right);

    yourHud.attachChild(left);

    yourHud.attachChild(right);

    

    camera.setHUD(yourHud);

}

首先,创建一个HUD,然后,两个矩形,重写矩形实体的 onAreaTouched以便能处理事件,在场景中注册响应区域,最后把实体加到场景中。别忘了调用Camera的setHUD。

处理安卓的原生按键消息(native key)

在开发应用时候,处理按键消息也很重要。有几个要记住,这是我的观点:

(注:这个属于Android Framework 层)

1.重写方法:

首先,应该重写onKeyDown方法,该方法会捕获电话的回退键。

@Override

public boolean onKeyDown(int keyCode, KeyEvent event) 

{  

    if (keyCode == KeyEvent.KEYCODE_BACK)

    {

        // perform your actons.

    }

    return false; 

}

2.处理不同的按键

显然,会有很多不同的按键消息,重要的有:

· KeyEvent.KEYCODE_HOME

· KeyEvent.KEYCODE_BACK

· KeyEvent.KEYCODE_MENU

值得一提的是,在有些设备上,没有特定的键,像我的平板就没有Menu键。

3.仔细思考

我强烈不建议重写系统的HOME/BACK键,因为需要返回 前一个APP,另一个重要因素是:在 Google Play Store 团队为应用排位时也会考虑这个因素。(注:不太了解)

l 捕获连续的触屏事件

本文讲述如何简单,快速,正确捕获连续触屏事件。

假如有一个精灵,需要连续地执行某一动作(如,在X轴上给玩家力来作移动),这里,我使用矩形实体。

1. 可能的解法

有两个办法,分别介绍:

final Rectangle button = new Rectangle(0, 0, 100, 100, vbo)

{

    @Override

    public boolean onAreaTouched(TouchEvent pSceneTouchEvent, float pTouchAreaLocalX, float pTouchAreaLocalY)

    {

        if (pSceneTouchEvent.isActionMove())

        {

             // Handle your action here

        }

        return true;

    }

};

如上,重写onAreaTouched 方法并捕获isActionMove。这是个好办法,因为你手指按下时随着手指移动,即使是一,两个像素也会获得连续的移动事件,但并不完美。所以有更好的解法:

// our flag

private boolean isTouchedFlag = false;

// our button

final Rectangle button = new Rectangle(0, 0, 100, 100, vbo)

{

        @Override

        public boolean onAreaTouched(TouchEvent pSceneTouchEvent, float pTouchAreaLocalX, float pTouchAreaLocalY)

        {

                if (pSceneTouchEvent.isActionDown())

                {

                        isTouchedFlag = true;

                }

                if (pSceneTouchEvent.isActionUp())

                {

                        isTouchedFlag = false;

                }

                return true;

        }

        

        @Override

        protected void onManagedUpdate(float pSecondsElapsed)

        {

                if (isTouchedFlag)

                {

                        // Execute your actions.

                }

                super.onManagedUpdate(pSecondsElapsed);

        }

};

这个办法使用了Update handler总是有效,因为:

· 首先,声明一个布尔标志来存储按钮状态。

· 使用Rectangle声明一个按钮。

· 重写 onAreaTouched 方法捕获事件 .

· 如果是 isActionDown 按下,设置标志为True (触屏开始)

· 如果是 isActionUp 抬起设置标志为 false (释放)

· 这次我们重写 onManageUpdate 检查标志是否为True,如果是则在循环中执行我们的要做的事。

l 捕获长时点击(Long Click)

按着不放这个事件很容易实现,因为 AE已经内置这个功能了

长时点击在界面中很有用,下面代码展示如何在场景中实现这个功能:

· 首先,必须实现IHoldDetectorListener接口,重写下面三个未实现的方法:

@Override

public void onHoldStarted(HoldDetector pHoldDetector, int pPointerID, float pHoldX, float pHoldY)

{

        

}

@Override

public void onHold(HoldDetector pHoldDetector, long pHoldTimeMilliseconds, int pPointerID, float pHoldX, float pHoldY)

{

        

}

@Override

public void onHoldFinished(HoldDetector pHoldDetector, long pHoldTimeMilliseconds, int pPointerID, float pHoldX, float pHoldY)

{

        

}

· 声明一个ContinousHoldDetector 对象

private ContinuousHoldDetector continuousHoldDetector;

· 初始化它,并注册到场景。 注意,这里使用默认的构造函数,如果要自定义一些参数,你也可以使用带参数的构造函数。

continuousHoldDetector = new ContinuousHoldDetector(this);

yourScene.registerUpdateHandler(continuousHoldDetector);

· 完成后,你就可以在IHoldDetectorListener接口的实现函数里执行自己的代码了

· onHoldStarted() -  手指按住一段时间后调用。

· onHoldFinished() - 手指离开屏幕后调用。