Art*_*ash 3 android libgdx scene2d
我想每隔x秒更改菜单的背景图像.我正在使用libGDX scene2D.ui来制作菜单.TestScreen类扩展了AbstractScreen,它是一个实现libGDX的Screen类的抽象类.问题:通过堆栈上的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);
}
Run Code Online (Sandbox Code Playgroud)
}
Image是.的子类Actor.主要区别在于,内部Image有一个Drawable.这Drawable如果调用被绘制stage.draw(),它调用draw()的Image.而不是改变Image你可以改变Drawable使用setDrawable(Drawable param);.什么是Drawable?它是实现Drawable接口的任何类,例如TextureRegionDrawable.如果你正在使用TextureRegions,你可以使用这个构造函数:TextureRegionDrawable(TextureRegion region);.也许最好将背景图像存储在Drawable数组中,这样每次设置新的时都不必调用construcor Drawable.示例代码:
TextureRegionDrawable[] images = new TextureRegionDrawable[12];
for (int i = 0; i<12; i++) {
images[i] = new TextureRegionDrawable(Assets.instance.textureRegions[i]);
}
Run Code Online (Sandbox Code Playgroud)
然后在你的渲染中:
if(changeBackground) {
counter -= delta;
if (counter < 0) {
counter = refreshtime
background.setDrawable(images[(int)(Math.random()*12)]);
}
}
Run Code Online (Sandbox Code Playgroud)
这应该工作
| 归档时间: |
|
| 查看次数: |
2823 次 |
| 最近记录: |