1

我正在尝试从实现 NiftyGUI 的主菜单类开始我的游戏。我正在使用 OpenGL (LWJGL) 和 Java。问题是我永远无法让主菜单消失,然后启动游戏类,即 World.java。

以下是我没有主菜单时通常会做的事情。

package com.dev.voxy;

import com.dev.voxy.utilities.GLScreen;
import com.dev.voxy.world.World;


public class Main extends GLScreen {

public static int WIDTH = 1280;
public static int HEIGHT = 720;

private World world;

public static void main(String[] args) {
    Main main = new Main();
    main.GLScreen(WIDTH, HEIGHT, false, 60, "Voxy");
}

@Override
public void init() {
    world = new World();
}

@Override
public void update() {
    world.update();
}

@Override
public void dispose() {
    world.dispose();
}

那是我的主要课程并扩展了 GLScreen

import org.lwjgl.LWJGLException;
import org.lwjgl.Sys;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;

import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.util.glu.GLU.gluPerspective;



public abstract class GLScreen {
protected static int SCREEN_WIDTH;
protected static int SCREEN_HEIGHT;
protected boolean FULL_SCREEN;
protected static int FPS = 60;
protected static String SCREEN_TITLE;

private static long lastFPS;
private static int lfps;
public static int fps;

public void GLScreen(int width, int height, boolean fullscreen, int sync,     String title) {
    this.SCREEN_HEIGHT = height;
    this.SCREEN_WIDTH = width;
    this.FULL_SCREEN = fullscreen;
    this.FPS = sync;
    this.SCREEN_TITLE = title;
    InitScreen();
}

public void InitScreen() {
    createWindow();
    InitGL();
    init();
    Run();
}


void createWindow() {
    try {
        Display.setFullscreen(FULL_SCREEN);
        Display.setTitle(SCREEN_TITLE);
        DisplayMode displayMode = new DisplayMode(SCREEN_WIDTH, SCREEN_HEIGHT);
        Display.setDisplayMode(displayMode);
        Display.create();
    } catch (LWJGLException e) {
        e.printStackTrace();
    }
}

void InitGL(){
    glEnable(GL_TEXTURE_2D);
    glShadeModel(GL_SMOOTH);
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glClearDepth(1.0);
    glDepthFunc(GL_LEQUAL);

    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);

    glViewport(0, 0, Display.getWidth(), Display.getHeight());
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    gluPerspective(67.0f, SCREEN_WIDTH / SCREEN_HEIGHT, 0.001f, 1000f);   //TODO watch coding universe video
    glMatrixMode(GL_MODELVIEW);

    glEnable(GL_DEPTH_TEST);


    lastFPS = getTime();
}

public abstract void init();

public abstract void update();

public static int getFPS() {
    int cfps;
    if (getTime() - lastFPS > 1000 && lfps != fps) {
        lfps = fps;
        fps = 0; //reset the FPS counter
        lastFPS += 1000; //add one second
        cfps = fps;
    } else {
        cfps = lfps;
    }

    fps++;

    return cfps;
}

public static long getTime() {
    return (Sys.getTime() * 1000) / Sys.getTimerResolution();
}

void Run(){
    while(!Display.isCloseRequested()){
        try{
            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
            glClearColor(0, 0, 0f, 0f);
            glLoadIdentity();
            update();
            Display.update();
            Display.sync(FPS);
    }  catch (Exception e){
            e.printStackTrace();
        }
    }
    dispose();
    destroy();
}


public abstract void dispose();

public void destroy() {
    Display.destroy();
    System.exit(0);
}
}

最后我的世界级在下面。

import com.dev.voxy.Main;
import org.lwjgl.opengl.Display;

import static org.lwjgl.opengl.GL11.glColor3f;
import static org.lwjgl.opengl.GL11.glLoadIdentity;


public class World extends WorldManager {

private Chunk chunk;

public World() {
    super(Main.WIDTH, Main.HEIGHT);
    init();
}

@Override
public void init() {
    chunk = new Chunk(0, 0, 0);
    setRenderStats(true);
}

public void update() {
    input();
    render();
}

public void render() {
    render3D();
    Translate();
    chunk.render();
    glLoadIdentity();

    if (isRenderStats()) {
        render2D();
        glColor3f(1, 1, 1);
        renderStats();
    }
}

@Override
public void dispose() {
    chunk.dispose();
    Display.destroy();
    System.exit(0);
}
}

问题是,当我尝试将菜单合并到其中时,它永远不会起作用。首先,我尝试了 GameStates ,这样每当游戏状态为 GAME 时,nifty 就不再渲染,但这会导致窗口关闭,因为 nifty 不再保持打开状态,所以我尝试让循环位于 MainMenu 类之外,但这也确实不起作用,因为我一直遇到我无法弄清楚的静态/非静态错误。然后我的最后一个想法是为什么不尝试将游戏循环放在 MainMenu 类中,但在我尝试开始游戏时尝试停止漂亮的渲染,但是在屏幕上留下了漂亮的元素,其余的都是空白和 World 类没有渲染。以下是我目前的 Main、MainMenu、GLScreen 和 MyScreenController 和 MainMenu。

所有相关文件和类都可以在以下链接中找到,它们是我试图让主菜单工作的当前文件和类。上面显示的类显示了我所做的只是让游戏部分首先工作,没有菜单。 关联

总而言之,我可以在没有主菜单的情况下让我的游戏工作,我可以在没有游戏的情况下让我的主菜单工作,我尝试了尽可能多的事情,但3天后我就迷失了想要任何建议/建议或想法。我想我只是无法弄清楚当有主菜单和游戏时如何管理游戏状态和游戏循环,我在想是否有办法完全停止漂亮然后清除屏幕然后将 OpenGL 设置为 3D我可以渲染我的游戏,这是我在接近尾声时试图做的,但无法弄清楚。

谢谢你。

4

0 回答 0