10

我的游戏中有一个覆盖层,它由一个屏幕图像和一组“在”屏幕上的按钮组成。

截屏:

显示 UI 组件的屏幕截图

Screen有一个Stage。有Stage一组Group对象,我认为它们是层。第一组有背景,中间的组有游戏元素,最前面的组有屏幕覆盖。

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

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

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

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

截图: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.
    }
}
4

3 回答 3

24

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

setTouchable(Touchable.disabled);

记录为:

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

Method 是Actor类。

于 2013-08-31T17:05:01.067 回答
5

使用InputMultiplexer。InputMultiplexer 类允许您在多个输入处理器之间共享用户输入。创建您自己的扩展InputProcessor的类,并将其与您的Stage一起放入 InputMultiplexer 中。这样,您可以以自定义方式响应用户输入,并且仍然可以使用您的舞台。

    InputMultiplexer multiplexer = new InputMultiplexer();
    Array<InputProcessor> processors = new Array<InputProcessor>();
    MyInputProcessor myInputProcessor = new MyInputProcessor(); 
    processors.add(myInputProcessor);
    processors.add(stage);
    this.multiplex.setProcessors(processors);

    //...
    //and in your show method in your Screen class
    Gdx.input.setInputProcessor(this.multiplex);

此外,请务必从Actor.hit返回 null 。这应该会导致参与者不响应任何用户交互。

这就是我在游戏中解决这个问题的方法。

于 2013-07-05T14:55:12.330 回答
1

是的,池是对的。

只需将可触摸设置为禁用即可。

值得怀疑的是,让所有演员在舞台上可触摸是否是引擎的“好”默认设置,因为在我的大多数游戏中,大多数演员都是演员is _not_ touchable,并且用户可以/应该与之交互的元素很少。因此,我总是创建一个“”基类,nonTouchableActor从中派生出我的所有 Actor,不会对点击/点击做出反应,并且这个基类touchable(disabled)在构造函数中设置。这样你就不用再考虑了。

于 2016-03-12T07:37:14.233 回答