繁体   English   中英

在一堂课MyGdxGame中编写了整个游戏。 我如何主菜单? libgdx

[英]Wrote the whole game in one class MyGdxGame. How do i mae the main menu? libgdx

我有一个大问题。我是从ApplicationAdapter扩展到同一类MyGdxGame编写的整个游戏。 如何制作主菜单? 这样,在打开游戏时,将打开主菜单,在其中按下1个按钮可打开游戏本身(MyGdxGame)? 告诉我怎么做(创建什么,更改什么)

最好具有较高的内聚性,但是当您在一个类中进行编码时,内聚性会变得很低。

使用ScreenGame类来实现一个以上的屏幕,例如MainScreenGameScreenLevelScreen ...

但是,如果您不想在MyGdxGame类中为不同的屏幕实现使用标记。

public enum GameScreen{
    MENU_SCREEN, GAME_SCREEN, LEVELSCREEN;
}

MyGdxGame render方法中

public GameScreen currentScreen=GameScreen.MENU_SCREEN;

@Override
public void render() {

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

    if(currentScreen==GameScreen.MENU_SCREEN){

        //render objects for Menu Screen

    }else if(currentScreen==GameScreen.GAME_SCREEN){

        //render objects for Game Screen
    }
}

要在其他屏幕上移动时,请更改currentScreen值。

@Override
public boolean touchDown(int screenX, int screenY, int pointer, int button) {

    if(currentScreen==GameScreen.MENU_SCREEN){

        //detect button of MenuScreen by bounds or any other way
        if(check in bound){
            currentScreen==GameScreen.GAME_SCREEN;
        }

    }else if(currentScreen==GameScreen.GAME_SCREEN){

        // for Game Screen
    }
    return false;
}

编辑

Pelocho建议在枚举内使用抽象方法。

public enum GameScreen{
        MENU_SCREEN{

            @Override
            public void render(MyGdxGame gdxGame) {

            }
        }, GAME_SCREEN{

            @Override
            public void render(MyGdxGame gdxGame) {

            }

        }, LEVELSCREEN{

            @Override
            public void render(MyGdxGame gdxGame) {

            }
        };

        public abstract void render(MyGdxGame gdxGame);
    }

以及MyGdxGame内部render方法

@Override
public void render() {

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

    currentScreen.render(this);
}

您应该正确地执行此操作,而不是侵入菜单。如果您查看Screen类,它具有与ApplicationAdapter大致相同的方法(显示,渲染,调整大小,布置,隐藏,暂停,恢复)。 如果要创建一个新类并使其实现Screen ,则可以开始从主类剪切/粘贴到该Screen类。 如果Create方法中包含某些内容,则将其放入Show方法或构造函数中。 然后,您为主菜单,选项,信用等创建另一个Screen

您是否已从Game而不是ApplicationAdapter扩展了MyGdxGame主类, ApplicationAdapter删除除create方法之外的所有方法。 在create方法中,您可以加载资产并像setScreen(new MenuScreen())一样调用第一个屏幕。 要更改屏幕,您有几种选择。

  • 通过屏幕传递Game对象,以便执行game.setScreen(..)
  • 拥有某种带有public static方法的屏幕管理器来更改屏幕。
  • Gdx.app.getApplicationListener可以Gdx.app.getApplicationListener到游戏中。 这样,您可以在LibGDX应用程序中的任何位置更改屏幕。 ((Game)Gdx.app.getApplicationListener).setScreen(myScreen)

如果您担心会破坏功能,请备份游戏的当前状态。 对于每个程序员来说,将代码从大类抽象到新的小类都是一项重要的任务,因此这将是一个很好的实践。 如果您在任何时候觉得某个代码段应该属于另一个/新类,请随时这样做。 事情有很多方法,并且使代码可读性和可理解性是您的第一要务。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM