Libgdx 具有重叠透明图像的组的输入检测

Libgdx 具有重叠透明图像的组的输入检测,libgdx,Libgdx,我使用一个组来存储一些图像并将它们绘制到SpriteBatch。现在我想检测点击了哪个图像。出于这个原因,我向组中添加了一个InputListener,以便在触地时获得一个事件。传入的InputEvent获得了一个方法(getTarget),该方法返回对单击的参与者的引用 如果我点击一个参与者的透明区域,我想忽略传入的事件。如果有演员在幕后,我想用这个来代替。我想到了这样的事情: myGroup.addListener(new InputListener() { @Ove

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

如果我点击一个参与者的透明区域,我想忽略传入的事件。如果有演员在幕后,我想用这个来代替。我想到了这样的事情:

    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
        };
    });
这样做对吗?我认为为方法触地返回false将继续传播事件,并让我也接收相同位置的其他参与者的触地事件。但这似乎是一个误解

更新


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

我认为您希望覆盖该方法。看

为此,将
Image
子类化,并将您的
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;
}

我相信你不能在
触地
监听器中完成这一点,因为舞台将跳过这一个后面的演员(如果你在这里返回false,只有“家长”演员将获得触地事件)。

你不能从图像转到Pixmap。你从Pixmap到纹理再到Drawable到图像。你试过我提供的解决方案吗?