【问题标题】:AndEngine onAreaTouched call even when the finger is not movingAndEngine onAreaTouched 调用即使手指不动
【发布时间】:2013-10-06 10:05:23
【问题描述】:
@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 方法。 我想在触摸控件时触发 Player 射击。

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

是否可以添加一些方法以使该方法即使在我的手指不动时也能被调用?

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

提前致谢!

【问题讨论】:

    标签: android andengine touch-event


    【解决方案1】:

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

    希望对你有帮助!

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

    【讨论】:

    • 谢谢,虽然我使用了另一种方法,但我很高兴我了解了 TimerHandler。非常方便!
    【解决方案2】:

    我这样做的方式是在 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 被调用时,您可以引用您在@ 中发送的变量987654332@方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多