java - 两种渲染方法在两个屏幕上同时工作

标签 java libgdx

我正在尝试在 LibGDX 中制作井字游戏,我想从用户玩游戏的屏幕 (PlayGround) 移动到显示结果的屏幕 (End),但 PlayGround 屏幕中的渲染方法仍然被调用,尽管我已经将屏幕更改为 End。经过调试,我发现只调用了 End 屏幕中的 show 方法,但渲染方法仍然是从 PlayGround 调用的,而不是从 End 调用的。

Playground 代码:

public class PlayGround implements Screen {

MainMenu game;
Stage stage;
Texture gridTex;
Image gridImage ;
TextButton restart ;
TextButtonStyle style ;
String turn ;
SpriteBatch batch;
Zone[] zones = new Zone[9];
End end;
XO game1;




public PlayGround(MainMenu game){
    this.game = game;
}



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


}

@Override
public void show() {

    game1 = new XO();
    end = new End(this);

    //Draw Grid
    gridTex = new Texture("images/playground/grid.png");
    gridImage = new Image(gridTex);
    batch = new SpriteBatch();
    gridImage.setPosition(40, 100);

    //Draw Restart

    style = new TextButtonStyle();
    style.font = MainMenu.defaultFont;
    TextureRegionDrawable drawable =new TextureRegionDrawable(Zone.atlas.findRegion("restart"));
    style.up  = drawable ;
    style.down = drawable ;
    restart = new TextButton("Restart",style);

    //Create the Zones
    zones[0] = new Zone(50, 378);
    zones[1] = new Zone(151, 378);
    zones[2] = new Zone(251, 378);
    zones[3] = new Zone(50, 242);
    zones[4] = new Zone(151, 242);
    zones[5] = new Zone(251, 242);
    zones[6] = new Zone(50, 108);
    zones[7] = new Zone(151, 108);
    zones[8] = new Zone(251, 108);

    restart.addListener(new InputListener() {
        public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) {
            for(int i = 0 ; i < zones.length ; i++)
            {
                zones[i].setPlayer(0) ;
                zones[i].setClicked(false);
                zones[i].getImage().setDrawable(new TextureRegionDrawable(Zone.atlas.findRegion("empty"))); 
            }
            Zone.counter = 1 ;

            return true;

        }

        public void touchUp (InputEvent event, float x, float y, int pointer, int button) {

        }
    });


    //Creating the stage and adding actors
    stage = new Stage(380, 630, true);
    stage.addActor(gridImage);
    for(int i = 0 ; i< zones.length ; i++)
        stage.addActor(zones[i].getImage());
    stage.addActor(restart);
    Gdx.input.setInputProcessor(stage);




}

@Override
public void render(float delta) {

    //It clears the older screen
    Gdx.gl.glClearColor(0, 0, 0, 1);
    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
    System.out.println(Zone.counter);
    if(Zone.counter%2==0)
    {turn = "O's TURN";}
    else
    {turn = "X's TURN";}

    check();

    //Drawing the stage and it's children's
    batch.begin();
    stage.draw();
    batch.end();

    batch.begin();
    MainMenu.title.draw(batch,turn, 114 , 570);
    batch.end();

    //Fires the listeners
    stage.act(delta);

}

public void check()
{
    //Horizontal
    for(int i = 0 ; i<7;i += 3)
    {
        if(zones[i].getPlayer()==1 && zones[i+1].getPlayer()==1 && zones[i+2].getPlayer()==1)
        {
            System.out.println("Player 1 wins");
            End.setWinner(1);
            stage.clear();
            game1.setScreen(end);

        }
        else if(zones[i].getPlayer()==2 && zones[i+1].getPlayer()==2 && zones[i+2].getPlayer()==2)
        {
            System.out.println("Player 2 wins");
            End.setWinner(2);
            stage.clear();
            game1.setScreen(end);
        }
        else if (Zone.counter == 10)
        {
            stage.clear();
            game1.setScreen(end);
        }
    }
    //Vertical :
    for(int i = 0 ; i<3;i++)
    {
        if(zones[i].getPlayer()==1 && zones[i+3].getPlayer()==1 && zones[i+6].getPlayer()==1)
        {
            System.out.println("Player 1 wins");
            End.setWinner(1);
            stage.clear();
            game1.setScreen(end);
        }
        else if(zones[i].getPlayer()==2 && zones[i+3].getPlayer()==2 && zones[i+6].getPlayer()==2)
        {
            System.out.println("Player 2 wins");
            End.setWinner(2);
            stage.clear();
            game1.setScreen(end);
        }
        else if (Zone.counter == 10)
        {System.out.println("Tie");
        stage.clear();
        game1.setScreen(end);
        }
    }
    //Diagonal LeftToRight
    if(zones[0].getPlayer()==1 && zones[4].getPlayer()==1 && zones[8].getPlayer()==1)
    {System.out.println("Player 1 wins");
    End.setWinner(1);
    stage.clear();
    game1.setScreen(end);
    }
    if(zones[0].getPlayer()==2 && zones[4].getPlayer()==2 && zones[8].getPlayer()==2)
    {System.out.println("Player 2 wins");
    End.setWinner(2);
    stage.clear();
    game1.setScreen(end);
    }

    //Diagonal RightToLeft
    if(zones[2].getPlayer()==1 && zones[4].getPlayer()==1 && zones[6].getPlayer()==1)
    {System.out.println("Player 1 wins");
    End.setWinner(1);
    stage.clear();
    game1.setScreen(end);
    }
    if(zones[2].getPlayer()==2 && zones[4].getPlayer()==2 && zones[6].getPlayer()==2)
    {System.out.println("Player 2 wins");
    End.setWinner(2);
    stage.clear();
    game1.setScreen(end);
    }
}

结束屏幕中的代码:

package com.teamthawra.www.Screens;



public class End implements Screen {

static int winner = 0;
SpriteBatch batch;
static Stage stage;
XO game;
MainMenu main;
PlayGround playground;

public End (PlayGround playground) {

    this.playground = playground;
}

@Override
public void render(float delta) {
    Gdx.gl.glClearColor(0, 0, 0, 1);
    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
    System.out.println("Rendering in end");
    if (winner == 1){
        batch.begin();
        MainMenu.title.draw(batch, "X WON!", 114, 570);
        batch.end();
    }
    else if (winner == 2){
        batch.begin();
        MainMenu.title.draw(batch, "O WON!", 114, 570);
        batch.end();
    }
    else {
        batch.begin();
        MainMenu.title.draw(batch, "It's a tie", 114, 570);
        batch.end(); }
    batch.begin();  
    MainMenu.title.draw(batch, "Press anywhere to continue", 114, 300);
    batch.end();
}

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


}

@Override
public void show() {
    System.out.println("I am at end");
    game = new XO();
    main = new MainMenu(this);
    stage = new Stage(380, 630 , true);
    Gdx.input.setInputProcessor(stage);
    stage.addListener(new InputListener() {
    public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) {
        stage.clear();
    game.setScreen(main);
            return true;
    }

    public void touchUp (InputEvent event, float x, float y, int pointer, int button) {

   }
  });

    }

public static void setWinner(int winner) {
    End.winner = winner;
}

public static int getWinner() {
    return winner;
}





    }

抱歉添加了所有代码,因为我是初学者,这是我在 LibGDX 中的第一个程序,我不知道问题到底出在哪里。

最佳答案

我不完全确定,但我最好的猜测是在 game1(XO 类型的新对象)上调用 setScreen() 是问题所在。

如果我是正确的,您应该在为屏幕 PlayGround 调用 setScreen() 的同一个时间游戏对象(或从 LibGdx 的游戏继承的对象)上调用 setScreen()

例如,如果您有一个菜单“屏幕”,并且从那里您可以使用以下命令进入 Playground :

game.setScreen(playGroundScreen);

您应该在同一个游戏对象上切换屏幕,如下所示:

game.setScreen(endScreen);

而不是创建一个新变量(就像您对 game1 所做的那样)。

让我知道它是否有效。

关于java - 两种渲染方法在两个屏幕上同时工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20445935/

相关文章:

java - 未分类的MongoDbException : Command failed with error 10107 (NotMaster): 'not master' on server

java - 如何使用java在tensorflow中训练模型

java - 无法定位元素 : error when executing code through POM, 通过单个 main() 程序执行时,相同的定位器工作正常

java - 如何使用 java 驱动程序框架在集合中复制 mongodb 文档

java - Android libgdx : splash screen not showing immediately after launcher icon pressed

java - List<String> 减去 List<String>

java - slider 在表格中始终具有默认宽度

gradle - 如何解决 ':ios:copyNatives FAILED'。在配置容器上找不到属性 'natives'

android - 如何从android后端调用核心方法?

java - LibGDX 纹理可绘制?