【问题标题】:Libgdx switching screensLibgdx 切换画面
【发布时间】:2016-01-24 10:47:49
【问题描述】:

我似乎在 libGDX 中切换屏幕时遇到问题。它会切换到 GameScreen,但不会切换回主屏幕,也不会切换到游戏结束屏幕。 我的游戏课:

@Override
public void create() {
    menu();
}

public void play(){
    this.setScreen(new GameSc(this));
    play = true;
}
public void menu(){


    this.setScreen(new GameMenu(this));
    menu = true;
}
public void gameOver(){

    this.setScreen(new GameOver(this));

}

我的 GameScreen 类(实现屏幕):

public GameSc(GameRunner runner) {
    this.runner = runner;

    background = new Texture(Gdx.files.internal("Textures/background.png"));
    batch = new SpriteBatch();




    box = new Box(this);

    txt = new Texture(Gdx.files.internal("Textures/Enemies/Boxers/Enemy.png"));

    snakes = new ArrayList<Snake>();
    enemies = new ArrayList<Enemy>();

    shape = new ShapeRenderer();

    Gdx.gl.glClearColor(1f, 1f, 1f, 1f);

    new Thread(new Runnable() {

        @Override
        public void run() {
            while(true){
                update();
            }

        }
    }).start();

    snakeThread();
    enemyThread();
}

@Override
public void show() {


    //initialize

}



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



}



@Override

public void render(float dt) {

    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    //Drawing an image.
    batch.begin();
    batch.draw(background, 0,0 , Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
    batch.end();
    box.render(batch);
            for (int i = 0; i < snakes.size(); i++) {

                snakes.get(i).render(shape);
            }

    for (int i = 0; i < enemies.size(); i++) {
        enemies.get(i).render(batch);
    }

}
public void update(){

    box.update();
    for (int i = 0; i < snakes.size(); i++) {
        snakes.get(i).update();
    }

    for (int i = 0; i < snakes.size(); i++) {

        if(!(snakes.get(i).isAlive)){
            snakes.remove(i);
            System.out.println(snakes.size());
        }


    }

}

private void snakeThread(){
    new Thread(new Runnable() {
    Random r = new Random();
    //float[]anglem = {30,40,50,60,70,80,90,100};   

    @Override
    public void run() {
        while(true){
            int x = r.nextInt(Gdx.graphics.getWidth()-50);
            int y = r.nextInt(Gdx.graphics.getHeight()-50);
            int delay = r.nextInt((6000-2000)+1)+2000;
            int speed = MathUtils.random(50, 150);
            float angle = (float) r.nextInt((110-30)+1)+30;
            int length = MathUtils.random(15, 25);
            try {
                spawnSnake(x, y, angle, length, speed);
                //System.out.println(delay);
                Thread.sleep(delay);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }

    }
}).start();

    box.update();
}

private void enemyThread(){
    new Thread(new Runnable() {

        @Override
        public void run() {
            while(true){
                int x = MathUtils.random(Enemy.UNIFORM_WIDTH, Gdx.graphics.getWidth()-Enemy.UNIFORM_WIDTH);
                int y = 0;
                int speed = 15;
                int delay = MathUtils.random(400, 600);


                try {
                    spawnEnemy(x, y, speed, txt);
                        for (int i = 0; i < enemies.size(); i++) {
                            if(enemies.get(i).getY()<0){
                                enemies.remove(i);
                            }

                        }

                    Thread.sleep(delay);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

            }

        }
    }).start();

    box.update();
}


public void spawnSnake(int x, int y, float angle, int length, int speed){
    Snake snake = new Snake(angle,new Vector2(x,y),speed,length);
    snakes.add(snake);

}

public void spawnEnemy(int x, int y, int speed, Texture currentTexture){
    Enemy enemy = new Enemy(x , y , speed, Enemy.UNIFORM_WIDTH, Enemy.UNIFORM_HEIGHT, txt);
    enemies.add(enemy);

}



@Override
public void pause() {


}

@Override
public void resume() {


}

@Override
public void dispose() {
    if(runner.menu==false){
        runner.getScreen().dispose();
        shape.dispose();
        batch.dispose();
        }


}



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

}

这就是我改变屏幕的方式(不起作用):

if (bounds.contains(g.snakes.get(i).snake.get(y).x, g.snakes.get(i).snake.get(y).y) && isAlreadyTouched) {
                    isAlreadyTouched = false;
                    g.runner.play=false;
                    g.runner.gameOver();
                    }

你可以找到完整的来源here

【问题讨论】:

    标签: java android libgdx screen


    【解决方案1】:

    设法通过将 g.runner.setScreen(new GameOver(this)) 移动到另一个线程来解决此问题。

    【讨论】:

    • 为此目的使用线程最终会让你发疯。
    • 我有 2 个单独的线程:一个用于渲染,第二个用于更新(滴答)。为什么它在渲染线程中起作用,但在更新线程中却没有。
    【解决方案2】:

    有很多方法可以解决问题,我不想通读您发布的源代码,但您发布的行肯定不会改变屏幕。

    if (bounds.contains(g.snakes.get(i).snake.get(y).x, g.snakes.get(i).snake.get(y).y) && isAlreadyTouched) {
                        isAlreadyTouched = false;
                        g.runner.play=false;
                        g.runner.gameOver();
                        }
    

    我不确定您源的架构,可能会有由g.runner.gameOver(); 或 g.runner.play = false` 触发的侦听器事件,然后以下解决方案最终会给您造成混乱。

    if (bounds.contains(g.snakes.get(i).snake.get(y).x, g.snakes.get(i).snake.get(y).y) && isAlreadyTouched) {
                        isAlreadyTouched = false;
                        g.runner.play=false;
                        g.runner.gameOver();
                        //Now set a screen
                        ((Game)Gdx.app.getApplicationListener).setScreen(new GameOver(this);
                    }
    

    我个人喜欢像上面那样使用屏幕。每当我需要更改屏幕时,我都会将 ApplicationListener 转换为 Game,这样我就可以设置新的(或推送现有的)屏幕。

    但就像我说的,您可能已经删除或尚未实现应该调用 Game 类中的方法来更改屏幕的代码。

    【讨论】:

    • GameOver 方法本质上将屏幕设置为 GameOver。将应用程序侦听器投射到游戏也不起作用。
    • ((Game)Gdx.app.getApplicationListener).setScreen(new GameOver(this); 将更改屏幕,检查您的语句是否运行。然后如果屏幕show 方法运行。它可能会在初始切换后立即切换屏幕。学习调试和记录。
    猜你喜欢
    • 2015-01-16
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-13
    • 1970-01-01
    相关资源
    最近更新 更多