Erl*_* D. 10 java layout libgdx
我的游戏中有一个叠加层,它包含一个屏幕图像和一组"在屏幕上"的按钮.
截图:
我Screen
有一个Stage
.该Stage
有一套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.
}
}
Run Code Online (Sandbox Code Playgroud)
Poo*_*ool 23
除了其他方法之外,您还可以致电:
setTouchable(Touchable.disabled);
Run Code Online (Sandbox Code Playgroud)
记录为:
演员或任何孩子都不会收到任何触摸输入事件.
方法是Actor类.
使用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);
Run Code Online (Sandbox Code Playgroud)
另外,请务必从Actor.hit返回null .这应该导致actor不响应任何用户交互.
这就是我在游戏中解决这个问题的方法.
归档时间: |
|
查看次数: |
5516 次 |
最近记录: |