1

我正在尝试制作自己的引擎,但我需要一些帮助。

我目前正在做水平系统。关卡类扩展了渲染类,而关卡类覆盖了渲染类的渲染方法。最后从主类调用渲染类,但我不调用关卡类。

编辑:

我已经删除了静态,但现在无法调用渲染方法。我知道我很笨,我有点自学。

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() {

    }

}

Level Class (This is not called) 我希望这个 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);
        }

    }

我的主要方法(调用渲染但不能再)

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

您不能覆盖静态方法。

根据Oracle 教程

如果子类定义了与超类中的类方法具有相同签名的类方法,则子类中的方法会隐藏超类中的方法。

如果您尝试将超类中的实例方法更改为子类中的类方法,则会收到编译时错误,反之亦然。

staticRender类方法中删除render()并将 Level 类Render方法更改为render()以引入覆盖行为

编辑:

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

注意:Java 命名约定建议方法名应以小写字母开头,名称应为驼峰式。

于 2013-01-11T21:15:52.210 回答
3

您不能覆盖静态方法。

另外,请注意,因为 Java 是一种区分大小写的语言,因此Render()render()不同,并且可能是完全不同的方法。

于 2013-01-11T21:21:44.320 回答
0

我建议做一些更通用的事情,比如有一个接口,它为你的游戏可能处于的任何状态定义通用方法,实际上看起来就像你前进的方向。这只会结合你的逻辑和渲染类。例如:

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 回答