嗨,大家好,
在我使用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时如何抑制OnSceneTouch
-event的问题。也许我可以以某种方式在event.getAction()==UP
-Method中捕获OnSceneTouched()
?希望我能向您充分解释这个问题(对不起,对我来说不是那么容易:)。非常感谢您的帮助,感谢您的宝贵时间!
问候
克里斯多夫
编辑:
在尝试了MahdeTo建议标记事件的建议后,我发现了以下内容:
TouchEvent
方法的OnSceneTouchEvent()
与触发OnAreaTouched()
方法的OnAreaTouched()
比OnSceneTouchEvent()
迟20毫秒被调用OnAreaTouched()
被多次调用),调用OnSceneTouchEvent()
的事件实际上开始,然后当用户抬起手指时,第一个事件停止并得到处理。 (我通过测量时间进行了尝试)因此,我想出了一种解决方案来衡量触摸事件持续了多长时间。如果事件的时间超过200毫秒,我想用户不希望简单地单击而是移动或缩放(因为这些操作通常需要更长的时间)。因此,现在仅当某人确实有意点击而不是意外滑过该区域时才调用
OnAreaTouched()
方法。但仍然不是一个好的解决方案,如果有人对控制此类事件了解更多,我将不胜感激。
谢谢
最佳答案
最近,我使用触摸控件编写了一个相当复杂的应用程序-按下屏幕上的按钮,缩放,用两根手指或更多手指旋转和移动对象。我最终要做的是迭代地改进应用程序并添加规则来控制如何响应触摸事件的不同组合。每当出现问题时,我都会记录TouchEvent的顺序并添加规则,以便处理行为异常的行为。
您还可以创建阻止onAreaTouched
执行的布尔开关,只需添加一个条件即可,例如,如果您想触摸一个对象,请检查doNotTouchObject
是true还是false。
我发现有用的另一件事是触摸模式切换器。我编写了几种方法来完全改变用户触摸屏幕时的行为。我相信您可以随时随地切换它们,因此在触摸屏幕时应该可以调用scene.setOnAreaTouchListener(touchListener)
。
由于取消/注册触摸区域的速度很快,因此可以在执行某些操作时简单地取消注册某些触摸区域。操作完成后,请重新注册它们。
我结合了以上所有内容,并且效果很好,但是保持代码干净至关重要,否则调试或实现新功能将很痛苦。