2013-10-06 2 views
0
@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 для моего экранного управления. Я хочу заставить игрока снимать что-то, когда элемент управления коснулся.AndEngine onAreaTouched call, даже если палец не двигается

Однако, используя этот метод, метод onAreaTouched вызывается только тогда, когда я касаюсь в первый раз или когда я двигаю пальцем. Таким образом, событие if (isOnActionButton = true) не будет срабатывать, если я позволю пальцу оставаться неподвижным на элементе управления.

Можно ли добавить некоторые методы, чтобы вызвать вызов метода, даже когда мой палец не перемещается?

Моя цель - заставить игрока стрелять все время, когда нажимается элемент управления.

Заранее благодарен!

ответ

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(); 
} 

Я надеюсь, что поможет вам!

Извините за мой английский, я учусь;)

+0

Спасибо, хотя я использовал другой подход, я рад, что узнал о TimerHandler. Очень удобно! – augst6

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.

+0

Это абсолютно правильно и полезно! Благодаря! – augst6

Смежные вопросы