根据文档(https://github.com/libgdx/libgdx/wiki/Continuous-&-non-continuous-rendering),应该可以限制进行的渲染调用。但是,每次我移动鼠标时,render方法仍然会被调用。我想知道是否有可能将渲染限制为仅在某些action
发生时(或根据需要通过添加necesarry requestRendering来完成)。
在下面的示例中,我将连续渲染设置为false,并且在舞台上也将setActionsRequestRendering
设置为false。
public class TestApp extends ApplicationAdapter {
private Stage stage;
private Drawable createDrawable(Color color) {
Pixmap labelColor = new Pixmap(100, 100, Pixmap.Format.RGB888);
labelColor.setColor(color);
labelColor.fill();
return new TextureRegionDrawable(new Texture(labelColor));
}
@Override
public void create() {
Gdx.graphics.setContinuousRendering(false);
stage = new Stage();
stage.setActionsRequestRendering(false);
Gdx.input.setInputProcessor(stage);
Drawable imageUp = createDrawable(Color.WHITE);
Drawable imageOver = createDrawable(Color.RED);
ImageButtonStyle style = new ImageButtonStyle();
style.imageUp = imageUp;
style.imageOver = imageOver;
ImageButton button = new ImageButton(style);
button.setSize(100, 100);
button.setPosition(50, 50);
stage.addActor(button);
}
@Override
public void render() {
System.out.println("render");
Gdx.gl.glClearColor(0f, 0f, 0f, 1.f);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);
stage.act();
stage.draw();
}
@Override
public void dispose () {
stage.dispose();
}
public static void main (String[] arg) {
LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();
config.fullscreen = false;
config.width = 200;
config.height = 200;
new LwjglApplication(new TestApp(), config);
}
}
根据文档:
如果连续渲染设置为false,则render()方法将为 仅在发生以下情况时调用。
- 触发输入事件
- Gdx.graphics.requestRendering()被称为
- Gdx.app.postRunnable()被称为
我认为移动鼠标算作输入事件。
我希望仅在按钮实际上需要更改其渲染状态(按钮向上/按钮上方)时才调用render方法。如果那不可能,那么当鼠标位置不是hitting
时,至少不应调用渲染。
编辑2:
根据Morchul的建议,我会尝试记住该状态。
感谢Tenfour04指出双重缓冲。
我在create方法中添加了一个InputListener:
(已更改为新的全局变量/默认值:true)
(count是另一个全局变量/默认值:0)
button.addListener(new InputListener() {
public void enter(InputEvent event, float x, float y, int pointer, Actor fromActor) {
changed = true;
count = 0;
}
public void exit(InputEvent event, float x, float y, int pointer, Actor toActor) {
changed = true;
count = 0;
}
});
并更改了draw方法的开始
stage.act();
if (changed == false) {
return;
} else if (++count == 2) {
changed = false;
}
答案 0 :(得分:2)
我认为您不可能想要什么。因为没有在每次移动鼠标时都调用render()方法,所以无法检测到悬停。
您可以做的是,如果看到按钮没有被击中,则在渲染东西之前退出render()方法:
@Override
public void render() {
stage.act();
if(!button.isOver()){
return;
}
System.out.println("Render");
Gdx.gl.glClearColor(0f, 0f, 0f, 1.f);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);
stage.draw();
}
答案 1 :(得分:0)
根据@Morchul
的建议,我会尝试记住该状态。
感谢@Tenfour04
指出双重缓冲。
我在create方法中添加了一个InputListener:
(已更改为新的全局变量/默认值:true)
(count是另一个全局变量/默认值:0)
button.addListener(new InputListener() {
public void enter(InputEvent event, float x, float y, int pointer, Actor fromActor) {
changed = true;
count = 0;
}
public void exit(InputEvent event, float x, float y, int pointer, Actor toActor) {
changed = true;
count = 0;
}
});
并更改了draw方法的开始
stage.act();
if (changed == false) {
return;
} else if (++count == 2) {
changed = false;
}