2012-04-27 6 views
5

tôi có ba lớp mà thực hiện LibGdx Screen lớp:Libgdx: nút quay lại điện thoại vẫn tiếp tục giữa màn hình

MainMenuScreen, LevelSelectScreen, GameScreen

Để bây giờ tôi đã setCatchBackKey MainMenuScreen của thiết lập để sai, vì vậy các trò chơi sẽ chỉ lối ra trên báo chí trở lại.

LevelSelectScreen và GameScreen có setCatchBackKey được đặt thành true.

Trong của GameScreen làm cho chức năng tôi có:

@Override 
public void render(float delta) 
{ 
    gameTime = delta; 

    if (Gdx.input.isKeyPressed(Keys.BACK)) 
     new LevelSelectScreen(game); 

    ... 
} 

mà đặt màn hình để hiển thị mức độ lựa chọn và trong LevelSelectScreens của làm cho chức năng tôi có:

@Override 
public void render(float delta) 
{ 
    if (Gdx.input.isKeyPressed(Keys.BACK)) 
     new MainMenuScreen(game); 

    Update(); 
    Draw(); 
} //end render 

Vấn đề tôi gặp phải với điều này là khi tôi nhấn lại trên màn hình GameScreen, màn hình LevelSelectScreen sẽ nhấp nháy trên màn hình một lúc và sau đó quay trở lại MainMenuScreen. Tôi thấy rằng tôi có thể thiết lập một số biến để kiểm tra xem Back đã được đẩy khi màn hình khởi động, nhưng chỉ tò mò nếu có một số chức năng "ma thuật" đã được bao gồm trong LibGdx hoặc cấu trúc mã chỉ hoạt động xung quanh vấn đề này.

Trả lời

1

Tôi sử dụng lớp Hoạt động mở rộng lớp "AndroidApplication" cho mỗi màn hình mà tôi có, ví dụ: LevelSelectActivity, MainMenuActivity và GameActivity. Trong mỗi lớp này có một đối tượng lớp mở rộng "Screen" giống như các lớp bạn có, và việc kiểm soát các sự kiện như tạm dừng, tiếp tục và nhấn phím sau là nhiệm vụ của lớp Activity không phải là lớp màn hình. Khi cần quay lại, chỉ cần gọi phương thức "finish()" trong lớp GameActivity ví dụ. Nó tự động đi đến SelectLevelActivity.

+0

Cảm ơn lời khuyên, tôi sẽ xem liệu tôi có thể làm điều gì đó như thế để giải quyết vấn đề của mình hay không. – Fleck

2

Thay vì sử dụng Gdx.input.isKeyPressed (int), bạn có thể triển khai giao diện InputProcessor.

Tài liệu cho InputProcessor: http://libgdx.l33tlabs.org/docs/api/com/badlogic/gdx/InputProcessor.html

Dont quên đăng ký InputProcessor bạn cho nó để nhận các sự kiện đầu vào, với: Gdx.input.setInputProcessor (InputProcessor);

Đối với trường hợp cụ thể này, hãy sử dụng keyDown.

1

Những gì tôi làm là lưu trữ thời gian khi phím sau được nhấn lần cuối và không phản ứng với nó nếu gần đây.

4

Trước hết mở rộng các lớp Stage như dưới đây:

public static class MyStage extends Stage{ 
    public MyStage(float width, float height, boolean keepAspectRatio, SpriteBatch batch){ 
     super(width, height, keepAspectRatio, batch); 
    }  
    @Override 
    public boolean keyDown(int keyCode) { 
     if(keyCode==Keys.BACK||keyCode==Keys.MENU){ 
      if(getHardKeyListener()!=null) 
       getHardKeyListener().onHardKey(keyCode, 1); 
     }   
     return super.keyDown(keyCode); 
    } 
    @Override 
    public boolean keyUp(int keyCode) { 
     if(keyCode==Keys.BACK||keyCode==Keys.MENU){ 
      if(getHardKeyListener()!=null) 
       getHardKeyListener().onHardKey(keyCode, 0); 
     } 
     return super.keyUp(keyCode); 
    } 

    /*********************Hard key listener***********************/ 
    public interface OnHardKeyListener{ 
     /** 
     * Happens when user press hard key 
     * @param keyCode Back or Menu key (keyCode one of the constants in Input.Keys) 
     * @param state 1 - key down, 0 - key up 
     */ 
     public abstract void onHardKey(int keyCode, int state); 
    } 
    private OnHardKeyListener _HardKeyListener = null; 
    public void setHardKeyListener(OnHardKeyListener HardKeyListener) { 
     _HardKeyListener = HardKeyListener; 
    }  
    public OnHardKeyListener getHardKeyListener() { 
     return _HardKeyListener; 
    } 
} 

Sau đó, trong lớp Screen của bạn:

protected final MyStage stage; 
public YourScreen(Game game) 
{ 
    this.game = game; 
    stage = new MyStage(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), true, game.spriteBatch);      

    Gdx.input.setInputProcessor(stage); 
    //prevents the app from being pause...  
    Gdx.input.setCatchBackKey(true); 
    Gdx.input.setCatchMenuKey(true); 

    //Sets hard key listener... 
    stage.setHardKeyListener(new OnHardKeyListener() {   
     @Override 
     public void onHardKey(int keyCode, int state) { 
      if(keyCode==Keys.BACK && state==1){ 
       //do something  
      }  
     } 
    }); 
} 

Hy vọng nó sẽ giúp bạn hay người khác đang tìm kiếm công cụ này.