我想每隔x秒更改菜单的背景图像.我正在使用libGDX scene2D.ui来制作菜单. TestScreen类扩展了AbstractScreen,它是一个实现libGDX的Screen类的抽象类. 问题:通过堆栈上的Table对象将 Image加载到
问题:通过堆栈上的Table对象将 Image加载到舞台后,将图像引用更改为不同的图像. Stage.draw()不关心它是否制作了原始图像的副本.我想将背景保持为Image类并通过stage.draw()进行渲染.
更复杂的是,如果我在render()方法中将图像更改为另一个图像,则image.setVisible(false)也会停止工作.
public class TestScreen extends AbstractScreen { private Stage stage; private Image background; private boolean ChangeBackground = true; private final float refreshTime = 2.0f; // refresh to new image every 2 seconds. private float counter = refreshTime; public TestScreen(Game game) { super(game); } @Override public void render(float deltaTime) { Gdx.gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); if(ChangeBackground){ counter -= deltaTime; if(counter < 0){ counter = refreshTime; // Assets class has the 12 images loaded as "Image" objects already. // I simple want to change the reference to other (already loaded in memory images) ... // and make stage render the new image. background = Assets.instance.wallpapers[(int) (Math.random()*12)]; // The image should change. //background.setVisible(false); } } stage.act(deltaTime); stage.draw(); } @Override public void resize(int width, int height) { stage.setViewport(Constants.VIEWPORT_GUI_WIDTH, Constants.VIEWPORT_GUI_HEIGHT, false); } @Override public void show() { stage = new Stage(); Gdx.input.setInputProcessor(stage); makeStage(); } @Override public void hide() { stage.dispose(); } @Override public void pause() { } // Builds the Background later and adds it to a stage through a stack. // This is how it's done in my game. I made this test bench to demonstrate. private void makeStage() { Table BackGroundLayer = new Table(); background = Assets.instance.wallpapers[(int) (Math.random()*12)]; BackGroundLayer.add(background); Stack layers = new Stack(); layers.setSize(800, 480); layers.add(BackGroundLayer); stage.clear(); stage.addActor(layers); }
}
Image是Actor的子类.主要区别在于,Image内部有Drawable.如果调用stage.draw()调用Image的draw(),则会绘制此Drawable.您可以使用setDrawable(Drawable param)更改Drawable,而不是更改Image.什么是Drawable?它是实现Drawable接口的任何类,例如TextureRegionDrawable.如果您使用的是TextureRegions,则可以使用此构造函数:TextureRegionDrawable(TextureRegion region);.也许将背景图像存储在可绘制数组中会更好,这样每次设置新的Drawable时都不必调用construcor.示例代码:
TextureRegionDrawable[] images = new TextureRegionDrawable[12]; for (int i = 0; i<12; i++) { images[i] = new TextureRegionDrawable(Assets.instance.textureRegions[i]); }
然后在你的渲染中:
if(changeBackground) { counter -= delta; if (counter < 0) { counter = refreshtime background.setDrawable(images[(int)(Math.random()*12)]); } }
这应该工作