Java 将OpenGL与LWJGL一起使用赢得';我看不出一幅画

Java 将OpenGL与LWJGL一起使用赢得';我看不出一幅画,java,eclipse,opengl,render,Java,Eclipse,Opengl,Render,我正在尝试基于TheBennyBox的youtube系列创建和制作RPG游戏,到目前为止,我有8个类,它们应该用openGL显示一个正方形,并且能够移动正方形,尽管我的正方形没有在屏幕上显示出来。以下是我对重要类的代码: 主要内容: package com.base.engine; import java.util.logging.Level; import java.util.logging.Logger; import org.lwjgl.LWJGLExce

我正在尝试基于TheBennyBox的youtube系列创建和制作RPG游戏,到目前为止,我有8个类,它们应该用openGL显示一个正方形,并且能够移动正方形,尽管我的正方形没有在屏幕上显示出来。以下是我对重要类的代码: 主要内容:

    package com.base.engine;
    import java.util.logging.Level;
    import java.util.logging.Logger;

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

    import com.base.game.Game;

    import static org.lwjgl.opengl.GL11.*;
    public class Main {
        private static Game game;
    public static void main(String[] args){
        initDisplay();
        initGL();
        initGame();
        gameLoop();
    }
    private static void gameLoop(){
        while(!Display.isCloseRequested()){
            getInput();
            update();
            render();
        }
    }
    private static void initGame(){
        game = new Game();
    }
    private static void render() {
        glClear(GL_COLOR_BUFFER_BIT);
        glLoadIdentity();
        Display.update();
        Display.sync(60);
        game.render();
    }
    private static void update() {
        game.update();

    }
    private static void getInput() {
        game.getInput();

    }
    private static void initGL(){
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho(0,Display.getWidth(),0,Display.getHeight(),-1,1);
        glMatrixMode(GL_MODELVIEW);
        glDisable(GL_DEPTH_TEST);
        glClearColor(0,0,0,0);
    }
    private static void cleanUp(){
        Display.destroy();
        Keyboard.destroy();
    }

    private static void initDisplay(){
        try {
            Display.setDisplayMode(new DisplayMode(800,600));
            Display.create();
            Keyboard.create();
            Display.setVSyncEnabled(true);
        } catch (LWJGLException ex) {
            // TODO Auto-generated catch block
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE,null,ex);
        }

    }

    }
游戏:

雪碧:

    package com.base.engine;
    import static org.lwjgl.opengl.GL11.*;
    public class Sprite {
    private float r;
    private float g;
    private float b;
    private float sx;
    private float sy;
    public Sprite(float r,float g,float b,float sx,float sy){
        this.g=g;
        this.r=r;
        this.b=b;
        this.sx=sx;
        this.sy=sy;

    }
        public void render() {
            glColor3f(r,g,b);
            glBegin(GL_QUADS);
            {
            glVertex2f(0,0);
            glVertex2f(0,sy);
            glVertex2f(sx,sy);
            glVertex2f(sx,0);
            }
            glEnd();

        }
    public float getSx(){
        return sx;
    }
    public float getSy(){
        return sy;
    }
    public void setSx(float sx){
        this.sx = sx;
    }
    public void setSy(float sy){
        this.sy=sy;
    }
    }
玩家:

    package com.base.game.gameobject;
    import org.lwjgl.input.Keyboard;

    import com.base.engine.GameObject;
    import com.base.engine.Sprite;
    public class Player extends GameObject{
        public static final float SIZE = 32;

    public Player(float x, float y){
        init(x,y,0.1f,1f,0.25f,SIZE,SIZE);
    }
    public void getInput(){
        if(Keyboard.isKeyDown(Keyboard.KEY_W)){
            move(0,1);
        }
        if(Keyboard.isKeyDown(Keyboard.KEY_S)){
            move(0,-1);
        }
        if(Keyboard.isKeyDown(Keyboard.KEY_A)){
            move(-1,0);
        }
        if(Keyboard.isKeyDown(Keyboard.KEY_D)){
            move(0,1);
        }

    }
    private void move(float magX,float magY){
        x += getSpeed()-magX;
        y += getSpeed()-magY;
    }
    public float getSpeed(){
        return 4f;
    }
    }

还有其他的,但这些是最重要的。很抱歉有这么多代码。我不知道出了什么问题。

我不是LWJGL方面的专家,但通常在渲染后调用同步函数。按照当前的编写方式,我假设您在缓冲区交换后(即帧缓冲区的内容发送到屏幕后)绘制图片,但下一次渲染迭代将清除该图片。尝试重新安排一些事情:

private static void render() {
    glClear(GL_COLOR_BUFFER_BIT);
    glLoadIdentity();

    game.render();

    Display.update();
    Display.sync(60);
}
请注意,还有许多其他的东西是不正确的。帧渲染迭代的标准前导是设置视口和投影。也就是说,initGL中的所有代码都属于渲染开始时

    package com.base.game.gameobject;
    import org.lwjgl.input.Keyboard;

    import com.base.engine.GameObject;
    import com.base.engine.Sprite;
    public class Player extends GameObject{
        public static final float SIZE = 32;

    public Player(float x, float y){
        init(x,y,0.1f,1f,0.25f,SIZE,SIZE);
    }
    public void getInput(){
        if(Keyboard.isKeyDown(Keyboard.KEY_W)){
            move(0,1);
        }
        if(Keyboard.isKeyDown(Keyboard.KEY_S)){
            move(0,-1);
        }
        if(Keyboard.isKeyDown(Keyboard.KEY_A)){
            move(-1,0);
        }
        if(Keyboard.isKeyDown(Keyboard.KEY_D)){
            move(0,1);
        }

    }
    private void move(float magX,float magY){
        x += getSpeed()-magX;
        y += getSpeed()-magY;
    }
    public float getSpeed(){
        return 4f;
    }
    }
private static void render() {
    glClear(GL_COLOR_BUFFER_BIT);
    glLoadIdentity();

    game.render();

    Display.update();
    Display.sync(60);
}