Мой код рендеринга LWJGL не работает, я сравниваю его с моим рабочим кодом и не могу найти никаких отличий - PullRequest
0 голосов
/ 25 февраля 2012

Я использую LWJGL для создания игры на Java.Однако это не рендеринг, он настроен так, чтобы просто рендерить 6 плоскостей, каждая из которых направлена ​​внутрь, чтобы окружить камеру в рамке, это очень простой код, и у меня есть рабочий код, который почти точен, просто беспорядочно.

public void start()
{
    try
    {
        Display.create();
        Display.setVSyncEnabled(true);
    }
    catch(LWJGLException e)
    {
        e.printStackTrace();
        System.exit(0);
    }
    fps = new FPSCameraControl(64F, 20F, 64F);

    world = new World("Test", 0, new Vector2f(1024,1024));
    world.generate(128, 128);

    GL11.glEnable(GL11.GL_CULL_FACE);

    GL11.glEnable(GL11.GL_ALPHA);
    GL11.glEnable(GL11.GL_BLEND);

    GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
    GL11.glShadeModel(GL11.GL_SMOOTH);

    GL11.glEnable(GL11.GL_DEPTH_TEST);

    GL11.glDepthFunc(GL11.GL_LEQUAL);

    GL11.glMatrixMode(GL11.GL_PROJECTION);
    GL11.glLoadIdentity();      

    GL11.glMatrixMode(GL11.GL_MODELVIEW);

    GL11.glHint(GL11.GL_PERSPECTIVE_CORRECTION_HINT, GL11.GL_NICEST); 

    Settings.paused = false;
    Settings.paused_state = false;

    disableOrthoView();

    start_game_loop();
}
private static void start_game_loop()
{
    enableOrthoView();

    while(Settings.active)
    {
        GL11.glColor3f(1F, 1F, 1F);

        GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);

        GL11.glMatrixMode(GL11.GL_MODELVIEW);
        GL11.glLoadIdentity();

        //Handle Pause Control
        if(Keyboard.isKeyDown(Keyboard.KEY_P))
        {
            if(!Settings.paused_state)
            {
                Settings.paused = (!Settings.paused);
                Settings.paused_state = true;
            }
        }
        else
        {
            Settings.paused_state = false;
        }
        if(!Settings.paused && Display.isActive())
        {
            fps.onUpdate();
        }
        fps.lookThrough();
        if(Keyboard.isKeyDown(Keyboard.KEY_ESCAPE))
        {
            Settings.active = false;
        }

        GL11.glPushMatrix();

        world.render();

        GL11.glColor3f(1F, 1F, 1F);

        GL11.glPopMatrix();

        GL11.glColor3f(1F, 1F, 1F);

        Display.update();
    }
    Display.destroy();
}
public static void enableOrthoView()
{ 
    GL11.glMatrixMode(GL11.GL_PROJECTION);
    GL11.glPushMatrix();
    GL11.glLoadIdentity();
    GL11.glOrtho( 0, 800 , 600 , 0, -1, 1 );
    GL11.glMatrixMode(GL11.GL_MODELVIEW);
    GL11.glPushMatrix();
    GL11.glLoadIdentity();
}
/**
 * Disables the orthographic view.
 */
public static void disableOrthoView()
{
    GL11.glMatrixMode(GL11.GL_PROJECTION );
    GL11.glPopMatrix();
    GL11.glMatrixMode(GL11.GL_MODELVIEW );
    GL11.glPopMatrix();
}

Код мира выглядит следующим образом:

public class World
{
    HashMap<Integer, HashMap<Integer, Object>> tiles = new HashMap<Integer, HashMap<Integer, Object>>();

    private int mx=0;
    private int my=0;

    public static int height = 0;

    private String name;

    public World(String _name, int _height, Vector2f size)
    {
        name = _name;

        height = _height;

        generate((int)size.x, (int)size.y);
    }
    public void generate(int _x, int _y)
    {
        for(int x = 0;x<_x;x++)
        {
            tiles.put(x, new HashMap<Integer, Object>());
            for(int y = 0;y<_y;y++)
            {
                tiles.get(x).put(y, null);
            }
        }
    }
    public void render()
    {
        GL11.glBegin(GL11.GL_QUADS);

        GL11.glColor3f(1F, 1F, 1F);

        GL11.glNormal3f(0.0F, 1.0F, 0.0F);

        GL11.glVertex3f(0F, 1F, 0F);
        GL11.glVertex3f(0F, 1F, my);
        GL11.glVertex3f(mx, 1F, my);
        GL11.glVertex3f(mx, 1F, 0F);

        GL11.glNormal3f(1.0F, 0.0F, 0.0F);

        GL11.glVertex3f(0F, 1F, 0F);
        GL11.glVertex3f(0F, 100F, 0F);
        GL11.glVertex3f(0F, 100F, my);
        GL11.glVertex3f(0F, 1F, my);

        GL11.glNormal3f(-1.0F, 0.0F, 0.0F);

        GL11.glVertex3f(mx, 1F, 0F);
        GL11.glVertex3f(mx, 100F, 0F);
        GL11.glVertex3f(mx, 100F, my);
        GL11.glVertex3f(mx, 1F, my);

        GL11.glNormal3f(0.0F, 0.0F, -1.0F);

        GL11.glVertex3f(0F, 1F, my);
        GL11.glVertex3f(0F, 100F, my);
        GL11.glVertex3f(mx, 100F, my);
        GL11.glVertex3f(mx, 1F, my);

        GL11.glNormal3f(0.0F, 0.0F, 1.0F);

        GL11.glVertex3f(0F, 1F, 0F);
        GL11.glVertex3f(0F, 100F, 0F);
        GL11.glVertex3f(mx, 100F, 0F);
        GL11.glVertex3f(mx, 1F, 0F);

        GL11.glNormal3f(0.0F, -1.0F, 0.0F);

        GL11.glVertex3f(0F, 100F, 0F);
        GL11.glVertex3f(0F, 100F, my);
        GL11.glVertex3f(mx, 100F, my);
        GL11.glVertex3f(mx, 100F, 0F);
        //COMMENTED OUT - UNIMPLEMENTED - REMOVED FOR TESTING
        /*for(int x = 0;x<mx;x++)
        {
            if(tiles.containsKey(x))
            {
                for(int y = 0;y<my;y++)
                {
                    if(tiles.get(x).containsKey(y))
                    {
                        ((Item)tiles.get(x).get(y)).render(x, y);
                    }
                }
            }
        }*/
        GL11.glEnd();
    }
    public void placeEntityAt(int x, int y, Object entity)
    {
        tiles.get(x).put(y, entity);
    }
    public void save() throws IOException
    {
        PrintWriter file = new PrintWriter(new File("..\\data\\worlds\\"+name+".rnw"));

        for(int x = 0;x<mx;x++)
        {
            if(tiles.containsKey(x))
            {
                for(int y = 0;y<my;y++)
                {
                    if(tiles.get(x).containsKey(y))
                    {
                        Object o = tiles.get(x).get(y);

                        String line = "-t ";

                        line += WorldObjectType.getObjectTypeID(o)+"[";

                        line += ((Item)o).getSaveParams()+"]{"+x+"."+y+"}";

                        file.println(line);
                    }
                }
            }
        }
        file.println("-m '"+name+"' "+mx+"|"+my);
    }
    public void load()
    {

    }
}

FPSCameraControl очень прост, просто использует местоположение мыши для добавления рыскания и тангажа, а затем использует GL11.glRotatef с правильными осями, причинаэтот класс только что скопирован из более раннего теста, который работал полностью.

У меня была эта проблема в течение 3 дней, я постоянно проверял свой код, если кто-то может определить, где есть проблема, пожалуйста, ответьте в ближайшее время.

...