Gam*_*ids 6 java android game-engine andengine
在我用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;
}
Run Code Online (Sandbox Code Playgroud)
好吧,实际上这不是很有趣 - 但正如你所看到的,我总是回来 true发出触摸事件被处理的信号.OnAreaTouched()得到的还是被称为
OnAreaTouched()sprite 的典型方法: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;
}
Run Code Online (Sandbox Code Playgroud)
你看,没有什么特别之处.所以我希望有人可以帮我在这里找到一个解决方案,如何在使用OnAreaTouch-event时抑制-event OnSceneTouch.也许我能以某种方式捕捉到event.getAction()==UP的OnSceneTouched()-方法?
我希望我能够解释这个问题,以便你理解(对不起,这对我来说并不容易:).非常感谢任何帮助,谢谢你的时间!
对于
克里斯托弗
在尝试MahdeTo的建议以某种方式标记事件后,我发现了以下内容:
TouchEvent触发OnSceneTouchEvent()的方法是不一样的一个触发的OnAreaTouched()方法.OnAreaTouched() 比之后20毫秒被调用 OnSceneTouchEvent()OnAreaTouched()实际上,当用户将手指放在显示器上时(而不是他将手指向下移动并且OnSceneTouchEvent()被多次调用),事件调用开始,当他然后抬起手指时,第一个事件停止并被处理.(我通过测量时间来试试)所以我想出了一个测量触摸事件持续时间的解决方案.如果事件超过200毫秒,我想用户不想简单地点击,而是移动或缩放(因为这些操作通常需要更长时间).因此,现在OnAreaTouched()只有在有人真正想要点击并且不小心刷过该区域时才会调用该方法.
但它仍然不是一个好的解决方案,我真的很感激,如果有人知道更多关于控制此类事件.
谢谢
我最近使用触摸控制编写了一个相当复杂的应用程序 - 按屏幕上的按钮、捏缩放、用两根手指旋转和移动对象等等。我最终所做的是迭代改进应用程序并添加控制如何响应不同触摸事件组合的规则。每当出现问题时,我都会记录 TouchEvents 的顺序并添加规则,以便处理错误的操作。
您还可以创建布尔开关来阻止onAreaTouched执行,只需添加一个条件,例如,如果您想触摸某个对象,请检查是doNotTouchObjecttrue 还是 false。
我发现另一个有用的东西是触摸模式切换器。我编写了几种方法来完全改变用户触摸屏幕时的行为。我相信您可以随时随地切换它们,因此应该可以scene.setOnAreaTouchListener(touchListener)在触摸屏幕时拨打电话。
由于取消/注册触摸区域的速度非常快,因此可以在执行某些操作时简单地取消注册某些触摸区域。操作完成后,再次重新注册。
我使用了上述所有方法的组合,效果相当好,但保持代码整洁至关重要,否则调试或实现新功能将很痛苦。
| 归档时间: |
|
| 查看次数: |
4815 次 |
| 最近记录: |