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