2015-10-11 15 views
5

Tôi đang gặp khó khăn khi triển khai hộp thoại trong chương trình của mình. Chương trình chính không sử dụng sân khấu. Tuy nhiên, khi người dùng ở mức 0, tôi muốn bật hộp thoại khởi động lại trò chơi hoặc thoát khỏi trò chơi.cách triển khai đúng hộp thoại bằng cách sử dụng libgdx

Tôi đã tạo một lớp riêng cho Hộp thoại bằng cách sử dụng mã sau đây.

public class GameOver { 

    //dialog game over 
    private Dialog dlgGameOver; 
    private Skin skin; 
    private Stage stage; 
    private TextButton btnMain; 
    private TextButton btnTryAgain; 
    private GameScreen gameScreen; 

    public GameOver(final GameScreen gameScreen){ 
     //create the game over dialog 
     this.gameScreen = gameScreen; 
     skin = new Skin(Gdx.files.internal("uiskin.json")); 
     dlgGameOver = new Dialog(" ",skin); 
     stage = new Stage(); 
     btnMain = new TextButton("Main", skin); 
     btnTryAgain = new TextButton("Try Again", skin); 
     dlgGameOver.text("Game over!"); 
     dlgGameOver.button(btnTryAgain); 
     dlgGameOver.button(btnMain); 
     dlgGameOver.show(stage); 
     btnMain.addListener(new ChangeListener() { 
      @Override 
      public void changed(ChangeEvent event, Actor actor) { 
       System.out.println("Button Pressed"); 
      } 
     }); 
     btnTryAgain.addListener(new ChangeListener() { 
      @Override 
      public void changed(ChangeEvent event, Actor actor) { 
       gameScreen.setIntLives(3); 
       gameScreen.setIntScore(0); 
       System.out.println("Button Pressed"); 
      } 
     }); 
     Gdx.input.setInputProcessor(stage); 

    } 

    public Stage getStage() { 
     return stage; 
    } 
} 

Màn hình trò chơi chính không sử dụng sân khấu. Trong phương thức cập nhật tôi có thể tạo lớp GameOver nếu gan đang ở 0

if(intLives == 0) { 
    if(!boolGameOver) { 
     dlgGameOver = new GameOver(this); 
     boolGameOver = true; 
    } else if(intLives !=0) { 
     boolGameOver = false; 
    } 
} 

trong render phương pháp tôi rút ra những giai đoạn

if(intLives == 0) { 
    dlgGameOver.getStage().draw(); 
} else { 
    //<rest of normal update code follows here> 
} 

này hoạt động hoàn hảo lần đầu tiên hộp thoại được tạo ra. Khi nhấn khởi động lại trò chơi sẽ khởi động lại (hoặc thực sự thiết lập lại điểm số và cuộc sống). Tuy nhiên, lần thứ hai bạn chạy ra khỏi cuộc sống hộp thoại được hiển thị như mong đợi nhưng các nút sẽ không hoạt động. Bằng cách nào đó có vẻ như người bấm vào không được khởi tạo lần thứ hai.

Tôi có đang làm điều gì đó sai về cơ bản ở đây không? Nếu cách tiếp cận của tôi hoàn toàn sai, tôi cũng rất vui khi nghe nó.

Trả lời

7

Lớp Dialog hơi khó hiểu mà không cần nhìn kỹ hơn.

Đó là lý do tôi cung cấp một ví dụ làm việc nhỏ:

import com.badlogic.gdx.ApplicationAdapter; 
import com.badlogic.gdx.Gdx; 
import com.badlogic.gdx.graphics.GL20; 
import com.badlogic.gdx.scenes.scene2d.Stage; 
import com.badlogic.gdx.scenes.scene2d.ui.Dialog; 
import com.badlogic.gdx.scenes.scene2d.ui.Skin; 
import com.badlogic.gdx.utils.Timer; 
import com.badlogic.gdx.utils.Timer.Task; 

public class TestGame extends ApplicationAdapter 
{ 
    Dialog endDialog; 

    Skin skin; 
    Stage stage; 

    @Override 
    public void create() 
    { 
     skin = new Skin(Gdx.files.internal("uiskin.json")); 

     stage = new Stage(); 

     Gdx.input.setInputProcessor(stage); 

     endDialog = new Dialog("End Game", skin) 
     { 
      protected void result(Object object) 
      { 
       System.out.println("Option: " + object); 
       Timer.schedule(new Task() 
       { 

        @Override 
        public void run() 
        { 
         endDialog.show(stage); 
        } 
       }, 1); 
      }; 
     }; 

     endDialog.button("Option 1", 1L); 
     endDialog.button("Option 2", 2L); 

     Timer.schedule(new Task() 
     { 

      @Override 
      public void run() 
      { 
       endDialog.show(stage); 
      } 
     }, 1); 

    } 

    @Override 
    public void render() 
    { 
     Gdx.gl.glClearColor(1, 0, 0, 1); 
     Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 

     stage.act(); 
     stage.draw(); 

    } 

    @Override 
    public void dispose() 
    { 
     stage.dispose(); 
    } 
} 

Mỗi khi bạn click vào một tùy chọn Dialog (phương án 1 hoặc phương án 2) đối tượng kết quả được in trên System.out (ở đây 1L hoặc 2L , có thể là bất kỳ đối tượng nào) và hộp thoại được hiển thị lại sau 1 giây.

Uiskin được lấy từ các thử nghiệm libgdx.

Để thích ứng với nó hơn với nhu cầu của bạn, bạn có thể thay đổi phương pháp kết quả cho:

protected void result(Object object) 
{ 
    if (object.equals(1L)) 
    { 
     gameScreen.setIntLives(3); 
     gameScreen.setIntScore(0); 
     System.out.println("Button Pressed"); 
    } else { 
     // Goto main menut 
    } 
}; 

Và thêm các nút như thế này:

endDialog.button("Retry", 1L); 
endDialog.button("Main Menu", 2L); 

Lưu ý rằng lớp Dialog chỉ là khởi tạo một lần. (Vì vậy nhận xét của tôi đã không được sửa chữa)


Chỉ cần để cung cấp cho bạn một ý tưởng về những gì bạn có thể làm gì với nó:

Kể từ bất kỳ đối tượng có thể được sử dụng bạn có thể sử dụng phản ánh:

try 
{ 
    endDialog.button("doX", 
      ClassReflection.getDeclaredMethod(this.getClass(), "doX")); 
    endDialog.button("doY", 
      ClassReflection.getDeclaredMethod(this.getClass(), "doY")); 
} catch (ReflectionException e) 
{ 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

Và phương pháp kết quả sẽ trông giống như:

protected void result(Object object) 
{ 
    try 
    { 
     ((Method) object).invoke(TestGame.this); 
    } catch (ReflectionException e) 
    { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
}; 

Bây giờ bạn chỉ cần triển khai các phương pháp sau:

public void doX() 
{ 
    System.out.println("doX"); 
} 

public void doY() 
{ 
    System.out.println("doY"); 
} 

Chỉ để cung cấp cho bạn một vài ý tưởng.

+4

Cái gì? Tại sao lại sử dụng sự phản chiếu ở đây?o_O – noone

+0

Tôi chỉ muốn đưa ra một tùy chọn khác về những gì có thể được sử dụng như một đối tượng ở đây, đó là nghĩa đen tất cả mọi thứ. Tôi sẽ tách nó ra khỏi câu trả lời. –

+0

Được rồi, điều đó có ý nghĩa. – noone

Các vấn đề liên quan