1

自分でエンジンを作ろうとしていますが、助けが必要です。

私は現在レベルシステムをやっています。レベルクラスはrenderクラスを拡張し、レベルクラスはRenderクラスのrenderメソッドをオーバーライドします。最後に、レンダリングクラスはメインクラスから呼び出されますが、レベルクラスは呼び出しません。

編集:

staticを削除しましたが、renderメソッドを呼び出すことができません。私は自分がとてもおとなしいことを知っています。

package SimpleEngine.Render;

レンダリングクラス(これは呼ばれます)

import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT;
import SimpleEngine.Primitives.*;
import static org.lwjgl.opengl.GL11.glClear;

public class Render {

    public void Render() {

    }

}

レベルクラス(これは呼び出されません)このRenderメソッドでRenderクラスのrenderメソッドをオーバーライドしたいのですが、機能しません。

package SimpleEngine.Level;

    import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT;
    import static org.lwjgl.opengl.GL11.glClear;
    import SimpleEngine.Render.*;
    import SimpleEngine.Primitives.*;

    public class Level extends Render {

        public void Render() {
            glClear(GL_COLOR_BUFFER_BIT);
            Primitives.DrawSquare(200, 200, 50, 50, 1, 0, 0);
        }

    }

私のメインメソッド(renderを呼び出しますが、もうできません)

package SimpleEngine;

import org.lwjgl.LWJGLException;
import SimpleEngine.Level.*;
import SimpleEngine.Logic.*;
import SimpleEngine.Input.*;
import SimpleEngine.Render.*;
import SimpleEngine.Entites.*;
import SimpleEngine.Timer.*;
import org.lwjgl.Sys;
import org.lwjgl.input.Keyboard;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;

import static org.lwjgl.opengl.GL11.*;

public class simpleEngine {

    public static final int WIDTH = 640;
    public static final int HEIGHT = 480;
    private static boolean isRunning = true;


    public static void main(String[] args) {
        setUpDisplay();
        setUpOpenGL();
        Entity.setUpEntities();
        Timer.setUpTimer();
        while (isRunning) {
            Render.Render();
            Logic.logic(Timer.getDelta());
            Input.input();
            Display.update();
            Display.sync(60);
            if (Display.isCloseRequested()) {
                isRunning = false;
            }
        }
        Display.destroy();
        System.exit(0);
    }

    private static void setUpDisplay() {
        try {
            Display.setDisplayMode(new DisplayMode(WIDTH, HEIGHT));
            Display.setTitle("SimpleEngine");
            Display.create();
        } catch (LWJGLException e) {
            e.printStackTrace();
            Display.destroy();
            System.exit(1);
        }
    }

    private static void setUpOpenGL() {
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho(0, 640, 480, 0, 1, -1);
        glMatrixMode(GL_MODELVIEW);
    }

}
4

3 に答える 3

5

静的メソッドをオーバーライドすることはできません。

Oracletutorailによる

サブクラスがスーパークラスのクラスメソッドと同じシグネチャを持つクラスメソッドを定義する場合、サブクラスのメソッドはスーパークラスのメソッドを非表示にします。

スーパークラスのインスタンスメソッドをサブクラスのクラスメソッドに、またはその逆に変更しようとすると、コンパイル時エラーが発生します。

クラスメソッドstaticから削除し、レベルクラスメソッドをに変更して、オーバーライド動作を導入しますRenderrender()Renderrender()

編集:

 while (isRunning) {
            new Level().Render(); 

注:Javaの命名規則では、メソッド名は小文字で始まり、名前はキャメルケースである必要があります。

于 2013-01-11T21:15:52.210 に答える
3

静的メソッドをオーバーライドすることはできません。

また、Java は大文字と小文字を区別する言語であるためRender()、 と同じではなくrender()、まったく異なるメソッドになる可能性があるため、注意してください。

于 2013-01-11T21:21:44.320 に答える
0

ゲームが実際に向かっている方向のように見える状態の共通メソッドを定義するインターフェイスを持つなど、より一般的なことを行うことをお勧めします。これは、Logic と Render クラスを組み合わせるだけです。例えば:

public Interface IGameState {

    public void update(int delta);

    public void render();
}

そして、次のようなそのインターフェースを実装するクラスを持つことができます。

public class InGameState implements IGameState {

    public InGameState() { }

    // This is similar to your Logic class
    public void update(int delta) {
        // Perform any updates necessary such as handling keyboard input
    }

    public void render() {
        // What you included in your example
        glClear(GL_COLOR_BUFFER_BIT);
        Primitives.DrawSquare(200, 200, 50, 50, 1, 0, 0);
    }

}

そして、メインメソッドは次のようになります。

public static final int WIDTH = 640;
public static final int HEIGHT = 480;
private static boolean isRunning = true;
private IGameState currentGameState;

public static void main(String[] args) {
    setUpDisplay();
    setUpOpenGL();
    Entity.setUpEntities();
    Timer.setUpTimer();
    // Create a new game state
    currentGameState = new InGameState();
    while (isRunning) {
        // Change to this type of thing
        // The delta would be the time since last frame so you can stay frame rate                       
        // independent
        currentGameState.update(delta);
        currentGameState.render();
        Display.update();
        Display.sync(60);
        if (Display.isCloseRequested()) {
            isRunning = false;
        }
    }
    Display.destroy();
    System.exit(0);
}
于 2013-01-12T07:11:09.260 に答える