6

嗨,大家好,

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

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

有什么方法可以区分OnAreaTouched-event 和OnSceneTouched-event 吗?首先调用哪个,我可以压制另一个吗?

这是我的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-event 时抑制 -event 。OnSceneTouch也许我能以某种方式捕捉event.getAction()==UPOnSceneTouched()-Method??

我希望我能很好地解释这个问题,让你理解(对不起,这对我来说并不容易:)。非常感谢您的帮助,感谢您的宝贵时间!

问候
克里斯托夫

编辑:

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

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

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

但这仍然不是一个好的解决方案,如果有人知道更多关于控制此类事件的信息,我将不胜感激。

谢谢你

4

2 回答 2

4

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

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

我发现另一件有用的东西是触摸模式切换器。我写了几个方法来完全改变用户触摸屏幕时的行为。我相信您可以在旅途中切换它们,因此您应该可以scene.setOnAreaTouchListener(touchListener)在触摸屏幕时拨打电话。

由于取消/注册触摸区域的速度非常快,因此可以在执行某些操作时简单地取消注册某些触摸区域。操作完成后,重新注册它们。

我使用了以上所有方法的组合,效果很好,但保持代码干净是必不可少的,否则调试或实现新功能将是一件痛苦的事情。

于 2012-06-28T12:01:46.843 回答
2
  1. 也许你可以使用 TouchDetector。使用 clickDetector 代替处理 TouchUp 事件,则精灵只处理检测到的点击事件;也将滚动检测器用于场景滚动;

  2. 启用 SceneTouchListenerBinding 和 TouchAreaBinding 还将帮助您绕过所有意外的进行中事件。

于 2012-07-02T07:14:43.410 回答