单击 libGDX 中的 Actor

2024-04-27

我的游戏中有一个覆盖层,其中包含屏幕图像和屏幕“上”的一组按钮。

截屏:

My Screen有一个Stage. The Stage有一组Group对象,我将其视为图层。第一组具有背景,中间的组具有游戏元素,最前面的组具有屏幕覆盖。

覆盖层由一个Image、屏幕本身和四个TextButton(每个角各一个)。

如果不是因为只要覆盖层中的图像位于其前面,我就无法单击游戏层中的任何内容,这将非常有效。即使图像是透明的,它仍然会在所有触摸事件到达游戏层之前拦截它们。

所以我的问题是:如何使覆盖层中的图像忽略所有触摸事件,以便游戏层能够获取它们并且可以实际玩游戏?

我自己尝试了一个想法,但我不确定这是正确的方法:我尝试将图像创建为自定义Actor始终将高度/宽度设置为 0,但仍然(通过重载 draw() 方法)在整个屏幕上绘制图像。这非常有效,除了图像由于某种原因被绘制在较低层的元素后面这一事实之外。

截屏:https://dl.dropboxusercontent.com/u/1545094/Screen2.png https://dl.dropboxusercontent.com/u/1545094/Screen2.png

在此屏幕截图中,我打开了一个指令消息框,它将自身添加到游戏层之一(第 6 组)。 请注意,覆盖层(第 7 组)中的所有按钮都位于消息框前面,但屏幕框架(自定义 Actor)以某种方式绘制在消息框后面。这是为什么? 注意:如果我采取完全相同的情况,并将我的自定义演员更改为常规图像,则所有内容都会正确绘制,但随后我无法再单击较低层中的任何内容,如上所述。

这是我的定制演员,如果有人能理解的话:

public class ClickThroughImage extends Actor {

    BaseDrawable d;

    public NonexistingImage(BaseDrawable d){
        this.d = d;
        setSize(0, 0);
    }

    @Override
    public void draw(SpriteBatch batch, float parentAlpha) {
        d.draw(batch, 0, 0, 1024, 768); //Yes, I tried swapping these two lines. 
        super.draw(batch, parentAlpha); //It had no effect.
    }
}

除了注释中的其他方法之外,您还可以调用:

setTouchable(Touchable.disabled);

其记录为:

演员或任何孩子都不会收到任何触摸输入事件。

方法是nActor http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/scenes/scene2d/Actor.html#setTouchable%28com.badlogic.gdx.scenes.scene2d.Touchable%29 class.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单击 libGDX 中的 Actor 的相关文章

随机推荐