2015-01-30 2 views
0

Извините за мой вопрос, но я застрял. Я новичок в разработке игры с lib gdx и не сужу меня строго. У меня есть игровой деятельности:Как приостановить игру в Screen libgdx?

public class MyGame extends Game { 
MenuScreen menu; 
SplashScreen splash; 
DefendScreen def; 

@Override 
public void create() { 
    // Gdx.app.log("LogGame", "MyGame create"); 
    menu = new MenuScreen(this); 
    splash = new SplashScreen(this); 
    def = new DefendScreen(this); 
    setScreen(splash); 


} 

@Override 
public void resize(int width, int height) { 

} 

@Override 
public void render() { 
    super.render(); 
} 

@Override 
public void pause() { 
    super.pause(); 

} 

@Override 
public void resume() { 
    super.resume(); 

} 

@Override 
public void dispose() { 

} 

}

У меня есть два экрана:

public class MenuScreen implements Screen, InputProcessor { 
public MenuScreen(final MyGame gam) { 
    game = gam; 
    cam = new OrthographicCamera(); 
    cam.setToOrtho(false, 800, 480); 
    w = Gdx.graphics.getWidth(); 
    h = Gdx.graphics.getHeight(); 
    defScreen = new DefendScreen(game); 
    spriteBatch = new SpriteBatch(); 
    stage = new Stage(); 
} 
@Override 
public void dispose() { 
    Gdx.app.log("LogGame", "splashs dispose"); 
    Gdx.input.setInputProcessor(null); 

    try { 

     spriteBatch.dispose(); 
     stage.dispose(); 
     font12.dispose(); 
    } catch (Exception e) { 

    } 

} 

@Override 
public void hide() { 
    // TODO Auto-generated method stub 

} 
@Override 
public void pause() { 



} 
@Override 
public void render(float arg0) { 
    SetCamera(CAMERA_WIDTH/2, CAMERA_HEIGHT/2f); 
    Gdx.gl.glClearColor(0, 0, 0, 1); 
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
    stage.act(); // update all actors 
    stage.draw(); 

} 
@Override 
public void resize(int arg0, int arg1) { 
} 

@Override 
public void resume() { 
    // TODO Auto-generated method stub 

} 
@Override 
public void show() { 
    stage.addActor(new WorldMenu(new Texture(Gdx.files 
      .internal("images/bg/pause_back.png")))); 

    Gdx.input.setInputProcessor(stage); 
    FreeTypeFontGenerator generator = new FreeTypeFontGenerator(
      Gdx.files.internal("font/trebuchet_ms.ttf")); 
    FreeTypeFontParameter parameter = new FreeTypeFontParameter(); 
    parameter.size = 25; 
    font12 = generator.generateFont(parameter); 
    generator.dispose(); 

    DrawLeftMeu(); 
    DrawRightMeu(); 
    DrawSetingsMenu(); 

}} 

И экран игра, в которой у меня есть кнопка паузы:

public class DefendScreen implements Screen, InputProcessor { 
public DefendScreen(final MyGame gam) { 
    game = gam; 
    cam = new OrthographicCamera(); 
    cam.setToOrtho(false, 800, 480); 
    startTime = TimeUtils.millis(); 
    spriteBatch = new SpriteBatch(); 

    stage = new Stage(); 
    w = Gdx.graphics.getWidth(); 
    h = Gdx.graphics.getHeight(); 

} 
@Override 
public void dispose() { 
    Gdx.app.log("LogGame", "defend dispose"); 
    try { 
     combo0.dispose(); 
     combo1.dispose(); 
     combo2.dispose(); 
     good0.dispose(); 
     good1.dispose(); 
     bad0.dispose(); 
     bad1.dispose(); 
     bad2.dispose(); 
     bad3.dispose(); 
     bad4.dispose(); 
     music.dispose(); 
     music.stop(); 
     spriteBatch.dispose(); 
     font.dispose(); 
     pbar.dispose(); 
     scores.dispose(); 

    } catch (Exception e) { 

    } 

} 
@Override 
public void hide() { 
} 

@Override 
public void pause() { 

    // this.state = State.PAUSE; 
} 
@Override 
public void render(float delta) { 
    SetCamera(CAMERA_WIDTH/2, CAMERA_HEIGHT/2f); 
    switch (state) { 
    case RUN: 
     RunGame(); 
     break; 
    case PAUSE: 
     // do stuff here 

     break; 
    case RESUME: 

     break; 

    default: 
     break; 
    } 

} 
@Override 
public void resize(int arg0, int arg1) { 
} 

@Override 
public void resume() { 
    this.state = State.RESUME; 
} 

@Override 
public void show() { 

    regions = new ArrayList<Integer>(); 

    addRegions(); 
    initSounds(); 
    speedgame = speedgameEasy; 

    stage.addActor(worldActor); 
    stage.addActor(pauseActor); 
    startTime = TimeUtils.millis(); 

    stage.addListener(clickList); 

    FreeTypeFontGenerator generator = new FreeTypeFontGenerator(
      Gdx.files.internal("font/trebuchet_ms.ttf")); 
    FreeTypeFontParameter parameter = new FreeTypeFontParameter(); 
    parameter.size = 25; 
    font = generator.generateFont(parameter); 
    generator.dispose(); 

    pbar = new Texture(Gdx.files.internal("images/bg/line_indicator.png")); 
    scores = new Texture(
      Gdx.files.internal("images/game_images/scorebox.png")); 

    Gdx.input.setInputProcessor(stage); 
    Gdx.input.setCatchBackKey(true); 
}} 

И моя главная вопросов !!! -> что я должен сделать это при действии на паузу, я могу заморозить действие игры и вызвать экран меню (у которого есть кнопка возобновления)? -> что я делаю в резюме onclick, чтобы показать игровое действие? на stackoverflow на других форумах я нахожу некоторые объяснения о моем вопросе, что означает реализовать в резюме некоторый случай переключения с выбором состояния игры, но я не понимаю, как это реализуется в моем коде. Спасибо всем.

+0

Используйте 'game.setScreen (game.menu);'. И чтобы вернуться к игре, используйте 'game.setScreen (game.def);'. – Tenfour04

+0

в методе onClick я должен назвать что-то вроде game.pause() или this.pause() | игра.resume() потому что когда я делаю игра.setScreen (game.menu); и game.setScreen (game.def); моя игра начинается с начала не возобновляется – Alexandro

+0

Это происходит потому, что у вас есть код инициализации в методах 'show' на ваших экранах. Вы должны перенести этот код в конструктор класса. Метод 'show' вызывается методом' game.setScreen', поэтому метод 'show' должен содержать только те вещи, которые вы хотите выполнять каждый раз, когда снова появляется экран. – Tenfour04

ответ

-3

В вашем игровом экране у вас должна быть кнопка (актер, добавленный на сцену), которая реализует ClickListener, который вызывает либо pause(), либо resume() в зависимости от текущего состояния игры.

Это должно выглядеть примерно так:

pauseButton.addListener(new ClickListener() { 
     public void clicked(InputEvent evt, float x, float y) { 
      if (!paused) Gdx.app.getApplicationListener().pause(); 
      else Gdx.app.getApplicationListener().resume(); 
     } 
    }); 

Где paused это логическая переменная в классе игрового экрана.

По-моему, это самый простой способ сделать это.

+0

nononononoononnoo 'pause()' и 'resume()' являются обратными вызовами событий LibGDX, не вызывайте их напрямую! – EpicPandaForce

+0

Неплохо, в этом случае вам следует просто вызвать 'MyGame.pause()', который обычно должен вызывать метод 'pause()' текущего активного экрана. –

+0

На самом деле это должно быть 'Gdx.app.getApplicationListener(). Pause();' –

Смежные вопросы