0

私は自分のゲームにキーボードクラスを実装しようとしていて、以下の例外を受け取りました。これは単なるスニペットです。完全な例外は、これより長い期間続きます。

Exception in thread "main" java.lang.StackOverflowError
at org.lwjgl.opengl.DisplayMode.<init>(DisplayMode.java:63)
at oregon.client.Oregon.<init>(Oregon.java:10)
at oregon.src.Controller.<init>(Controller.java:9)
at oregon.client.Oregon.<init>(Oregon.java:12)
at oregon.src.Controller.<init>(Controller.java:9)
at oregon.client.Oregon.<init>(Oregon.java:12)
at oregon.src.Controller.<init>(Controller.java:9)

メインクラス(oregon.client.Oregon)のコードは次のとおりです。

package oregon.client;

import oregon.src.Controller;

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

public class Oregon {
    public DisplayMode normal = new DisplayMode(640, 640);

    public Controller controls = new Controller();

    public boolean fullscreen = false;

    public void start() {
        try {
            create();
        } catch (LWJGLException e) {
            stop(e);
        }

        while (!Display.isCloseRequested()) {
            events();
            Display.update();
        }

        Display.destroy();
    }

    public void events() {
        try {
            controls.getInput();
        } catch (LWJGLException e) {
            stop(e);
        }
    }

    public void setFullscreen() {
        try {
            if (!fullscreen) {
                Display.setFullscreen(true);
                fullscreen = true;
            } else if (fullscreen) {
                Display.setDisplayMode(normal);
                fullscreen = false;
            }
        } catch (LWJGLException e) {
            stop(e);
        }
    }

    public void create() throws LWJGLException {
        if (fullscreen) {
            Display.setFullscreen(true);
        } else if (!fullscreen) {
            Display.setDisplayMode(normal);
        }

        Display.create();
    }

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

    public void stop(Exception e) {
        e.printStackTrace();
        System.exit(0);
        Display.destroy();
    }

    public static void main(String args[]) {
        Oregon oregon = new Oregon();
        oregon.start();
    }
}

そして、これが私のキーボードクラスのコードです:-

package oregon.src;

import oregon.client.Oregon;

import org.lwjgl.LWJGLException;
import org.lwjgl.input.Keyboard;

public class Controller {
    public Oregon oregon = new Oregon();

    public void getInput() throws LWJGLException {
        while (Keyboard.next()) {
            if (Keyboard.getEventKeyState()) {
                if (Keyboard.getEventKey() == Keyboard.KEY_F11) {
                    oregon.setFullscreen();
                }
            }
        }
    }
}

LWJGLの専門家がいる場合は、私を助けていただけませんか。ありがとう、そして私は私がいくつかの助けを得ることを願っています。:D

4

2 に答える 2

3

LWJGLとは何の関係もありません。単純なコードでのスタック オーバーフローは、常に偶発的な無限ループが原因です。あなたは1つを持っています:Controllerを作成しようとしますOregon(この行: public Oregon oregon = new Oregon();)、次に を作成Controllerしようとします... (など..)

于 2012-06-17T11:48:09.253 に答える
2

OregonインスタンスControllerを作成すると、インスタンスが作成され、インスタンスが作成され、Oregonインスタンスが作成され、Controllerインスタンスが作成されます...

おそらくすべきことはOregon、コントローラーでインスタンスを作成するのではなく、既存のインスタンスをパラメーターとしてControllerコンストラクターに渡し、それを格納することです (またはその逆)。

擬似コード:

public Oregon() {
  controller = new Controller(this);
  ...
}
public Controller(Oregon oregon) {
  this.oregon = oregon;
  ...
}
于 2012-06-17T11:50:04.353 に答える