2014-09-14 120 views
5

Hey herkes hala bu libgdx projesinde çalışıyorum ve ekranları oyun ekranına değiştirmenin en iyi yolunu bulmaya çalışıyorum Şimdi, bir buton tıklandığında oyuna geçmek için buna ihtiyacım var ekran. Oyun sınıfını genişleten birkaç uygulama gördüm ama buradaki en iyi yaklaşımın ne olduğundan emin değilim. Geliştirilebilecek bazı kodlar görürseniz lütfen bana bildirin.Ekranlar arasında geçiş yapma Libgdx

Birinci ana sınıf (com.badlogic.gdx.Game itibaren) Oyunu uzatmak gerekiyor ve bir olması gerekir:

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 
    } 
} 

cevap

14

Bu hep ekran değişiminin uygulanması nasıl: Burada

ana uygulama sınıfıdır

public class ConnectFourApplication extends Game{ 
    private Game game; 

Şimdi yapıcı içinde game başlatmak: tip Game yeni alan

public ConnectFourApplication(){ 
    game = this; // Since this class extends Game 
MainScreen Ekranı ayarlamak için, şimdi, tüm yapmanız gereken Artık MainScreen sınıf için yeni bir yapıcısı gerek ( game yüzden MainScreen sınıftan ekranları ayarlayabilirsiniz geçen) setScreen(new MainScreen(game)); yöntemi kullanmaktır ve yeni alan:
private Game game; 
public MainScreen(Game game){ 
    this.game = game; 

Şimdi ekranı ayarlamak için game.setScreen(new Screen(game)); kullanabilirsiniz henüz Screen uygulayan başka sınıfı.

Ancak şimdi, ana sınıfta, render() yönteminde, diğer ekranlardan her şeyi kullanmak için super.render(); kullanmanız gerekir!

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

Not: olduğundan emin olun bir ekran olarak yapıyoruz sınıf Aslında implements Screen. Eğer `setScreen yaparsanız

+1

bu ve diğer birçok konseptler için bir örnek var (yeni Mainscreen (bu)', o zaman bir 'özel Oyun oyun var gerekmez;' alanı veya 'oyunu = Bu, –

+0

super.render(); ZORUNLU BİR ZAMAN, iyi bir saat ya da öylesine ıstırap çektim (acemi) –

İlgili konular