0

我想知道如何在 lwjgl 中切换显示。你做 swapBuffers(name_of_display) 吗?我的意思是有一个菜单屏幕,我想在不关闭显示窗口的情况下切换到选项屏幕,只是窗口内的面板。

4

1 回答 1

0

这是我处理菜单的游戏容器之一,也许你可以从中得到一些有用的东西。

package catt.main;

import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT;
import static org.lwjgl.opengl.GL11.glClear;

import org.lwjgl.input.Keyboard;
import org.lwjgl.opengl.Display;

import catt.gameMode.Arcade;
import catt.gameMode.Campaign;
import catt.gameMode.Editor;
import catt.gameMode.gameMode;
import catt.gameMode.menu.ArcadeMenu;
import catt.gameMode.menu.CampaignMenu;
import catt.gameMode.menu.ExitMenu;
import catt.gameMode.menu.ExitToMainMenu;
import catt.gameMode.menu.LoadScreen;
import catt.gameMode.menu.MainMenu;
import catt.gameMode.menu.editor.EditorMenu;
import catt.gameMode.menu.editor.LoadMenu;
import catt.gameMode.menu.editor.OverwriteMenu;
import catt.gameMode.menu.editor.SaveMenu;



public class Game {

    enum GameState{
        GAME, MENU;
    }
    enum GameType{

        //Gamemodes
        ARCADE, CAMPAIGN, EDITOR, LOADING,

        //Menus
        M_MAIN, M_ARCADE, M_EDITOR, M_EXIT, M_EXIT_MAIN, M_CAMPAIGN, M_LOAD, M_SAVE, M_OVERWRITE;
    }
    public static gameMode gameMode;
    public static gameMode gameMenu;

    private static GameState GameState;

    private static GameType GameType;
    private static GameType lastGameType;
    private static GameType lastMenu;

    private Boolean isRunning = true;

    private static String saveFile;

    @SuppressWarnings("static-access")
    public Game(){
        GameState = GameState.MENU;
        GameType = GameType.M_MAIN;
        lastMenu = GameType;
    }

    //Gameloop
    public void isRunning(){
        gameLoad();

        while(!Display.isCloseRequested()&&isRunning != false){
            glClear(GL_COLOR_BUFFER_BIT);

            //Subloops
            escape();
            update();


            Display.update(); 
            Display.sync(60);
        }
        setGameType("M_EXIT");
    }

    /**
     * Sets the gameMode or gameMenu to the right active state and loads it.
     */
    @SuppressWarnings("static-access")
    public static void gameLoad(){

        if(GameState == GameState.GAME){
            if(GameType == GameType.ARCADE){
                gameMode = new Arcade();
            }else if(GameType == GameType.CAMPAIGN){
                gameMode = new Campaign();
            }else if(GameType == GameType.EDITOR){
                gameMode = new Editor();
            }else if(GameType == GameType.LOADING){
                gameMode = new LoadScreen();
            }
            gameMode.load();
        }
        else if(GameState == GameState.MENU){
            if(GameType == GameType.M_MAIN){
                gameMenu = new MainMenu();
            }else if(GameType == GameType.M_ARCADE){
                gameMenu = new ArcadeMenu();
            }else if(GameType == GameType.M_CAMPAIGN){
                gameMenu = new CampaignMenu();
            }else if(GameType == GameType.M_EDITOR){
                gameMenu = new EditorMenu();
            }else if(GameType == GameType.M_EXIT){
                gameMenu = new ExitMenu();
            }else if(GameType == GameType.M_SAVE){
                gameMenu = new SaveMenu();
            }else if(GameType == GameType.M_LOAD){
                gameMenu = new LoadMenu();
            }else if(GameType == GameType.M_OVERWRITE){
                gameMenu = new OverwriteMenu(saveFile);
            }else if(GameType == GameType.M_EXIT_MAIN){
                gameMenu = new ExitToMainMenu();
            }
            gameMenu.load();
        }
    }

    /**
     * Checks if the menu should be opened or closed if the escape button is pressed;
     */
    @SuppressWarnings("static-access")
    public void escape(){
        if(Keyboard.isKeyDown(Keyboard.KEY_ESCAPE)){
            if(Keyboard.next()){
                if(GameState == GameState.MENU&&GameType == GameType.M_MAIN){
                    setGameType("M_EXIT");
                }else if(GameState == GameState.MENU&&GameType != GameType.M_MAIN){
                    if(GameType == GameType.M_SAVE
                            ||GameType == Game.GameType.M_LOAD){
                        setGameType("M_LAST");
                    }else{                      
                        setState("GAME");
                    }
                }else if(GameState == GameState.GAME){

                    if(GameType == GameType.ARCADE){
                        setGameType("M_ARCADE");
                    }else if(GameType == GameType.CAMPAIGN){
                        setGameType("M_CAMPAIGN");
                    }else if(GameType == GameType.EDITOR){
                        setGameType("M_EDITOR");
                    }
                }
            }
        }
    }

    /**
     * Switches the game state to the asigned state (Menu or Game)
     */
    @SuppressWarnings("static-access")
    public void update(){
        if(GameState == GameState.MENU){
            gameMenu.update();
            gameMenu.render();
        }else if(GameState == GameState.GAME){
            gameMode.update();
            gameMode.render();
        }
    }

    @SuppressWarnings("static-access")
    public static void setState(String state){
        if(state == "GAME"){
            GameState = GameState.GAME;
            GameType = lastGameType;
        }
        else if(state == "MENU"){
            GameState = GameState.MENU;
            GameType = lastMenu;
        }
    }


    /**
     * Sets the (enum) GameType and GameState to the next GameType/State.
     * @param type
     */
    @SuppressWarnings("static-access")
    public static void setGameType(String type){
        //Gamemodes
        if (type == "ARCADE") {

            GameState = GameState.GAME;
            GameType = GameType.ARCADE;
            lastGameType = GameType.ARCADE;
        } 

        else if (type ==  "CAMPAIGN") {

            GameState = GameState.GAME;
            GameType = GameType.CAMPAIGN;
            lastGameType = GameType.CAMPAIGN;
        } 

        else if (type ==  "EDITOR") {

            GameState = GameState.GAME;
            GameType = GameType.EDITOR;
            lastGameType = GameType.EDITOR;
        }

        //Menus
        else if (type ==  "M_MAIN") {

            GameState = GameState.MENU;
            GameType = GameType.M_MAIN;
            lastMenu = GameType.M_MAIN;
        }

        else if (type ==  "M_ARCADE") {

            GameState = GameState.MENU;
            GameType = GameType.M_ARCADE;
            lastMenu = GameType.M_ARCADE;
        }

        else if (type ==  "M_CAMPAIGN") {

            GameState = GameState.MENU;
            GameType = GameType.M_CAMPAIGN;
            lastMenu = GameType.M_CAMPAIGN;
        }
        else if (type ==  "M_EDITOR") {

            GameState = GameState.MENU;
            GameType = GameType.M_EDITOR;
            lastMenu = GameType.M_EDITOR;
        }
        else if (type ==  "M_LOAD") {

            GameState = GameState.MENU;
            GameType = GameType.M_LOAD;
        }
        else if (type ==  "M_SAVE") {

            GameState = GameState.MENU;
            GameType = GameType.M_SAVE;
        }
        else if (type == "M_OVERWRITE"){
            GameState = GameState.MENU;
            GameType = GameType.M_OVERWRITE;
        }

        else if(type == "M_EXIT_MAIN"){
            GameState = GameState.MENU;
            GameType = GameType.M_EXIT_MAIN;
        }
        else if (type ==  "M_EXIT") {

            GameState = GameState.MENU;
            GameType = GameType.M_EXIT;
        }
        else if(type == "M_LAST"){
            GameState = GameState.MENU;
            GameType = lastMenu;
        }
        gameLoad();
    }
于 2013-11-26T08:43:05.103 回答