AndEngine onArea即使手指没有移动也会打电话

时间:2013-10-06 10:05:23

标签: android andengine ontouchevent

@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方法。 我想在触摸控件时触发播放器拍摄内容。

但是,使用此方法时,onAreaTouched方法仅在我第一次触摸或移动手指时被调用。因此,如果我让手指在控件上保持不动,if(isOnActionButton = true)事件将不会被触发。

是否可以添加一些方法来使方法在我的手指不移动时被调用?

我的目标是让玩家在按下控件时一直拍摄。

提前致谢!

2 个答案:

答案 0 :(得分:0)

也许你可以使用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();
}

我希望能帮到你!

对不起我的英语,我正在学习;)

答案 1 :(得分:0)

我这样做是因为我的isShooting课程中有一个布尔Player。我的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方法发送。