9

我使用一个组来存储一些图像并将它们绘制到 SpriteBatch。现在我想检测点击了哪个图片。出于这个原因,我向 Group 添加了一个 InputListener 以获取触地事件。传入的 InputEvent 有一个方法 ( getTarget ),它返回对单击的 Actor 的引用。

如果我点击一个 Actor 的透明区域,我想忽略传入的事件。如果它背后有一个演员,我想用它来代替。我想过这样的事情:

    myGroup.addListener(new InputListener() {
        @Override
        public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
            Actor targetActor = event.getTarget();
            // is the touched pixel transparent: return false
            // else: use targetActor to handle the event and return true
        };
    });

这是正确的方法吗?我认为为touchDown方法返回 false将继续传播该事件,并让我也接收同一位置的其他 Actors 的 touchDown 事件。但这似乎是个误会……

更新

PTs answer解决了获取正确事件的问题。现在我遇到了检测命中像素是否透明的问题。在我看来,我需要将图像作为像素图来访问。但我不知道如何将图像转换为像素图。我还想知道这在性能和内存使用方面是否是一个很好的解决方案..

4

1 回答 1

6

我认为您想覆盖该Actor.hit()方法。请参阅scene2d 命中检测 wiki

为此,请 subclassImage并将您的hit专业化放在那里。就像是:

public Actor hit(float x, float y, boolean touchable) {
  Actor result = super.hit(x, y, touchable);
  if (result != null) { // x,y is within bounding box of this Actor
     // Test if actor is really hit (do nothing) or it was missed (set result = null)
  }
  return result;
}

我相信您无法在touchDown侦听器中完成此操作,因为舞台将跳过“后面”的 Actor(如果您在此处返回 false,则只有“父”actor 将获得 touchDown 事件)。

于 2013-05-25T15:18:21.530 回答