08. シーン - hannsi-to/LFJG-LiteFrameJavaGui GitHub Wiki

LFJGのシーンは一つのクラスに対して一つ作成できます。シーン機能を利用することで、別々の用途の描画が行えるようになりコードの可読性があがります。 シーンを作成するには親クラスの LFJGFrame にシーンシステムを埋め込み 子クラスの IScene を登録することでシーン描画が行えるようになります。また 子クラスの IScene の中にシーンシステムを埋め込むことも可能です。

シーンシステム

グローバル変数に SceneSystem sceneSystem を作成します。 init()関数で sceneSystem = SceneSystem.initSceneSystem(); 追加します。 drawFrame()関数内でシーンの描画を行うため sceneSystem.drawFrameScenes(); を追加します。 stopFrame()関数内でもシーンの停止とシーンシステムのクリーンアップを行うため 

sceneSystem.stopFrameScenes();
sceneSystem.cleanup();

を追加します。以下はサンプルコードです。

public class MainFrame implements LFJGFrame {
    SceneSystem sceneSystem;
    Frame frame;

    public static void main(String[] args) {
        new MainFrame().setFrame();
    }

    @Override
    public void init() {
        frame.updateLFJGLContext();

        sceneSystem = SceneSystem.initSceneSystem();
    }

    @Override
    public void drawFrame() {
        sceneSystem.drawFrameScenes();
    }

    @Override
    public void stopFrame() {
        sceneSystem.stopFrameScenes();
        sceneSystem.cleanup();
    }

    @Override
    public void setFrameSetting() {

    }

    public void setFrame() {
        frame = new Frame(this, "MainFrame");
    }
}

シーン

シーンを作成します。親クラスとは違う子クラスを作成します。 子クラスには IScene インターフェイスを実装します。グローバル変数に

Frame frame;
Scene scene;

子クラスのコンストラクターに

public Scene1(Frame frame) {
    this.frame = frame;
    this.scene = new Scene("Scene1", this);
}

そしてインターフェイス実装によって作成されたgetScene()関数の戻り値に scene を渡してください。 以下がサンプルコードです。

public class Scene1 implements IScene {
    Frame frame;
    Scene scene;

    public Scene1(Frame frame) {
        this.frame = frame;
        this.scene = new Scene("Scene1", this);
    }

    @Override
    public void init() {

    }

    @Override
    public void drawFrame() {

    }

    @Override
    public void stopFrame() {

    }

    @Override
    public Scene getScene() {
        return scene;
    }
}

上記と同じようにもう一つシーンを作成します。

public class Scene2 implements IScene {
    Frame frame;
    Scene scene;

    public Scene2(Frame frame) {
        this.frame = frame;
        this.scene = new Scene("Scene2", this);
    }

    @Override
    public void init() {

    }

    @Override
    public void drawFrame() {

    }

    @Override
    public void stopFrame() {

    }

    @Override
    public Scene getScene() {
        return scene;
    }
}

登録とシーン切り替え

いくつかのシーンを作成したらそれをシーンシステムに登録しないといけません。そのためには addScene()関数を使用します。

sceneSystem = SceneSystem.initSceneSystem()
        .addScene(new Scene1(frame).getScene())
        .addScene(new Scene2(frame).getScene())
        .initScenes();

そしてどのシーンを描画するかを決めるために setCurrentScene()関数を使用して決めます。

sceneSystem = SceneSystem.initSceneSystem()
        .addScene(new Scene1(frame).getScene())
        .addScene(new Scene2(frame).getScene())
        .setCurrentScene("Scene1")
        .initScenes();

これによりScene1が描画されます。 以下はサンプルコードです。

public class MainFrame implements LFJGFrame {
    SceneSystem sceneSystem;
    Frame frame;

    public static void main(String[] args) {
        new MainFrame().setFrame();
    }

    @Override
    public void init() {
        frame.updateLFJGLContext();

        sceneSystem = SceneSystem.initSceneSystem()
                .addScene(new Scene1(frame).getScene())
                .addScene(new Scene2(frame).getScene())
                .setCurrentScene("Scene1")
                .initScenes();
    }

    @Override
    public void drawFrame() {
        sceneSystem.drawFrameScenes();
    }

    @Override
    public void stopFrame() {
        sceneSystem.stopFrameScenes();
        sceneSystem.cleanup();
    }

    @Override
    public void setFrameSetting() {

    }

    public void setFrame() {
        frame = new Frame(this, "MainFrame");
    }
}