Libgdx: 如何 return 到上一个屏幕
Libgdx: how to return to a previous screen
我正在开发一款游戏,在初始阶段我希望用户能够在 two/three 屏幕之间自由切换。
从我在网上看到的情况来看,您可以通过调用游戏实例上的 setScreen 函数来切换屏幕。问题是它似乎只有在您将屏幕的新实例作为参数传递时才有效(我试图将整个屏幕传递给 A 一个新的屏幕 B,但是在 B 上调用 myGame.setScreen(A) 不会't do anything),我想存储用户应用的更改,即使他离开屏幕后也是如此。
我考虑过将这些信息存储在 class 中,每次用户切换屏幕时我都会将其作为参数传递,但这种解决方案似乎效率低下且错误。
是否有任何标准方法可以 return 到前一个屏幕而不丢失对其所做的所有更改? myGame.setScreen 是否仅适用于 Screen 的新实例?
这是我尝试用于 return 旧屏幕的代码:
public class TroopPlacingScreen implements Screen {
private final Game game;
OrthographicCamera camera;
private final GameScreen gameScreen;
private final int XSIZE=1000, YSIZE=500;
private Stage stage;
private long lastClick;
private ImageButton saveAndContinue;
public TroopPlacingScreen(Game game, GameScreen gameScreen){
this.game=game;
camera= new OrthographicCamera();
camera.setToOrtho(false, XSIZE, YSIZE);
stage= new Stage(new ScreenViewport(), game.batch);
lastClick= TimeUtils.millis();
Sprite sprite= new Sprite(new
Texture(Gdx.files.internal("saveImage.png")));
SpriteDrawable spriteDrawable= new SpriteDrawable(sprite);
saveAndContinue= new ImageButton(spriteDrawable);
saveAndContinue.setSize(100,100);
saveAndContinue.setPosition(Gdx.graphics.getWidth()-250,
Gdx.graphics.getHeight()-100);
stage.addActor(saveAndContinue);
}
@Override
public void show() {
}
@Override
public void render(float delta) {
ScreenUtils.clear(0, 0, 0, 1);
camera.update();
game.batch.setProjectionMatrix(camera.combined);
game.batch.begin();
game.batch.end();
stage.addActor(saveAndContinue);
if(saveAndContinue.isPressed()){
game.setFirstTurn(false);
game.setScreen(gameScreen);
}
}
stage.act();
stage.draw();
}
@Override
public void resize(int width, int height) {
stage.getViewport().update(width, height, true);
}
@Override
public void pause() {
}
@Override
public void resume() {
}
@Override
public void hide() {
}
@Override
public void dispose() {
}
}
正如我所说,这是非常基本的,为了让它工作,我还尝试调用 this.dispose()
、gameScreen.show()
、gameScreen.render()
以及这些函数的所有可能排列,当已按下保存并继续按钮,但没有任何效果。
根据您的代码,您将 gameScreen
传递给构造函数但未初始化 class 变量。因此,当调用 game.setScreen(gameScreen);
时,您传递的是 null
而不是实际的屏幕实例。
要让您的代码正常工作,只需在构造函数中初始化您的 class 变量。
this.gameScreen = gameScreen;
此外,最好将屏幕实例保存在 Game
class 中并在那里有一个方法,例如setScreen()
将接受屏幕枚举,而不是将屏幕实例泄露给彼此。
public class MyGame extends Game {
// Make sure to initialize your screens
private ScreenA screenA;
private ScreenB screenB;
/** ... **/
public void setScreen(ScreenKey screenKey) {
switch(screenKey) {
case ScreenKey.A:
setScreen(screenA);
break;
case ScreenKey.B:
setScreen(screenB);
break;
}
}
public enum ScreenKey {A, B}
}
那么在ScreenA
中可以使用如下语句切换到ScreenB
:
game.setScreen(ScreenKey.B)
除了 switch 语句,您还可以使用映射 Map<ScreenKey, Screen>
.
public class MyGame extends Game {
// Make sure to initialize your screens
private Map<ScreenKey, Screen> screens;
/** ... **/
public void setScreen(ScreenKey screenKey) {
setScreen(screens.get(screenKey));
}
public enum ScreenKey {A, B}
}
我正在开发一款游戏,在初始阶段我希望用户能够在 two/three 屏幕之间自由切换。
从我在网上看到的情况来看,您可以通过调用游戏实例上的 setScreen 函数来切换屏幕。问题是它似乎只有在您将屏幕的新实例作为参数传递时才有效(我试图将整个屏幕传递给 A 一个新的屏幕 B,但是在 B 上调用 myGame.setScreen(A) 不会't do anything),我想存储用户应用的更改,即使他离开屏幕后也是如此。
我考虑过将这些信息存储在 class 中,每次用户切换屏幕时我都会将其作为参数传递,但这种解决方案似乎效率低下且错误。
是否有任何标准方法可以 return 到前一个屏幕而不丢失对其所做的所有更改? myGame.setScreen 是否仅适用于 Screen 的新实例?
这是我尝试用于 return 旧屏幕的代码:
public class TroopPlacingScreen implements Screen {
private final Game game;
OrthographicCamera camera;
private final GameScreen gameScreen;
private final int XSIZE=1000, YSIZE=500;
private Stage stage;
private long lastClick;
private ImageButton saveAndContinue;
public TroopPlacingScreen(Game game, GameScreen gameScreen){
this.game=game;
camera= new OrthographicCamera();
camera.setToOrtho(false, XSIZE, YSIZE);
stage= new Stage(new ScreenViewport(), game.batch);
lastClick= TimeUtils.millis();
Sprite sprite= new Sprite(new
Texture(Gdx.files.internal("saveImage.png")));
SpriteDrawable spriteDrawable= new SpriteDrawable(sprite);
saveAndContinue= new ImageButton(spriteDrawable);
saveAndContinue.setSize(100,100);
saveAndContinue.setPosition(Gdx.graphics.getWidth()-250,
Gdx.graphics.getHeight()-100);
stage.addActor(saveAndContinue);
}
@Override
public void show() {
}
@Override
public void render(float delta) {
ScreenUtils.clear(0, 0, 0, 1);
camera.update();
game.batch.setProjectionMatrix(camera.combined);
game.batch.begin();
game.batch.end();
stage.addActor(saveAndContinue);
if(saveAndContinue.isPressed()){
game.setFirstTurn(false);
game.setScreen(gameScreen);
}
}
stage.act();
stage.draw();
}
@Override
public void resize(int width, int height) {
stage.getViewport().update(width, height, true);
}
@Override
public void pause() {
}
@Override
public void resume() {
}
@Override
public void hide() {
}
@Override
public void dispose() {
}
}
正如我所说,这是非常基本的,为了让它工作,我还尝试调用 this.dispose()
、gameScreen.show()
、gameScreen.render()
以及这些函数的所有可能排列,当已按下保存并继续按钮,但没有任何效果。
根据您的代码,您将 gameScreen
传递给构造函数但未初始化 class 变量。因此,当调用 game.setScreen(gameScreen);
时,您传递的是 null
而不是实际的屏幕实例。
要让您的代码正常工作,只需在构造函数中初始化您的 class 变量。
this.gameScreen = gameScreen;
此外,最好将屏幕实例保存在 Game
class 中并在那里有一个方法,例如setScreen()
将接受屏幕枚举,而不是将屏幕实例泄露给彼此。
public class MyGame extends Game {
// Make sure to initialize your screens
private ScreenA screenA;
private ScreenB screenB;
/** ... **/
public void setScreen(ScreenKey screenKey) {
switch(screenKey) {
case ScreenKey.A:
setScreen(screenA);
break;
case ScreenKey.B:
setScreen(screenB);
break;
}
}
public enum ScreenKey {A, B}
}
那么在ScreenA
中可以使用如下语句切换到ScreenB
:
game.setScreen(ScreenKey.B)
除了 switch 语句,您还可以使用映射 Map<ScreenKey, Screen>
.
public class MyGame extends Game {
// Make sure to initialize your screens
private Map<ScreenKey, Screen> screens;
/** ... **/
public void setScreen(ScreenKey screenKey) {
setScreen(screens.get(screenKey));
}
public enum ScreenKey {A, B}
}