如何从NiftyGUI主菜单开始我的游戏

时间:2015-02-03 05:36:32

标签: java render lwjgl voxel nifty-gui

我正在尝试从实现NiftyGUI的Main Menu类开始我的游戏。我正在使用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应该不再呈现,但是这会导致Window关闭,因为nifty不再保持打开状态,所以我试着让循环在MainMenu Class之外但是也做了不行,因为我一直遇到静态/非静态错误,这是我无法弄清楚的。然后我的最后一个想法就是为什么不尝试将游戏循环放在MainMenu类中但是在我尝试启动游戏时尝试停止漂亮的渲染,但是在屏幕上留下了漂亮的元素,其余的是空白的和世界级的没有呈现。以下是我当前的Main,MainMenu,GLScreen和MyScreenController以及MainMenu.xml文件MyscreenController控制按下相应按钮时会发生什么,MainMenu.xml是一个漂亮的xml文件。

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

总而言之,我可以在没有主菜单的情况下让我的游戏工作,并且我可以在没有游戏的情况下让我的主菜单工作,我已经尝试了很多我能想到的东西,但在3天之后我会#39 ;我只是输了,想要任何建议/推荐或想法。我想我无法弄清楚当有主菜单和游戏时如何管理游戏状态和游戏循环,我想也许是否有办法完全停止漂亮然后清除屏幕然后设置OpenGL到3D我可以让我的游戏渲染,这是我试图在接近结束时做的但是无法弄明白。

谢谢。

0 个答案:

没有答案