1

先生们美好的一天,我已经开始开发一个使用很多屏幕(introscreen、splashscreen、previewscreen、mainmenuscreen 等)的游戏,并且遇到了以下一些问题:

从屏幕切换到其他屏幕有时无响应或有故障,有时会一遍又一遍地重复同一个屏幕。我已经回收了一个我计划在不同窗口中使用的后退按钮,但它只在一个窗口中可见,但在另一个窗口中可见。我将屏幕实现到 SCREENS,这是否必须对抽象屏幕类做任何事情,因为正如我在不同的示例代码中看到的那样,它们将屏幕扩展到实现屏幕的某个类。

我对这部分很困惑,我希望能找到一个适当的解决方案来解决这个问题。

有没有一种方法可以正确导航或使其对我的屏幕更具响应性?它是否有助于提高我将创建屏幕管理器的游戏性能?屏幕管理器应该有哪些实例?

这是我的 mainmenuscreen 代码,它遇到了后退按钮的问题。

public class MainMenuScreen implements Screen {

public static final String LOG = "MainMenu Class";
private OrthographicCamera camera;
private SpriteBatch batch;
private Texture texture = Assets.bgmenu;
private Sprite sprite;
private static Stage stage;
private static DugManMainClass game;
private TextButton tb;
private TextButton tb2;
private TextButton tb3;
private TextButton tb4;
private TextButton tb5;
private TextButton load;
private TextButton newgame;
private TextButton back;
private TextButton saveslot1;
private TextButton saveslot2;
private TextButton saveslot3;
private TextButton loadslot1;
private TextButton loadslot2;
private TextButton loadslot3;
private Window ww;
private Window storywindow;
private Window newgamesaveslotwindow;
private Window loadgameloadslotwindow;
private static float time = 0;
private float temp;



public MainMenuScreen(DugManMainClass game)
{
    this.game = game;
}

@Override
public void dispose() {

    Gdx.app.log(MainMenuScreen.LOG, "Disposing...");
    batch.dispose();
    texture.dispose();
    stage.dispose();

}

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

@Override
public void pause() {
}

@Override
public void resume() {
}

@Override
public void render(float delta) {

    Gdx.app.log(MainMenuScreen.LOG, "Rendering...");


    temp += Gdx.graphics.getDeltaTime();
    while(temp>1.0f/60.0f)
    {
        MainMenuScreen.tick();
        temp -=1.0f/60.0f;
    }

    Gdx.gl.glClearColor(1, 1, 1, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

    stage.act(Gdx.graphics.getDeltaTime());

    batch.setProjectionMatrix(camera.combined);
    batch.begin();
    batch.disableBlending();
    sprite.draw(batch);
    batch.end();

    batch.begin();
    batch.enableBlending();
    stage.draw();
    batch.end();
    // TODO Auto-generated method stub
    }

@Override
public void show() {


    Gdx.app.log(MainMenuScreen.LOG, "Showing SplashScreen...");

    float w = Gdx.graphics.getWidth();
    float h = Gdx.graphics.getHeight();
    camera = new OrthographicCamera(1, h/w);
    //(x,y)
    //camera = new 
    batch = new SpriteBatch();

    stage = new Stage(w,h,true);

    Assets.bgsound.play(1f);

    Gdx.input.setInputProcessor(stage);

    stage.clear();

    texture.setFilter(TextureFilter.Linear, TextureFilter.Linear);

    TextureRegion region = new TextureRegion(texture, 0, 0, texture.getWidth(), texture.getHeight());

    sprite = new Sprite(region);
    sprite.setSize(1f, 1f * sprite.getHeight() / sprite.getWidth());
    sprite.setOrigin(sprite.getWidth()/2, sprite.getHeight()/2);
    sprite.setPosition(-sprite.getWidth()/2, -sprite.getHeight()/2);

    Skin skin = new Skin(Assets.atlas);

    TextButtonStyle ts = new TextButtonStyle();
    ts.up = skin.getDrawable("btnpressed");
    ts.down = skin.getDrawable("btnunpressed");
    ts.font = Assets.menufont2;

    //main menu
    tb = new TextButton("Story mode", ts);
    tb.padTop(5).padBottom(5).padLeft(5).padRight(5);
    tb.addListener(new InputListener() 
    {

            public boolean touchDown(InputEvent event, float x, float y,
                            int pointer, int button) {
                    return true;
            }

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

                    time = 0;
                    storywindow.setVisible(true);
                    ww.setVisible(false);
                    Assets.pressedsound.play(1f);


            }
    });


    tb2 = new TextButton("Arcade", ts);
    tb2.padTop(5).padBottom(5).padLeft(5).padRight(5);
    tb2.addListener(new InputListener() 
    {

            public boolean touchDown(InputEvent event, float x, float y,
                            int pointer, int button) {
                    return true;
            }

            public void touchUp(InputEvent event, float x, float y,
                            int pointer, int button) {
                    Assets.pressedsound.play(1f);

            }
    });

    tb3 = new TextButton("Time Trial", ts);
    tb3.padTop(5).padBottom(5).padLeft(5).padRight(5);
    tb3.addListener(new InputListener() 
    {

            public boolean touchDown(InputEvent event, float x, float y,
                            int pointer, int button) {
                    return true;
            }

            public void touchUp(InputEvent event, float x, float y,
                            int pointer, int button) {
                time = 0;
                    Assets.pressedsound.play(1f);

            }
    });

    tb4 = new TextButton("Option",ts);
    tb4.padTop(5).padBottom(5).padLeft(5).padRight(5);
    tb4.addListener(new InputListener() 
    {

            public boolean touchDown(InputEvent event, float x, float y,
                            int pointer, int button) {
                    return true;
            }

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

                    Assets.pressedsound.play(1f);

            }
    });


    tb5 = new TextButton("Exit",ts);
    tb5.padTop(5).padBottom(5).padLeft(5).padRight(5);
    tb5.addListener(new InputListener() 
    {

            public boolean touchDown(InputEvent event, float x, float y,
                            int pointer, int button) {
                    return true;
            }

            public void touchUp(InputEvent event, float x, float y,
                            int pointer, int button) {
                    Assets.pressedsound.play(1f);
                    Gdx.app.exit();

            }
    });
    //storymode-newgame
    newgame = new TextButton("New Game", ts);
    newgame.padTop(5).padBottom(5).padLeft(5).padRight(5);
    newgame.addListener(new InputListener() 
     {

        public boolean touchDown(InputEvent event, float x, float y,
                        int pointer, int button) {
                return true;
        }

        public void touchUp(InputEvent event, float x, float y,
                        int pointer, int button) {
                newgamesaveslotwindow.setVisible(true);
                storywindow.setVisible(false);
                Assets.pressedsound.play(1f);

        }
     });

    //newgamesaveslot
    saveslot1 = new TextButton("Save slot 1", ts);
    saveslot1.padTop(5).padBottom(5).padLeft(5).padRight(5);
    saveslot1.addListener(new InputListener() 

     {

        public boolean touchDown(InputEvent event, float x, float y,
                        int pointer, int button) {
                return true;
        }

        public void touchUp(InputEvent event, float x, float y,
                        int pointer, int button) {
                game.setScreen(new LoadingScreen(game));
                Assets.ekek.play(1f);
                Assets.bgsound.stop();

        }
     });

    saveslot2 = new TextButton("Save slot 2", ts);
    saveslot2.padTop(5).padBottom(5).padLeft(5).padRight(5);
    saveslot2.addListener(new InputListener() 
     {

        public boolean touchDown(InputEvent event, float x, float y,
                        int pointer, int button) {
                return true;
        }

        public void touchUp(InputEvent event, float x, float y,
                        int pointer, int button) {
                game.setScreen(new DugManGameScreen(game));
                Assets.ekek.play(1f);
                Assets.bgsound.stop();

        }
     });

    saveslot3 = new TextButton("Save slot 3", ts);
    saveslot3.padTop(5).padBottom(5).padLeft(5).padRight(5);
    saveslot3.addListener(new InputListener() 
     {

        public boolean touchDown(InputEvent event, float x, float y,
                        int pointer, int button) {
                return true;
        }

        public void touchUp(InputEvent event, float x, float y,
                        int pointer, int button) {
                game.setScreen(new DugManGameScreen(game));
                Assets.ekek.play(1f);
                Assets.bgsound.stop();

        }
     });

    //storymode-loadgames
    load = new TextButton("Load game", ts);
    load.padTop(5).padBottom(5).padLeft(5).padRight(5);
    load.addListener(new InputListener() 

     {

        public boolean touchDown(InputEvent event, float x, float y,
                        int pointer, int button) {
                return true;
        }

        public void touchUp(InputEvent event, float x, float y,
                        int pointer, int button) {
                loadgameloadslotwindow.setVisible(true);
                ww.setVisible(false);
                storywindow.setVisible(false);
                Assets.pressedsound.play(1f);


        }
     });

    //loadsaveslot
    loadslot1 = new TextButton("load slot 1", ts);
    loadslot1 .padTop(5).padBottom(5).padLeft(5).padRight(5);
    loadslot1 .addListener(new InputListener() 

     {

        public boolean touchDown(InputEvent event, float x, float y,
                        int pointer, int button) {
                return true;
        }

        public void touchUp(InputEvent event, float x, float y,
                        int pointer, int button) {
                game.setScreen(new DugManGameScreen(game));
                Assets.pressedsound.play(1f);
                Assets.bgsound.stop();

        }
     });

    loadslot2 = new TextButton("load slot 2", ts);
    loadslot2 .padTop(5).padBottom(5).padLeft(5).padRight(5);
    loadslot2 .addListener(new InputListener() 
     {

        public boolean touchDown(InputEvent event, float x, float y,
                        int pointer, int button) {
                return true;
        }

        public void touchUp(InputEvent event, float x, float y,
                        int pointer, int button) {
                game.setScreen(new DugManGameScreen(game));
                Assets.pressedsound.play(1f);
                Assets.bgsound.stop();

        }
     });
    loadslot3 = new TextButton("load slot 3", ts);
    loadslot3 .padTop(5).padBottom(5).padLeft(5).padRight(5);
    loadslot3 .addListener(new InputListener() 
     {

       public boolean touchDown(InputEvent event, float x, float y,
                       int pointer, int button) {
               return true;
       }

       public void touchUp(InputEvent event, float x, float y,
                       int pointer, int button) {
            game.setScreen(new DugManGameScreen(game));
            Assets.pressedsound.play(1f);
            Assets.bgsound.stop();

       }
     });

    back = new TextButton("back", ts);
    back.padTop(5).padBottom(5).padLeft(5).padRight(5);
    back.addListener(new InputListener() 
     {

        public boolean touchDown(InputEvent event, float x, float y,
                        int pointer, int button) {
                return true;
        }

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


            if(storywindow.isVisible()==true)
            {
                ww.setVisible(true);
                storywindow.setVisible(false);
                 Assets.pressedsound.play(1f);
            }
            else if(newgamesaveslotwindow.isVisible()==true)
            {
                ww.setVisible(false);
                storywindow.setVisible(true);
                newgamesaveslotwindow.setVisible(false);
                 Assets.pressedsound.play(1f);
            }
            else if(loadgameloadslotwindow.isVisible()==true)
            {
                ww.setVisible(false);
                storywindow.setVisible(true);
                loadgameloadslotwindow.setVisible(false);
                 Assets.pressedsound.play(1f);
            }




        }

     });




    WindowStyle www = new WindowStyle();
    www.background = skin.getDrawable("windowmenu1");
    www.titleFont = Assets.menufont2;

    ww = new Window("", www);
    ww.setPosition(0,0);
    ww.setY(10);
    ww.setX(260);

    ww.defaults().spaceBottom(10);
    ww.padTop(25);
    ww.padLeft(50);
    ww.padRight(50);
    ww.row().fill().expandX();
    ww.add(tb);
    ww.row().fill().expandX();
    ww.add(tb2);
    ww.row().fill().expandX();
    ww.add(tb3);
    ww.row().fill().expandX();
    ww.add(tb4);
    ww.row().fill().expandX();
    ww.add(tb5);
    ww.padBottom(25);
    ww.pack();

    storywindow = new Window("",www);
    storywindow.setPosition(0, 0);
    storywindow.setY(10);
    storywindow.setX(260);
    storywindow.defaults().spaceBottom(10);
    storywindow.padTop(25);
    storywindow.padLeft(50);
    storywindow.padRight(50);
    storywindow.row().fill().expandX();
    storywindow.add(newgame);
    storywindow.row();
    storywindow.add(load);
    storywindow.row();
    storywindow.add(back);
    storywindow.padBottom(25);
    storywindow.pack();
    storywindow.setVisible(false);

    newgamesaveslotwindow = new Window("",www);
    newgamesaveslotwindow.setPosition(0, 0);
    newgamesaveslotwindow.setY(10);
    newgamesaveslotwindow.setX(260);
    newgamesaveslotwindow.defaults().spaceBottom(10);
    newgamesaveslotwindow.padTop(25);
    newgamesaveslotwindow.padLeft(50);
    newgamesaveslotwindow.padRight(50);
    newgamesaveslotwindow.row();
    newgamesaveslotwindow.add(saveslot1);
    newgamesaveslotwindow.row();
    newgamesaveslotwindow.add(saveslot2);
    newgamesaveslotwindow.row();
    newgamesaveslotwindow.add(saveslot3);
    newgamesaveslotwindow.row();
    newgamesaveslotwindow.add(back);
    newgamesaveslotwindow.padBottom(25);
    newgamesaveslotwindow.pack();
    newgamesaveslotwindow.setVisible(false);

    loadgameloadslotwindow = new Window("",www);
    loadgameloadslotwindow.setPosition(0, 0);
    loadgameloadslotwindow.setY(10);
    loadgameloadslotwindow.setX(260);
    loadgameloadslotwindow.defaults().spaceBottom(10);
    loadgameloadslotwindow.padTop(25);
    loadgameloadslotwindow.padLeft(50);
    loadgameloadslotwindow.padRight(50);
    loadgameloadslotwindow.row().fill().expandX();
    loadgameloadslotwindow.add(loadslot1);
    loadgameloadslotwindow.row().fill().expandX();
    loadgameloadslotwindow.add(loadslot2);
    loadgameloadslotwindow.row().fill().expandX();
    loadgameloadslotwindow.add(loadslot3);
    loadgameloadslotwindow.row().fill().expandX();
    loadgameloadslotwindow.add(back);
    loadgameloadslotwindow.padBottom(25);
    loadgameloadslotwindow.pack();
    loadgameloadslotwindow.setVisible(false);


    stage.addActor(storywindow);
    stage.addActor(newgamesaveslotwindow);
    stage.addActor(loadgameloadslotwindow);
    stage.addActor(ww);

}

public static void tick() {

    time++;

    if (time > 60 * 10) {

        game.setScreen(new NewPreviewScreen(game));
        Assets.bgsound.stop();

    }


}

}

至于我遇到无响应屏幕的其他问题,这是我的预览屏幕代码。

public class PreviewScreen implements Screen {

private static DugManMainClass game;
private SpriteBatch batch;
private OrthographicCamera camera;
private Texture tx1 = Assets.bgmenu;
private BitmapFont font = Assets.menufont2;
private final static List<String> lines = new ArrayList<String>(); 
private static int time = 0;
private float temp = 0;
private Sprite s;


public PreviewScreen(DugManMainClass game) {

    this.game = game;

    try
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(Gdx.files.internal("previewtext.txt").read()));
        String line = "";
        while ((line = br.readLine()) != null) {
            lines.add(line);
        }
        br.close();
    } 
    catch(Exception e)
    {
        e.printStackTrace();
    }


}


@Override
public void render(float delta) {
    float w = s.getHeight();

    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

    temp += Gdx.graphics.getDeltaTime();


    while(temp>1.0f/60.0f)
    {
        PreviewScreen.tick();
        temp -=1.0f/60.0f;

        s.setU(temp+1f);
        s.setU2(temp+1f);

    }





    batch.setProjectionMatrix(camera.combined);
    batch.begin();
    s.draw(batch);

    int yo = time / 4;



    for (int y = 0; y <= s.getHeight() / 12; y++) 
    {
        int yl = yo / 12 + 420 / 12 - y;
        if (yl >= 0 && yl < lines.size()) 
        {
            font.draw(batch,lines.get(yl), (800 - 30 * 12) / 2,  y * 12 + yo % 12);

        }
    }

    batch.end();



}


@Override
public void show() {

    batch = new SpriteBatch();

    float w = 800;
    float h = 420;

    camera = new OrthographicCamera();
    camera.setToOrtho(false, w, h);

    tx1.setWrap(TextureWrap.Repeat, TextureWrap.Repeat);

    s = new Sprite(tx1);
    s.setPosition(0, 0);


    Assets.bgsound3.play(1f);
    // TODO Auto-generated method stub

}


@Override
public void dispose() {

    Assets.dispose();

}

public static void tick() {
    time++;

    if (Gdx.input.isKeyPressed(Keys.ENTER) || Gdx.input.isTouched()) {
        game.setScreen(new splashscreen(game));
        Assets.bgsound3.stop();
    }

    if (time / 4 > lines.size() * 10 + 250) {


        game.setScreen(new splashscreen(game));
        Assets.bgsound3.stop();
    }

}

}

当它接收到输入或完成显示文本时,它会将屏幕设置为闪屏,并且在启动后它将进入介绍和主菜单,反之亦然。

4

1 回答 1

2

我看到了一些令人担忧的事情,但首先我将关注手头的问题:

private static int time = 0;

您在屏幕中使用了一个静态变量,并且似乎只有在您按下 MainMenuScreen 上的按钮时才将它们重置为 0。这意味着下次显示屏幕时,该值将导致屏幕切换,并且将永远来回翻转(并导致很多延迟)。

其他问题:

您在代码中存储了大量的静态状态,这确实令人不悦。这是一篇很好的帖子(请参阅有关影响的部分),其中讨论了与之相关的问题。大多数编程指南都会建议不要这样做。

考虑寻找更好的变量名称,甚至使用数组而不是编号变量。它将简化您的代码并使其更具可读性。

您还应该考虑在屏幕类之外重构/委托代码。这样您就可以分离关注点,而不是将所有内容都放入您的课程中。现在这不是问题,但随着您扩展游戏,它会很快成为问题。

于 2013-07-23T19:11:27.730 回答