草庐IT

java - Andengine:区分 OnAreaTouched 和 OnSceneTouched

coder 2023-12-02 原文

大家好,

在我用AndEngine开发的游戏中,有很多 Sprite 在跑来跑去。现在每个 Sprite 都有一个 TouchArea 注册到场景中,因为当它被触摸时我会显示一些关于 Sprite 的信息。场景本身有一个 OnSceneTouchListener,我用它来移动相机和缩放。

我的问题是,每次用户移动相机(通过在某处触摸显示器并四处移动他的手指)时,任何 Sprite 的 OnAreaTouched() 方法,不小心在手指下,被调用,当运动完成时(手指被抬起)。我已经将触发事件限制为 event.getAction()==UP(在称为 touchAreas 的真正困惑之前)但这还不够。如果用户正在缩放或移动相机,则不应激活 sprite touchAreas。

有什么方法可以区分 OnAreaTouched 事件和 OnSceneTouched 事件?哪个先被调用,我可以抑制另一个吗?

这是我的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() 仍然被调用

这是 Sprite 的典型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 事件时抑制 OnAreaTouch 事件。也许我能以某种方式在 OnSceneTouched()-Method 中捕捉到 event.getAction()==UP

我希望我能把问题解释得足够好让你理解(抱歉,这对我来说不是那么容易:)。非常感谢任何帮助,感谢您的宝贵时间!

问候
克里斯托夫

编辑:

在尝试了 MahdeTo 以某种方式标记事件的建议后,我发现了以下内容:

  • 触发OnSceneTouchEvent() 方法的TouchEvent 与触发OnAreaTouched() 方法的不同。
  • OnAreaTouched()OnSceneTouchEvent()
  • 晚 20 毫秒被调用
  • 调用 OnAreaTouched() 的事件实际上是在用户将手指放在显示屏上时开始的(然后他四处移动手指并且 OnSceneTouchEvent() 被多次调用),当他随后抬起手指时,第一个事件停止并得到处理。 (我通过测量时间试了一下)

所以我想出了测量触摸事件持续时间的解决方案。如果事件超过 200 毫秒,我猜用户不想简单地单击,而是移动或缩放(因为这些操作通常需要更长的时间)。所以现在 OnAreaTouched() 方法只会在有人真正想要点击而不是不小心滑过该区域时被调用。

但是这仍然不是一个好的解决方案,如果有人知道更多关于控制此类事件的信息,我将不胜感激。

谢谢

最佳答案

我最近使用触摸控件编写了一个相当复杂的应用程序——按下屏幕上的按钮、捏合缩放、用两根手指旋转和移动对象等等。我最终所做的是迭代改进应用程序并添加控制如何响应不同触摸事件组合的规则。每当出现问题时,我都会记录 TouchEvent 的顺序并添加规则,以便处理不当行为。

您还可以创建阻止 onAreaTouched 执行的 boolean 开关,只需添加一个条件,例如,如果您想要触摸一个对象,请检查 doNotTouchObject 是否为对还是错。

我发现另一个有用的东西是触摸模式切换器。我写了几个方法来完全改变用户触摸屏幕时的行为。我相信您可以随时切换它们,因此应该可以在触摸屏幕时调用 scene.setOnAreaTouchListener(touchListener)

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

我结合使用了上述所有方法,效果相当好,但保持代码整洁至关重要,否则调试或实现新功能将很痛苦。

关于java - Andengine:区分 OnAreaTouched 和 OnSceneTouched,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11138511/

有关java - Andengine:区分 OnAreaTouched 和 OnSceneTouched的更多相关文章

  1. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  2. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  3. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  4. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  5. Observability:从零开始创建 Java 微服务并监控它 (二) - 2

    这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/

  6. 【Java 面试合集】HashMap中为什么引入红黑树,而不是AVL树呢 - 2

    HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候

  7. 【Java入门】使用Java实现文件夹的遍历 - 2

    遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg

  8. java - 为什么 ruby​​ modulo 与 java/other lang 不同? - 2

    我基本上来自Java背景并且努力理解Ruby中的模运算。(5%3)(-5%3)(5%-3)(-5%-3)Java中的上述操作产生,2个-22个-2但在Ruby中,相同的表达式会产生21个-1-2.Ruby在逻辑上有多擅长这个?模块操作在Ruby中是如何实现的?如果将同一个操作定义为一个web服务,两个服务如何匹配逻辑。 最佳答案 在Java中,模运算的结果与被除数的符号相同。在Ruby中,它与除数的符号相同。remainder()在Ruby中与被除数的符号相同。您可能还想引用modulooperation.

  9. java - Ruby 相当于 Java 的 Collections.unmodifiableList 和 Collections.unmodifiableMap - 2

    Java的Collections.unmodifiableList和Collections.unmodifiableMap在Ruby标准API中是否有等价物? 最佳答案 使用freeze应用程序接口(interface):Preventsfurthermodificationstoobj.ARuntimeErrorwillberaisedifmodificationisattempted.Thereisnowaytounfreezeafrozenobject.SeealsoObject#frozen?.Thismethodretur

  10. java - Java 的 StringReader 的 Ruby 等价物是什么? - 2

    在Java中,可以像这样从一个字符串创建一个IO流:Readerr=newStringReader("mytext");我希望能够在Ruby中做同样的事情,这样我就可以获取一个字符串并将其视为一个IO流。 最佳答案 r=StringIO.new("mytext")和here'sthedocumentation. 关于java-Java的StringReader的Ruby等价物是什么?,我们在StackOverflow上找到一个类似的问题: https://st

随机推荐