屏幕之间切换Libgdx

嘿大家我还在研究这个libgdx项目,我正在试图找出将屏幕更改为我的游戏画面的最佳方法现在,当点击一个按钮时,我需要它转换到游戏画面。 我已经看到了一些扩展游戏类的实现,但我不确定这里最好的方法是什么。 如果您看到一些可以改进的代码,请告诉我们。

这是主要的应用程序类:

public class ConnectFourApplication implements ApplicationListener { private Screen screen; public static void main(String[] args) { new LwjglApplication(new ConnectFourApplication(), "PennyPop", 1280, 720, true); } @Override public void create() { screen = new MainScreen(); screen.show(); } @Override public void dispose() { screen.hide(); screen.dispose(); } /** Clears the screen with a white color */ private void clearWhite() { Gdx.gl.glClearColor(1, 1, 1, 1); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); } @Override public void pause() { screen.pause(); } @Override public void render() { clearWhite(); screen.render(Gdx.graphics.getDeltaTime()); } @Override public void resize(int width, int height) { screen.resize(width, height); } @Override public void resume() { screen.resume(); } } public class MainScreen implements Screen { private final Stage stage; private final SpriteBatch spriteBatch; //Parameter for drawing the buttons private final BitmapFont font; private final TextureAtlas buttons; private final Button SFXButton; private final Button APIButton; private final Button GameButton; private final Skin images; //Parameter for Sound private final com.badlogic.gdx.audio.Sound SFXClick; //Parameter for the api call private final String WeatherUrl; private final HttpRequest request; private final City SanFrancisco; //The screen to load after the game button is hit private Screen gamescreen; public MainScreen() { //Set up our assets spriteBatch = new SpriteBatch(); stage = new Stage(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), false, spriteBatch); font = new BitmapFont(Gdx.files.internal("assets/font.fnt"), Gdx.files.internal("assets/font.png"), false); buttons = new TextureAtlas("assets/GameButtons.pack"); images = new Skin(buttons); images.addRegions(buttons); SFXButton = new Button(images.getDrawable("sfxButton")); SFXButton.setPosition(295, 310); APIButton = new Button(images.getDrawable("apiButton")); APIButton.setPosition(405, 310); GameButton = new Button(images.getDrawable("gameButton")); GameButton.setPosition(515, 310); SFXClick = Gdx.audio.newSound(Gdx.files.internal("assets/button_click.wav")); //Add our actors to the stage stage.addActor(SFXButton); stage.addActor(APIButton); stage.addActor(GameButton); //Set up our Url request to be used when clicking the button WeatherUrl = "http://api.openweathermap.org/data/2.5/weather?q=San%20Francisco,US"; request = new HttpRequest(HttpMethods.GET); request.setUrl(WeatherUrl); SanFrancisco = new City("Unavailable","Unavailable","0","0"); //init san fran to be displayed before they have clicked the button //initialize the game screen that we will switch to when the button is pressed gamescreen = new GameScreen(); } @Override public void dispose() { spriteBatch.dispose(); stage.dispose(); } @Override public void render(float delta) { stage.act(delta); stage.draw(); //Begin sprite batch spriteBatch.begin(); //Set our on click listeners for our buttons if (SFXButton.isPressed()) SFXClick.play(); if(APIButton.isPressed()) { CallApi(); } if(GameButton.isPressed()) LoadGame(); //Set font color and render the screen font.setColor(Color.RED); font.draw(spriteBatch, "PennyPop", 455 - font.getBounds("PennpyPop").width/2, 460 + font.getBounds("PennyPop").height/2); font.setColor(Color.BLACK); font.draw(spriteBatch, "Current Weather", 900 - font.getBounds("PennpyPop").width/2, 460 + font.getBounds("PennyPop").height/2); font.setColor(Color.LIGHT_GRAY); font.draw(spriteBatch, SanFrancisco.Name, 940 - font.getBounds("PennpyPop").width/2, 420 + font.getBounds("PennyPop").height/2); font.setColor(Color.RED); font.draw(spriteBatch, SanFrancisco.CurrentCondition, 950 - font.getBounds("PennpyPop").width/2, 300 + font.getBounds("PennyPop").height/2); font.draw(spriteBatch, SanFrancisco.Temperature + " Degrees,", 920 - font.getBounds("PennpyPop").width/2, 270 + font.getBounds("PennyPop").height/2); font.draw(spriteBatch, SanFrancisco.WindSpeed, 1200 - font.getBounds("PennpyPop").width/2, 270 + font.getBounds("PennyPop").height/2); //End or sprite batch spriteBatch.end(); } //Handles calling our API public void CallApi(){ //Sends our stored HTTPRequest object Gdx.net.sendHttpRequest(request, new HttpResponseListener() { @Override public void handleHttpResponse(HttpResponse httpResponse) { //Uses our private response reader object to give us a the JSON from the api call JSONObject json = HttpResponseReader(httpResponse); //Gets the name of the city SanFrancisco.Name = (String) json.get("name"); //Parsed through our returned JSON for the weather key JSONArray WeatherArray = (JSONArray) json.get("weather"); //Gets the actual weather dictionary JSONObject Weather = (JSONObject) WeatherArray.get(0); //Finally get the value with the key of description and assign it //To the San Fran current conditions field SanFrancisco.CurrentCondition = (String) Weather.get("description"); //Gets the actual main dictionary JSONObject main = (JSONObject) json.get("main"); //Finally get the values based on the keys SanFrancisco.Temperature = (String) Double.toString((double) main.get("temp")); //Finally get the wind speed JSONObject wind = (JSONObject) json.get("wind"); SanFrancisco.WindSpeed = (String) Double.toString((double) wind.get("speed")); } @Override public void failed(Throwable t) { Gdx.app.log("Failed ", t.getMessage()); } }); } //When the button game button is clicked should load the connect four game public void LoadGame(){ hide(); gamescreen.show(); } //Converts our HttpResponse into a JSON OBject private static JSONObject HttpResponseReader(HttpResponse httpResponse){ BufferedReader read = new BufferedReader(new InputStreamReader(httpResponse.getResultAsStream())); StringBuffer result = new StringBuffer(); String line = ""; try { while ((line = read.readLine()) != null) { result.append(line); } JSONObject json; try { json = (JSONObject)new JSONParser().parse(result.toString()); return json; } catch (ParseException e) { e.printStackTrace(); } } catch (IOException e) { e.printStackTrace(); } return null; } @Override public void resize(int width, int height) { stage.setViewport(width, height, false); } @Override public void hide() { Gdx.input.setInputProcessor(null); } @Override public void show() { Gdx.input.setInputProcessor(stage); render(0); } @Override public void pause() { // Irrelevant on desktop, ignore this } @Override public void resume() { // Irrelevant on desktop, ignore this } } 

这就是我总是实现屏幕切换的方式:

首先,主类需要扩展Game(来自com.badlogic.gdx.Game ),你需要有一个类型为Game的新字段:

 public class ConnectFourApplication extends Game{ private Game game; 

现在在构造函数中初始化game

 public ConnectFourApplication(){ game = this; // Since this class extends Game 

现在,要将屏幕设置为MainScreen ,您需要做的就是使用setScreen(new MainScreen(game)); 方法(传递game以便我们可以从MainScreen类设置屏幕)现在需要一个新的MainScreen类构造函数和一个新字段:

 private Game game; public MainScreen(Game game){ this.game = game; 

现在你可以使用game.setScreen(new Screen(game)); 将屏幕设置为另一个实现Screen类。

但是现在,在main类中,在render()方法中你必须使用super.render(); 使用其他屏幕渲染的一切!

 public void render() { clearWhite(); super.render(); } 

PS:确保您作为屏幕制作的课程实际上implements Screen

你有一个关于LibGDX.info的这个和许多其他概念的例子