@Override
public boolean onAreaTouched(TouchEvent pSceneTouchEvent, float pTouchAreaLocalX, float pTouchAreaLocalY) {
Log.d("GameScene", "Action Area Touched " + pTouchAreaLocalX + "," + pTouchAreaLocalY);
float x = pSceneTouchEvent.getX();
float y = pSceneTouchEvent.getY();
if(pSceneTouchEvent.isActionDown()) {
actionDistance = (float) Math.sqrt((x-ACTION_POSITION_X)*(x-ACTION_POSITION_X)+(y-ACTION_POSITION_Y)*(y-ACTION_POSITION_Y));
isOnActionButton = true;
actionKnob.setPosition(x, y);
} else if(pSceneTouchEvent.isActionMove()) {
actionDistance = (float) Math.sqrt((x-ACTION_POSITION_X)*(x-ACTION_POSITION_X)+(y-ACTION_POSITION_Y)*(y-ACTION_POSITION_Y));
if(actionDistance > actionBase.getWidth()/2) {
actionKnob.setPosition(((actionBase.getWidth()/2)*x + (actionDistance - (actionBase.getWidth()/2))*ACTION_POSITION_X)/actionDistance, ((actionBase.getWidth()/2)*y + (actionDistance - (actionBase.getWidth()/2))*ACTION_POSITION_Y)/actionDistance);
} else {
actionKnob.setPosition(x, y);
}
} else if(pSceneTouchEvent.isActionUp()) {
actionKnob.setPosition(ACTION_POSITION_X, ACTION_POSITION_Y);
isOnActionButton = false;
}
if(isOnActionButton = true) {
double l = Math.sqrt((actionKnob.getX() - ACTION_POSITION_X)*(actionKnob.getX() - ACTION_POSITION_X) + (actionKnob.getY() - ACTION_POSITION_Y)*(actionKnob.getY() - ACTION_POSITION_Y));
double r = actionBase.getWidth()/2;
double deltaX = actionKnob.getX() - ACTION_POSITION_X;
double deltaY = actionKnob.getY() - ACTION_POSITION_Y;
player.shoot((float) (((deltaX*(r-l))/l) + deltaX), (float) (((deltaY*(r-l))/l) + deltaY), vbom, camera, physicsWorld);
}
return true;
}
这是我的屏幕控制方法。我想触发播放器在触摸控件时射击某些内容。
但是,使用此方法,onAreaTouched 方法仅在我第一次触摸或移动手指时被调用。因此,如果我让我的手指在控件上保持不动,则不会触发 if(isOnActionButton = true) 事件。
是否可以添加一些方法以使即使我的手指不移动也能调用该方法?
我的目标是让玩家在按下控制时一直射击。
提前感谢!
也许你可以使用TimerHandler。
将此代码放入场景构造函数中
tHandle = new TimerHandler(SHOT_FREQUENCY, true, new ITimerCallback() {
@Override
public void onTimePassed(final TimerHandler pTimerHandler) {
if (isOnActionButton)
doShot();
}
});
this.registerUpdateHandler(tHandle);
该计时器将以SHOT_FREQUENCY间隔在场景中运行。您需要创建一个常量,其中包含拍摄之间的所需时间。
如果你触摸屏幕,把它放在你的课堂上,以便拍摄:
public void doShot(){
shot();
}
希望对您有所帮助!
对不起我的英语,我正在学习;)
我这样做的方式是我在Player
类中有一个布尔isShooting
。我GameScene
我有:
this.registerUpdateHandler( new IUpdateHandler() {
@Override
public void reset() {
// TODO Auto-generated method stub
}
@Override
public void onUpdate( float pSecondsElapsed ) {
player.update( pSecondsElapsed );
}
} );
在我的Player
课上,我有:
public void update( float pSecondsElapsed ) {
if(isShooting){
this.shoot();
}
}
现在只需通过以下方式在onAreaTouched
方法中设置布尔值:
player.isShooting = true;
或
player.setIsShooting(true);
如果你不想在Player
类中做拍摄工作,你可以创建一个方法来提前发送数据,所以当调用Player.update
时,你可以只引用你在onAreaTouched
方法中发送的变量。