【问题标题】:LibGDX How to put the game in the table? *** FIXED ***LibGDX 如何将游戏放在桌面上? *** 固定的 ***
【发布时间】:2020-03-24 03:51:23
【问题描述】:

我有一个游戏屏幕,我想在其中实现游戏本身和控制按钮。我使用 TABLE 将此屏幕分为两部分。 控制按钮和游戏在不同的类中实现。一切正常,除了显示游戏。

如何让游戏适合顶部窗口?

游戏画面代码

public class GameScreen implements Screen {
    private Main parent;
    private Stage stage;
    public static SnakeControl snakeControl;
    private SpriteBatch batch;
    private GameControl game;

    public GameScreen(Main main) {
        parent = main;

        stage = new Stage(new ScreenViewport());
        Gdx.input.setInputProcessor(stage);
        snakeControl = new SnakeControl();

        GameAssets.instance().loadAssets();
        batch = new SpriteBatch();
        game = new GameControl();
    }

    @Override
    public void show() {
        Table table = new Table();
        table.setFillParent(true);
        table.setDebug(true);

        table.row();
        table.add(game).expand().pad(10f, 5f, 10f, 5f);
        table.row();
        table.add(snakeControl.get_tSnakeControl()).fillX().height(GameInfo.SCREEN_HEIGHT/3.5f).pad(0f, 5f, 10f, 5f);

        stage.addActor(table);
    }

    @Override
    public void render(float delta) {
        game.update(Gdx.graphics.getDeltaTime());
        clearScreen();
        batch.begin();
        game.render(batch);
        stage.act(Gdx.graphics.getDeltaTime());
        stage.draw();
        batch.end();
    }

    private void clearScreen() {
        Gdx.gl.glClearColor(0f, 0f, 0f, 1f);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    }

    @Override
    public void resize(int width, int height) {
        stage.getViewport().update(width, height, true);
    }

    @Override
    public void pause() {

    }

    @Override
    public void resume() {

    }

    @Override
    public void hide() {

    }

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

游戏代码

public class GameControl extends Actor {

    private Board board;
    private Snake snake;
    private float timeState;
    private BitmapFont font;

    private GameObject food;
    private boolean isGameOver;

    public GameControl() {
        TextureAtlas atlas = GameAssets.instance().get(GameAssets.SNAKE_PACK);
        font = GameAssets.instance().get(GameAssets.PIXEL_FONT);
        snake = new Snake(atlas);
        board = new Board(snake, GameInfo.SCREEN_WIDTH, GameInfo.SCREEN_HEIGHT);
        food = board.generateFood();
        init();
    }

    private void init() {
        GameSoundsPlayer.init();
        GameSoundsPlayer.playMusic(GameAssets.MEMO_SOUND, false);
    }

    public void update(float delta) {
        if (snake.hasLive()) {
            timeState += delta;
            snake.handleEvents();
            if (timeState >= .09f) {
                snake.moveBody();
                timeState = 0;
            }
            if (snake.isCrash()) {
                snake.reset();
                snake.popLife();
                GameSoundsPlayer.playSound(GameAssets.CRASH_SOUND, false);
            }
            if (snake.isFoodTouch(food)) {
                GameSoundsPlayer.playSound(GameAssets.EAT_FOOD_SOUND, false);
                Scorer.score();
                snake.grow();
                food = board.generateFood();
            }
        } else {
            gameOver();
            if (Gdx.input.isKeyJustPressed(Input.Keys.ANY_KEY)) start();
        }
    }

    private void gameOver() {
        isGameOver = true;
        GameSoundsPlayer.stopMusic(GameAssets.MEMO_SOUND);
        GameSoundsPlayer.playMusic(GameAssets.GAME_OVER_SOUND, false);
    }

    private void start() {
        GameSoundsPlayer.playMusic(GameAssets.MEMO_SOUND, false);
        GameSoundsPlayer.stopMusic(GameAssets.GAME_OVER_SOUND);

        isGameOver = false;
        snake.reset();
        snake.restoreHealth();
        food = board.generateFood();
        Scorer.reset();
    }

    public void render(SpriteBatch batch) {
        board.render(batch);
        food.draw(batch);
        snake.render(batch);

        if (isGameOver) {
            font.draw(batch, "GAME OVER", (GameInfo.SCREEN_WIDTH - 100) / 2, (GameInfo.SCREEN_HEIGHT + 100) / 2);
            font.draw(batch, "Press any key to continue", (GameInfo.SCREEN_WIDTH - 250) / 2, (GameInfo.SCREEN_HEIGHT + 50) / 2);
        }

        font.draw(batch, "Player: ", GameInfo.SCALE * 4, GameInfo.SCREEN_HEIGHT - 10);
        font.draw(batch, "Score: " + Scorer.getScore(), GameInfo.SCALE / 2, GameInfo.SCREEN_HEIGHT - 10);
        font.draw(batch, "Size: " + snake.getBody().size(), GameInfo.SCALE / 2, GameInfo.SCREEN_HEIGHT - 40);
    }
}

【问题讨论】:

    标签: java android android-studio libgdx


    【解决方案1】:

    我为此使用了视口!!!

    @Override
        public void render(float delta) {
    
            clearScreen();
            Gdx.gl.glViewport(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight()/3);
            stage.act(Gdx.graphics.getDeltaTime());
            stage.draw();
    
            Gdx.gl.glViewport(0, Gdx.graphics.getHeight()/3, Gdx.graphics.getWidth(), (Gdx.graphics.getHeight() - Gdx.graphics.getHeight()/3));
            game.update(Gdx.graphics.getDeltaTime());
            batch.begin();
            game.render(batch);
            batch.end();
        }
    

    【讨论】:

      猜你喜欢
      • 2017-03-10
      • 1970-01-01
      • 2014-01-16
      • 1970-01-01
      • 2013-09-09
      • 1970-01-01
      • 2016-07-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多