Как управлять несколькими событиями в одном методе - PullRequest
1 голос
/ 27 марта 2012

(Вероятно, это больше вопрос по Java в целом, чем вопрос по AndEngine, но я добавил оба тега, чтобы быть в безопасности)

В AndEngine сенсорные события отлавливаются путем реализации IOnSceneTouchListener и последующего добавления этого метода:

@Override
public boolean onSceneTouchEvent(Scene scene, TouchEvent event) {
   ...
}

В этом методе можно проверять события, проверяя event.isActionUp() (пользователь коснулся экрана), event.isActionDown() (пользователь отпустил экран) и event.isActionMove() (пользователь перемещает касание).

В настоящее время я делаю игру, в которой мне нужно отличаться от особых случаев, таких как if (isActionDown() && isActionMove()), if (userHasMoved && isActionUp() и от конкретных.

Мой текущий код работает, но не очень красивый. Отрывок из этого:

if ( (!hubIsClicked) && (!touchMoveIsDone) && event.isActionDown()) {
  System.out.println("isActionDown, puzzlepiece");
  touchMoveIsDone = false;
  touchedBoardBlock = getBoardBlockFromPixelCoordinate(X, Y);
} else if ( (!hubIsClicked) && (!touchMoveIsDone) && event.isActionMove()) {
  // Puzzle piece
  System.out.println("isActionMove, puzzlepiece");
  ..
}

Здесь boolean hubIsClicked и boolean touchMoveIsDone - глобальные переменные класса. Я не думаю, что это хороший способ пометить отдельные случаи, но это единственный известный мне способ, поскольку мой Java-фу недостаточно высок.

Вопрос: Я спрашиваю, как сделать эти проверки лучше, возможно, вообще не используя глобальные переменные. Есть ли «настоящий способ Java» сделать это?

1 Ответ

2 голосов
/ 27 марта 2012

Для начала некоторые из ваших условий являются общими, поэтому вы можете поделиться этой частью кода, например,

if ( !hubIsClicked && !touchMoveIsDone)
{
  if (event.isActionDown())
  {  
    System.out.println("isActionDown, puzzlepiece");
    touchMoveIsDone = false;
    touchedBoardBlock = getBoardBlockFromPixelCoordinate(X, Y);
  }
  else if (event.isActionMove())
  {
    // Puzzle piece
    System.out.println("isActionMove, puzzlepiece");
    ..
  }
}

Затем вы говорите о глобальных переменных, но не показываете их.Будьте осторожны, что вы имеете в виду;в Java существуют статические переменные, которые существуют для всех экземпляров класса, а затем переменные экземпляра для каждого экземпляра.Я взял то, что вы сказали, что означает статическое.В вашем случае вы правы в том, что использование статических переменных здесь, как правило, некорректно и может быть улучшено.

Обычно вы не ожидаете, что слушатель сам поддержит состояние;то есть, если бы вы написали реализацию слушателя в отдельном классе, у нее не было бы никаких переменных класса или экземпляра.Несмотря на то, что по своей природе он может быть полезен, слушатель должен принадлежать кому-то, например, деятельности, и для этого владельца разумно поддерживать состояние, а слушатель должен его использовать.

Я показал это ниже в качестве примера:

public class MyActivity extends BaseGameActivity implements IOnSceneTouchListener
{  
    private boolean hubIsClicked = false;

    private boolean touchMoveIsDone = false;

    public MyActivity( ... )
    {
        //blah
    }

    @Override  
    public boolean onSceneTouchEvent(Scene pScene, TouchEvent pSceneTouchEvent)  
    {  
       // Do something on scene touched event  
       return false;  
    } 
}

Переменные принадлежат экземпляру действия, и, как и код слушателя, он может использовать их.

Вы должны всегдапомните о продолжительности жизни владельца и отношениях между ним и информацией, которую вы хотите хранить;например, действия уничтожаются, когда пользовательский интерфейс исчезает, но вам, вероятно, не нужно больше удерживать это состояние.

Обратите внимание, что вы можете делать то же самое, если ваш слушатель скорее является внутренним классомчем включены с помощью «орудия», то есть:

public class MyActivity extends BaseGameActivity
{  
    private boolean hubIsClicked = false;

    private boolean touchMoveIsDone = false;

    public MyActivity( ... )
    {
       //example only
       addMyExampleListener( new IOnSceneTouchListener()
       {
          @Override  
          public void onSceneTouchEvent(Scene pScene, TouchEvent pSceneTouchEvent)  
          {  
             //example only
             MyActivity.this.hubIsClicked = true;
          } 
       });
    }
}

Надеюсь, что помогает!

...