嘿大家我还在研究这个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); 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,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;
现在在构造函数中初始化游戏:
public ConnectFourApplication(){ game = this; // Since this class extends Game
现在,要将屏幕设置为MainScreen,您需要做的就是使用setScreen(new MainScreen(game));方法(传递游戏,所以我们可以从MainScreen类设置屏幕)
您现在需要一个MainScreen类的新构造函数和一个新字段:
private Game game; public MainScreen(Game game){ this.game = game;
现在你可以使用game.setScreen(新屏幕(游戏));将屏幕设置为另一个实现Screen的类.
但是现在,在main类中,在render()方法中你必须使用super.render();使用其他屏幕渲染的一切!
public void render() { clearWhite(); super.render(); }
PS:确保您作为屏幕制作的课程实际上实现了Screen.