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)

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

我使用了上述所有功能的组合,效果相当不错,但保持代码整洁是必不可少的,否则调试或实现新功能将是一件痛苦的事情

  • 也许你可以用触控检测器。 使用clickDetector而不是process TouchUp事件,则精灵只处理检测到的click事件; 使用滚动检测器进行场景滚动

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


  • 如何将触摸事件发送到单独的精灵?我并不是真的发送它们。(精灵的)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;
    }