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

Java 如何在一个方法中管理多个事件,java,android,andengine,Java,Android,Andengine,(一般来说,这可能更像是一个Java问题,而不是特定于AndEngine的问题,但为了安全起见,我添加了两个标记) 在AndEngine中,通过实现IOnSceneTouchListener然后添加以下方法捕获触摸事件: @Override public boolean onSceneTouchEvent(Scene scene, TouchEvent event) { ... } 在该方法中,可以通过测试event.isActionUp()(用户已触摸屏幕)、event.isActio

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


问题:我想问的是如何更好地进行这些检查,也许根本不使用全局变量。有没有“真正的Java方法”可以做到这一点?

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

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中,类的所有实例都存在静态变量,然后是每个实例的实例变量。我认为您所说的是静态变量。在您的例子中,静态变量的使用通常是不正确的t并且可以改进

通常情况下,您不会期望侦听器本身维护状态;也就是说,如果您在单独的类中编写侦听器实现,它将不会有任何类或实例变量。然而,为了使用,侦听器必须属于某个人,例如某个活动,并且该所有者维护状态和侦听是合理的呃用它

我以下面的例子说明:

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消失时,活动会被破坏,但您可能不需要再保持这种状态

请注意,如果您的侦听器是一个内部类,而不是使用“实现”合并,则您可以执行大致相同的操作,即:

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

希望这会有所帮助!

若要建议您改进,有必要了解
hubIsClicked
touchMoveIsDone
全局字段的用途以及它们的使用位置。另一方面,共享公共条件会创建可读性和可维护性较差的嵌套代码。如果您想更改或调试您,祝您好运几个月后的r游戏逻辑。在我上一次千里迢迢回到地狱之后,我只是重新格式化了代码,以便所有条件在列中以正确的顺序完美地对齐。这是我自己的小日本摇滚花园:-)非常正确-我想这是一个基于底层逻辑和结果代码更改可能性的逐案值判断。