当前位置: 首页 > 知识库问答 >
问题:

Libgdx切换屏幕

尹凌龙
2023-03-14

在libGDX中切换屏幕似乎有问题。它会切换到游戏屏幕,但不会切换回主屏幕,也不会切换到屏幕上的游戏。我的游戏课:

@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();
                    }

你可以在这里找到全部来源。

共有2个答案

蓝侯林
2023-03-14

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

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);
                }

我个人喜欢像上面那样使用屏幕。每当我需要更改屏幕时,我将应用程序监听器转换为游戏程序,这样我就可以设置新的(或推送现有的)屏幕。

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

窦志新
2023-03-14

通过将g.runner.set屏幕(新的游戏结束(this))移动到另一个线程来解决这个问题。

 类似资料:
  • 问题内容: 大家好,我仍在从事这个libgdx项目的工作,我试图找出将屏幕切换到游戏屏幕的最佳方法。现在,当单击一个按钮时,我需要它来切换到游戏屏幕。我已经看到了一些扩展游戏类的实现方式,但是我不确定这里最好的方法是什么。如果您看到一些可以改进的代码,请告诉我。 这是主要的应用程序类: 问题答案: 这就是我始终执行屏幕切换的方式: 首先,主类需要扩展Game(From ),然后您需要具有一个新的t

  • 大家好,我仍然在做这个libgdx项目,我正在努力找出最好的方法来改变我的游戏屏幕现在,当一个按钮被点击时,我需要它转换到游戏屏幕。我见过一些扩展game类的实现,但我不确定从这里开始最好的方法是什么。如果你看到一些可以改进的代码,请让我知道。 以下是主要的应用程序类:

  • 嗨,我在libgdx切换屏幕时遇到了问题。我正在建造一个小行星游戏克隆。因此,首先呈现我的Main MenuScreen类(使用Fitviewport),然后我调用setScreen()到GameScreen(GameScreen不使用Fitviewport),除了第二个屏幕呈现为使用Fitviewport。如果我调整第二个屏幕的大小,那么整个窗口用于渲染。为什么会发生这种情况?这里有一些图片..

  • 我们正在使用libgdx开发一款游戏,我们希望能够切换屏幕。我制作了一个GameOverScreen,它实现了Screen: 我的问题是我不知道如何在我的主课上设置屏幕。我看到的大多数示例都显示了一个扩展游戏的主类(com.badlogic.gdx.Game)。但我们的主类实现ApplicationListener,不扩展游戏: 因此,我不能使用来自Game类的setScreen方法。所以我如何能

  • 当我的游戏结束时,我试图改变屏幕到游戏结束屏幕,但它没有这样做,只是闪烁当前的游戏屏幕。 游戏结束画面

  • 我是Libgdx新手,我编写了一个扩展游戏类的类,问题是游戏中的setScreen()方法没有交换屏幕,因为在我设置屏幕之后,我的游戏仍然只渲染游戏类中渲染方法中的内容,而不是screen类的渲染方法中的内容。代码如下: 如果用户运行此代码,即使在用户触摸(单击)屏幕时更改屏幕,我也只会看到一个红色屏幕