Andengine:OnAreaTouched和OnSceneTouched之间的目标

时间:2012-06-21 12:47:28

标签: java android andengine game-engine

大家好,

在我用AndEngine开发的游戏中,有很多精灵在跑来跑去。现在每个精灵都有一个 TouchArea 注册到场景,因为我在触摸精灵时会显示一些关于精灵的信息。场景本身有一个 OnSceneTouchListener ,用于移动相机并进行缩放。

我的问题是,每次用户移动相机时(通过触摸显示屏并移动他的手指)任何精灵的 OnAreaTouched() 方法,这是偶然的当手指完成(手指抬起)时,手指被叫。我已经将触发事件限制在event.getAction()==UP(在它被称为touchAreas的真正混乱之前),但这还不够。如果用户正在缩放或移动相机,则不应激活精灵touchAreas。

有什么方法可以区分OnAreaTouched - 事件和OnSceneTouched - 事件吗?哪一个被称为第一个,我可以压制另一个吗?

这是我的OnSceneTouched()方法(简化):

public boolean onSceneTouchEvent(Scene scene, final TouchEvent event) {
    boolean isZooming = event.getMotionEvent().getPointerCount() >= 2;
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        // REMEMBER FIRST TOUCHPOINT, TO KNOW IN WHICH DIRECTION TO MOVE
        this.touchPoint = new Point(event.getMotionEvent().getX(), event.getMotionEvent().getY());  
    } else if (event.getAction() == MotionEvent.ACTION_MOVE) {
        if (isZooming) {
            // DO SOME ZOOM STUFF
        } else {
            // DO SOME MOVEMENT STUFF
        }
        return true;
    }

好的,实际上这不是很有趣 - 但是你可以看到我总是返回true来表示触摸事件已被处理。仍然OnAreaTouched()被称为

这是精灵的典型OnAreaTouched()方法:

public boolean onAreaTouched(final TouchEvent touchEvent, float touchAreaLocalX, float touchAreaLocalY) {
    if (touchEvent.getAction() == TouchEvent.ACTION_UP) {
          // DISPLAY INFORMATION ABOUT THE SPRITE
          return true;
    }
    return false;
}

你知道,没有什么特别之处。所以我希望有人可以帮助我找到解决方法,以便在使用OnAreaTouch - 事件时如何压制OnSceneTouch - 事件。也许我可以以某种方式捕捉event.getAction()==UP中的OnSceneTouched() - 方法?

我希望我能够解释这个问题,以便你理解(对不起,这对我来说并不容易:)。非常感谢任何帮助,谢谢你的时间!

问候
     克里斯托弗

编辑:

在尝试MahdeTo建议以某种方式标记该事件后,我发现了以下内容:

  • 触发TouchEvent方法的OnSceneTouchEvent()与触发OnAreaTouched()方法的方法不同。
  • OnAreaTouched()OnSceneTouchEvent()
  • 晚20毫秒被调用
  • 事件调用OnAreaTouched()实际上是在用户将手指放在显示器上时开始的(而不是他移动它并多次调用OnSceneTouchEvent()),然后当他第一次抬起手指时事件停止并得到处理。 (我通过测量时间试了一下)

所以我想出了一个测量触摸事件持续时间的解决方案。如果事件超过200毫秒,我想用户不想简单地点击,而是移动或缩放(因为这些操作通常需要更长时间)。所以现在OnAreaTouched()方法仅在有人真正想要点击并且不小心刷过该区域时才被调用。

它仍然不是一个好的解决方案,我真的很感激,如果有人知道更多关于控制此类事件。

谢谢

2 个答案:

答案 0 :(得分:4)

我最近使用触摸控件编写了一个相当复杂的应用程序 - 按下屏幕上的按钮,捏缩放,旋转和用两个手指移动物体等。我最终做的是迭代地改进应用程序并添加控制如何响应触摸事件的不同组合的规则。每当出现问题时,我都会记录TouchEvents序列并添加规则,以便处理行为不当的行为。

您还可以创建阻止onAreaTouched执行的布尔开关,只需添加一个条件,例如,如果要触摸对象,检查doNotTouchObject是真还是假。

我觉得有用的另一件事是触摸模式切换器。我写了几个方法,当用户触摸屏幕时,这些方法完全改变了行为。我相信您可以随时随地切换它们,因此在您触摸屏幕时应该可以拨打scene.setOnAreaTouchListener(touchListener)

由于取消/注册触摸区域的速度非常快,因此只需在执行某些操作时取消注册某些触摸区域即可。操作完成后,再次重新注册。

我使用了上述所有内容的组合,但效果相当不错,但保持代码清洁至关重要,否则调试或实现新功能将会很痛苦。

答案 1 :(得分:2)

  1. 也许您可以使用TouchDetector。 使用clickDetector而不是处理TouchUp事件,然后只有精灵处理检测到的点击事件; 使用滚动检测器进行场景滚动;

  2. 启用SceneTouchListenerBinding,TouchAreaBinding还可以通过传递所有意外的正在进行的事件来帮助您。