【问题标题】:Android Java - Tracking Multiple Touch Objects/Events?Android Java - 跟踪多个触摸对象/事件?
【发布时间】:2012-04-06 04:18:22
【问题描述】:

我是一名经验丰富的 C++/C# 程序员,正在尝试进入 android 游戏设计世界。 在 Eclipse 中使用 Java。

关于如何通过跟踪整个屏幕上的触摸来移动单个对象的教程有很多,但是我如何在屏幕上随机跟踪许多单个对象上的触摸事件?

对于初学者,我想编写一个可以多次实例化并保存在数组列表中的类。每个都被绘制到全屏 SurfaceView 上的随机位置。简单的东西到目前为止... 但是对于我的生活,我不知道如何拖动这些物体!

我有一个使用自定义视图(扩展 SurfaceView)的活动。实例化一个处理游戏板屏幕绘制的 GameBoard 类。 GameBoard 类还包含/绘制一个游戏字符的 ArrayList,可以在屏幕上很好地绘制,但需要触摸控制。

我无能为力,有什么帮助吗?

【问题讨论】:

    标签: java android eclipse


    【解决方案1】:

    我编写了一个自上而下的射击游戏 (Akari),它不会拖动物体,而是使用它们的位置来检测碰撞。

    在我的 SurfaceView 中,我调用了 Thread.touchEventType(x, y)。线程遍历对象(在您的情况下为数组),并检查它们是否匹配。在匹配的情况下,它会返回一个与对象关联的值,并且在 MotionEvent.ACTION_UP 之前的所有 MotionEvent.ACTION_MOVEMENT 动作都在该对象上完成。

    希望这会有所帮助。如果您需要任何示例代码,请告诉我。

    【讨论】:

    • Hrmm,迭代所有“可触摸”对象以检查碰撞(或任何事件)似乎效率低下......但这似乎是它在 android 世界中完成的方式。
    • 环顾四周,这似乎就是这样做的方法。如果不需要精确的精度,我强烈建议使用 Android 的 Rect 类进行检测。
    【解决方案2】:

    我遇到了和你一样的问题。 我的解决方案有点不同。我正在尝试编写一个backammon游戏。我有 30 个对象要放置在屏幕上并四处移动。当然,其中一些重叠。所以我的问题是我触摸了一个对象并最终移动了另一个对象(据我所知,这是一个在我触摸的对象之后放置在屏幕上的对象,并且在我触摸的对象的左侧)。

    无论如何,我所做的是创建一个自定义对象来扩展视图并将其放置在 GestureOverlayView 上。我覆盖了 onTouchEvent(),它看起来像这样:

    public boolean onTouchEvent(MotionEvent event) {
        int x = (int) event.getRawX();
        int y = (int) event.getRawY();
    
        int action = event.getAction();
        switch (action) {
            case MotionEvent.ACTION_DOWN:
                if (Math.abs(x - this.getX()) < BackgroundView.slotSize && Math.abs(y - this.getY()) < BackgroundView.slotSize) {
                    //do whatever I want
                    return true;
                } else {
                    return false;
                }
                //break;
            case MotionEvent.ACTION_MOVE:
                //this is the dragging part
                this.setX(x - size/2);
                this.setY(y - size/2);
                break;
            case MotionEvent.ACTION_
                break;
            case MotionEvent.ACTION_CANCEL:
                break;
            case MotionEvent.ACTION_OUTSIDE:
                break;
            default:
        }
        return true;
    }
    

    根据我的阅读,当我返回 false 时,该操作不会被消耗,因此另一个对象可以做到这一点。所以基本上,没有对象会消耗它,直到一个对象通过返回 true 来消耗它。

    我仍然认为自己是新手,我认为有更好的方法可以做到这一点,但它对我来说效果很好。希望能帮助到你。你或其他人。 我愿意接受新的建议。

    【讨论】:

      猜你喜欢
      • 2013-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-12
      • 1970-01-01
      • 2010-10-29
      相关资源
      最近更新 更多