Java 和发动机:在再次触碰和再次触碰之间分离 大家好,,
在我用安德林开发的游戏中,有很多精灵在四处奔跑。现在,每个精灵都有一个注册到场景中的Java 和发动机:在再次触碰和再次触碰之间分离 大家好,,,java,android,andengine,game-engine,Java,Android,Andengine,Game Engine,在我用安德林开发的游戏中,有很多精灵在四处奔跑。现在,每个精灵都有一个注册到场景中的触摸区域,因为我会在触摸精灵时显示有关该精灵的一些信息。场景本身有一个OnSceneTouchListener,我用它来移动相机并进行缩放 我的问题是,每次用户移动相机(通过触摸显示屏的某个位置并移动手指)时,任何精灵的onreatouched()方法都会在移动完成(手指抬起)时被调用,该方法意外位于手指下方。我已经将触发事件限制为event.getAction()==UP(在它被称为触摸区之前),但这还不够。如
触摸区域
,因为我会在触摸精灵时显示有关该精灵的一些信息。场景本身有一个OnSceneTouchListener
,我用它来移动相机并进行缩放
我的问题是,每次用户移动相机(通过触摸显示屏的某个位置并移动手指)时,任何精灵的onreatouched()
方法都会在移动完成(手指抬起)时被调用,该方法意外位于手指下方。我已经将触发事件限制为event.getAction()==UP
(在它被称为触摸区之前),但这还不够。如果用户正在缩放或移动相机,则不应激活精灵触摸区域
是否有任何方法可以区分重新触摸的事件和已触摸的事件?哪一个是第一个,我可以抑制另一个吗
这是我的OnSceneTouched()
方法(简化):
好的,实际上这不是很有趣-但是正如你所看到的,我总是返回true
来表示触摸事件已经处理。仍然会调用onreatouched()
这是精灵的典型OnAreaTouched()
方法:
你看,没有什么特别的。因此,我希望有人能在这里帮助我找到一个解决方案,在应该使用OnSceneTouch
-事件时,如何抑制onreatouch
-事件。也许我可以在OnSceneTouched()
-方法中捕获事件.getAction()==UP
我希望我能很好地解释这个问题,让你理解(对不起,对我来说没那么容易:)。非常感谢您的帮助,谢谢您抽出时间
问候
克里斯托夫
编辑:
在尝试了MahdeTo关于以某种方式标记活动的建议后,我发现了以下几点:
- 触发
OnSceneTouchEvent()
方法的TouchEvent
与触发onreatouched()
方法的不同
onreatouched()
比OnSceneTouchEvent()晚20毫秒调用
- 调用onreatouched()
的事件实际上是在用户将手指放在显示器上时开始的(然后他将其移动,并多次调用OnSceneTouchEvent()
),当他抬起手指时,第一个事件停止并得到处理。(我通过测量时间来尝试)
所以我想出了一个解决办法来测量一个触摸事件持续了多长时间。如果事件长度超过200毫秒,我猜用户不希望简单地单击,而是希望移动或缩放(因为这些操作通常需要更长的时间)。因此,现在只有当有人真正想要单击而不是无意中扫过该区域时,才会调用OnAreaTouched()
方法
但是这仍然不是一个好的解决方案,如果有人知道更多关于控制此类事件的信息,我将不胜感激
谢谢你我最近编写了一个使用触摸控制的相当复杂的应用程序——按下屏幕上的按钮、收缩缩放、用两个手指旋转和移动对象等等。我最终做的是迭代地改进应用程序,并添加控制如何响应不同触摸事件组合的规则。每当出现问题时,我都会记录TouchEvents的顺序并添加规则,以便处理行为不端的行为
您还可以创建布尔开关,以防止执行重新触摸的
,只需添加一个条件,例如,如果您想要触摸一个对象,就可以检查doNotTouchObject
是否为真
我发现另一个有用的东西是触摸模式开关。我写了几个方法,完全改变了用户触摸屏幕时的行为。我相信您可以在移动中切换它们,因此应该可以在触摸屏幕时调用scene.setOnAreaTouchListener(touchListener)
由于取消/注册触摸区域的速度非常快,因此可以在执行某些操作时取消注册某些触摸区域。操作完成后,请重新注册
我使用了上述所有功能的组合,效果相当不错,但保持代码整洁是必不可少的,否则调试或实现新功能将是一件痛苦的事情
如何将触摸事件发送到单独的精灵?我并不是真的发送它们。(精灵的)touchareas在场景中注册,因此每当touchevent位于这些touchareas中的任何一个时都会触发。请尝试在场景touch上的事件上添加标记,并在精灵上检查标记,然后继续。如果它类似于android的运动事件,它们具有多路复用的标志,例如边缘标志的值为1、2、4、8,您可以轻松地将16设置为您的值,而不破坏任何其他功能,同时如果传递的是相同的事件实例,则可以获得您的差异。谢谢您的提示!正如您告诉我的,我将edgeFlags设置为16,但是在touchArea方法中记录edgeFlag时,它返回0。所以我想这是另一件事。但是现在我很困惑。同时触发多少个触摸事件?这可能是一个仅仅是
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;
}
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;
}