单击libGDX中的Actor

我的游戏中有一个叠加层,它包含一个屏幕图像和一组“在屏幕上”的按钮。

截图:

显示UI组件的屏幕截图

我的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. } } 

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

  InputMultiplexer multiplexer = new InputMultiplexer(); Array processors = new Array(); 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。 这应该导致actor不响应任何用户交互。

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

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

 setTouchable(Touchable.disabled); 

记录为:

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

方法是Actor类。

是的,游泳池是对的。

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

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