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

标签 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() 和特定的。

我当前的代码可以工作,但不是很漂亮。 fragment :

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 方式”来执行此操作?

最佳答案

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

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 中,类的所有实例都存在静态变量,然后是每个实例的实例变量。我把你说的意思理解为静态的。在您的情况下,您是正确的,这里使用静态变量通常是不正确的,并且可以改进。

您通常不会期望监听器本身保持状态;也就是说,如果您在单独的类中编写监听器实现,它将没有任何类或实例变量。无论本质上是有用的,听众必须属于某人,例如一个 Activity ,并且这个所有者维护状态和监听器使用它是合理的。

我在下面举例说明了这一点:

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

变量属于 Activity 的实例,监听器代码也可以使用它们。

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

请注意,如果您的监听器是一个内部类而不是使用“实现”合并,您可以做很多相同的事情,即:

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

希望对您有所帮助!

关于java - 如何在一个方法中管理多个事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9885138/

相关文章:

java - 在更改之前更改按钮的背景颜色

java - 机构未创建正确的引擎

java - 测试|从可运行 jar 内的 main 方法调用 testng.xml 文件

java - 使用归约法求中位数

java - 为什么java中2^0返回2

android - 如何在输入 View AlertDialog中添加setText

android - Android 和 IOS 是否支持亚美尼亚语和索马里语/语言环境?

android - Andengine - 使用 TexturePacker Spritesheet 时内存使用量增加

java - 删除 Box2D 实体会导致 AndEngine 崩溃

java - 将 Content-ID 添加到多部分实体