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

时间:2013-05-25 11:59:57

标签: libgdx

我使用Group存储一些Images并将它们绘制到SpriteBatch。现在我想检测单击了哪个Image。因此,我向Group添加了一个InputListener,以便在触摸时获取事件。传入的InputEvent有一个方法( getTarget ),它返回对被点击的Actor的引用。

如果我点击一个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
        };
    });

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

更新

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

1 个答案:

答案 0 :(得分:6)

我认为您要覆盖Actor.hit()方法。请参阅scene2d Hit Detection wiki

为此,请继承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;
}

我相信你无法在touchDown监听器中完成此任务,因为舞台将跳过这个“后面”的演员(如果你在这里返回false,只有“父”演员将获得touchDown事件)。