单击libGDX中的Actor

时间:2013-07-05 14:51:16

标签: java layout libgdx

我的游戏中有一个叠加层,其中包含一个屏幕图像,以及一组位于屏幕上的按钮。

截图:

Screenshot showing UI components

我的Screen有一个StageStage有一组Group个对象,我认为这些对象是图层。第一组有背景,中间的组有游戏元素,最前面的组有屏幕叠加。

叠加图层由一个Image,屏幕本身和四个TextButton(每个角落一个)组成。

如果不是因为我不能点击游戏层中的任何内容,只要覆盖层中的图像位于其前面,这就行得很好。即使图像是透明的,它仍会在到达游戏层之前与所有触摸事件相互接触。

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

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

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

在这个屏幕截图中,我打开了一个指令消息框,它将自己添加到其中一个游戏层(第6组)。 请注意,覆盖层(即组7)中的所有按钮都位于消息框的前面,但是屏幕框(它是一个自定义Actor)会以某种方式在消息框后面绘制。这是为什么? 注意:如果我采用完全相同的情况,并将我的自定义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.
    }
}

3 个答案:

答案 0 :(得分:23)

除了其他方法之外,您还可以致电:

setTouchable(Touchable.disabled);

记录为:

  

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

方法是Actor类。

答案 1 :(得分: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。这应该导致演员不响应任何用户交互。

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

答案 2 :(得分:1)

是的,Pool是对的。

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

值得怀疑的是,它是否是一个好的&#34;引导的默认值使所有演员都可以在舞台上进行触摸,因为在我的大多数游戏中,大多数演员is _not_ touchable,并且用户可以/将要与之交互的元素很少。因此,我总是创建一个&#34; nonTouchableActor&#34;的基类。我从中获取所有我的Actors,不会对点击/点击做出反应,这个基类在构造函数中设置touchable(disabled)。这样你就不用再思考了。