1

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 がレンダリングされないようにしましたが、nifty が開いたままにならなくなったため、ウィンドウが閉じてしまいました。そのため、ループを MainMenu クラスの外に配置しようとしましたが、それも行われました。把握できなかった静的/非静的エラーが発生し続けたため、機能しませんでした。次に、私の最後のアイデアは、ゲームループを MainMenu クラス内に配置しようとせず、ゲームを開始しようとしている間、気の利いたレンダリングを停止しようとしたが、気の利いた要素が画面に残り、残りは空白で、World クラスレンダリングしませんでした。以下は、現在の Main、MainMenu、GLScreen、MyScreenController、および MainMenu です。

関連するすべてのファイルとクラスは、次のリンクで見つけることができます。これらは、メイン メニューを機能させようとしている現在のものです。上記のクラスは、メニューなしでゲーム部分のみを最初に動作させるために私が何をしたかを示しています。 リンク

要約すると、メイン メニューがない場合でもゲームを動作させることができ、ゲームがない場合でもメイン メニューを動作させることができます。考えられる限り多くのことを試しましたが、3 日後には単純に迷子になり、提案/推奨事項またはアイデアをお願いします。メインメニューとゲームがあるときにゲームの状態とゲームループを管理する方法を理解できないと思います.niftyを完全に停止してから画面をクリアしてからOpenGLを3Dに設定する方法があるかどうか考えていました.私は自分のゲームをレンダリングすることができます。これは私が最後にやろうとしていたことですが、理解できませんでした。

ありがとうございました。

4

0 に答える 0