如何在单个方法中管理多个事件

时间:2012-03-27 07:32:56

标签: java android andengine

(这可能更像是一个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 hubIsClickedboolean touchMoveIsDone是全局类变量。我不认为这是标记不同情况的好方法,但这是我所知道的唯一方法,因为我的Java-fu不够高。

问题:我正在询问如何更好地进行这些检查,或许根本不使用全局变量。是否有“真正的Java方式”来做到这一点?

1 个答案:

答案 0 :(得分:2)

首先,您的一些条件很常见,因此您可以共享该部分代码,例如

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

变量属于活动的实例,而且听众代码也是如此,它可以使用它们。

你应该始终牢记所有者的生命周期,以及它与你想要持有的信息之间的关系;例如,当UI消失时,活动会被销毁,但您可能不再需要保持此状态。

请注意,如果您的侦听器是内部类而不是使用“implements”,那么您可以做同样的事情,即:

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

希望有所帮助!