【发布时间】:2012-06-23 17:00:14
【问题描述】:
大家好,
在我使用 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;
}
你看,它并没有什么特别之处。所以我希望有人可以在这里帮助我找到一个解决方案,当应该使用OnSceneTouch-event 时,如何抑制OnAreaTouch-event。也许我可以在OnSceneTouched()-Method 中以某种方式捕获event.getAction()==UP?
我希望我能很好地解释这个问题,让你理解(对不起,这对我来说并不容易:)。非常感谢任何帮助,感谢您抽出宝贵时间!
问候
克里斯托夫
编辑:
在尝试了 MahdeTo 的建议以某种方式标记事件后,我发现了以下内容:
- 触发
OnSceneTouchEvent()方法的TouchEvent与触发OnAreaTouched()方法的不一样。 -
OnAreaTouched()比OnSceneTouchEvent()晚 20 毫秒被调用 - 调用
OnAreaTouched()的事件实际上在用户将手指放在显示屏上时开始(然后他移动它并多次调用OnSceneTouchEvent()),然后当他抬起手指时第一个事件停止并获取处理。 (我通过测量时间试了一下)
因此,我想出了测量触摸事件持续时间的解决方案。如果事件超过 200 毫秒,我猜用户不想简单地单击,而是移动或缩放(因为这些操作通常需要更长的时间)。因此,现在OnAreaTouched() 方法仅在有人真正想要单击 并且没有意外滑过该区域时才被调用。
但这仍然不是一个好的解决方案,如果有人知道更多关于控制此类事件的信息,我将不胜感激。
谢谢
【问题讨论】:
-
如何将触摸事件分派给单独的精灵?
-
我并没有真正派遣他们。 thouchAreas(精灵的)在场景中注册,因此只要触摸事件在这些触摸区域中,就会触发。
-
尝试在场景触摸的事件上添加标签,并在继续之前在精灵上检查它。如果它类似于 android 的运动事件,则它们具有多路复用标志,例如边缘标志的值为 1、2、4、8,您可以轻松地将 16 设置为您的,而不会破坏任何其他功能,同时如果它相同,则可以区分正在传递的事件实例。
-
感谢您的提示!正如你告诉我的那样,我将 edgeFlags 设置为 16,但是在 touchArea 方法中记录 edgeFlag 时,它返回 0。所以我猜这是另一个事件。但现在我很困惑。同时触发多少个触摸事件?是不是比我之前处理的运动事件只更新了 10 毫秒?
-
这是个好问题!您可以通过拥有一个静态集合并将事件推送到那里然后调试它并查看有多少来回答它。也许那时我们就可以知道真正发生了什么。
标签: java android andengine game-engine