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。
l 处理安卓的原生按键消息(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() - 手指离开屏幕后调用。