我会解释如何使用触摸监听
·首先,应当实现IOnSceneTouchListener接口
·然后检查事件动作。
@Override
publicbooleanonSceneTouchEvent(ScenepScene,finalTouchEventpSceneTouchEvent)
{
if(pSceneTouchEvent.isActionDown())
{
//executeaction.
}
returnfalse;
}
最后,注册到场景:
scene.setOnSceneTouchListener(this);
在大多数游戏中,你都要控制某个对象。所以控制器显得有必要。在这个例子中,我会展示如何创建左/右按钮(控制主角左/右移动)
1.创建按钮
本例使用矩形实体(RectangleEntity)简单明了。当然你可以使用任何其他实体如Sprite或AnimatedSprite。
按钮会被关联到HUD
privatevoidcreateControllers()
{
HUDyourHud=newHUD();
finalRectangleleft=newRectangle(20,200,60,60,vbo)
{
publicbooleanonAreaTouched(TouchEventtouchEvent,floatX,floatY)
{
if(touchEvent.isActionUp())
{
//moveplayerleft
}
returntrue;
};
};
finalRectangleright=newRectangle(100,200,60,60,vbo)
{
publicbooleanonAreaTouched(TouchEventtouchEvent,floatX,floatY)
{
if(touchEvent.isActionUp())
{
//moveplayerright
}
returntrue;
};
};
//可见,实际接受触摸事件消息的是场景!
yourHud.registerTouchArea(left);
yourHud.registerTouchArea(right);
yourHud.attachChild(left);
yourHud.attachChild(right);
camera.setHUD(yourHud);
}
首先,创建一个HUD,然后,两个矩形,重写矩形实体的onAreaTouched以便能处理事件,在场景中注册响应区域,最后把实体加到场景中。别忘了调用Camera的setHUD。
在开发应用时候,处理按键消息也很重要。有几个要记住,这是我的观点:
(注:这个属于AndroidFramework层)
1.重写方法:
首先,应该重写onKeyDown方法,该方法会捕获电话的回退键。
@Override
publicbooleanonKeyDown(intkeyCode,KeyEventevent)
{
if(keyCode==KeyEvent.KEYCODE_BACK)
{
//performyouractons.
}
returnfalse;
}
2.处理不同的按键
显然,会有很多不同的按键消息,重要的有:
·KeyEvent.KEYCODE_HOME
·KeyEvent.KEYCODE_BACK
·KeyEvent.KEYCODE_MENU
值得一提的是,在有些设备上,没有特定的键,像我的平板就没有Menu键。
3.仔细思考
我强烈不建议重写系统的HOME/BACK键,因为需要返回前一个APP,另一个重要因素是:在GooglePlayStore团队为应用排位时也会考虑这个因素。(注:不太了解)
本文讲述如何简单,快速,正确捕获连续触屏事件。
假如有一个精灵,需要连续地执行某一动作(如,在X轴上给玩家力来作移动),这里,我使用矩形实体。
1.可能的解法
有两个办法,分别介绍:
finalRectanglebutton=newRectangle(0,0,100,100,vbo)
{
@Override
publicbooleanonAreaTouched(TouchEventpSceneTouchEvent,floatpTouchAreaLocalX,floatpTouchAreaLocalY)
{
if(pSceneTouchEvent.isActionMove())
{
//Handleyouractionhere
}
returntrue;
}
};
如上,重写onAreaTouched方法并捕获isActionMove。这是个好办法,因为你手指按下时随着手指移动,即使是一,两个像素也会获得连续的移动事件,但并不完美。所以有更好的解法:
//ourflag
privatebooleanisTouchedFlag=false;
//ourbutton
finalRectanglebutton=newRectangle(0,0,100,100,vbo)
{
@Override
publicbooleanonAreaTouched(TouchEventpSceneTouchEvent,floatpTouchAreaLocalX,floatpTouchAreaLocalY)
{
if(pSceneTouchEvent.isActionDown())
{
isTouchedFlag=true;
}
if(pSceneTouchEvent.isActionUp())
{
isTouchedFlag=false;
}
returntrue;
}
@Override
protectedvoidonManagedUpdate(floatpSecondsElapsed)
{
if(isTouchedFlag)
{
//Executeyouractions.
}
super.onManagedUpdate(pSecondsElapsed);
}
};
这个办法使用了Updatehandler总是有效,因为:
·首先,声明一个布尔标志来存储按钮状态。
·使用Rectangle声明一个按钮。
·重写onAreaTouched方法捕获事件.
·如果是isActionDown按下,设置标志为True(触屏开始)
·如果是isActionUp抬起设置标志为false(释放)
·这次我们重写onManageUpdate检查标志是否为True,如果是则在循环中执行我们的要做的事。
按着不放这个事件很容易实现,因为AE已经内置这个功能了
长时点击在界面中很有用,下面代码展示如何在场景中实现这个功能:
·首先,必须实现IHoldDetectorListener接口,重写下面三个未实现的方法:
@Override
publicvoidonHoldStarted(HoldDetectorpHoldDetector,intpPointerID,floatpHoldX,floatpHoldY)
{
}
@Override
publicvoidonHold(HoldDetectorpHoldDetector,longpHoldTimeMilliseconds,intpPointerID,floatpHoldX,floatpHoldY)
{
}
@Override
publicvoidonHoldFinished(HoldDetectorpHoldDetector,longpHoldTimeMilliseconds,intpPointerID,floatpHoldX,floatpHoldY)
{
}
·声明一个ContinousHoldDetector对象
privateContinuousHoldDetectorcontinuousHoldDetector;
·初始化它,并注册到场景。注意,这里使用默认的构造函数,如果要自定义一些参数,你也可以使用带参数的构造函数。
continuousHoldDetector=newContinuousHoldDetector(this);
yourScene.registerUpdateHandler(continuousHoldDetector);
·完成后,你就可以在IHoldDetectorListener接口的实现函数里执行自己的代码了
·onHoldStarted()-手指按住一段时间后调用。
·onHoldFinished()-手指离开屏幕后调用。