2013-08-19 4 views
0

В настоящее время я занимаюсь созданием 2D, сверху вниз игры с использованием LWJGL/OpenGL, но у меня возникают некоторые проблемы после рисования сущностей, чтобы заставить их двигаться, после того как они 'были визуализированы с использованием объектов буфера Vertex. Это метод Run() из визуализации потока, наряду с методами нАлАдкИ:LWJGL/OpenGL Vertex Buffer Object

// Render thread 
public void run() { 
    setUpDisplay(); 
    setUpOpenGL(); 
    setUpEntities(); 
    while (isRunning) { 
     getFPS(); 
     drawEntities(); 
     Display.update(); 
     Display.sync(60); 
     if (Display.isCloseRequested()) { 
      isRunning = false; 
     } 
    } 
    destroyEntities(); 
    Display.destroy(); 
    System.exit(0); 
} 

// Initialisation method for the display 
private void setUpDisplay() { 
    try { 
     Display.setDisplayMode(new DisplayMode(WIDTH, HEIGHT)); 
     Display.setTitle("Roguelike"); 
     Display.create(); 
    } catch (LWJGLException e) { 
     e.printStackTrace(); 
    } 
} 

// Initialisation method for OpenGL 
private void setUpOpenGL() { 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(0, 640, 480, 0, 1, -1); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    glEnable(GL_TEXTURE_2D); 
    glEnable(GL_BLEND); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
    lastFrame = Main.getTime(); 
} 

И лица наследуют эти методы из абстрактного суперкласса, чтобы настроить РВО и рисовать примитивы (метод drawEntities в визуализации нить просто вызывает этот метод, и метод обновления объекта (см ниже), в то время как setUpEntities вызывает метод нАлАдкИ):

// Method to initialise VBOs for a given entity 
public void setUp() { 
    vertexData = BufferUtils.createFloatBuffer(12); 
    vertexData.put(getVertices()); 
    vertexData.flip(); 

    textureData = BufferUtils.createFloatBuffer(12); 
    textureData.put(textureVertices); 
    textureData.flip(); 

    vboVertexHandle = glGenBuffers(); 
    glBindBuffer(GL_ARRAY_BUFFER, vboVertexHandle); 
    glBufferData(GL_ARRAY_BUFFER, vertexData, GL_STATIC_DRAW); 
    glBindBuffer(GL_ARRAY_BUFFER, 0); 

    vboTextureCoordHandle = glGenBuffers(); 
    glBindBuffer(GL_ARRAY_BUFFER, vboTextureCoordHandle); 
    glBufferData(GL_ARRAY_BUFFER, textureData, GL_STATIC_DRAW); 
    glBindBuffer(GL_ARRAY_BUFFER, 0); 
} 

// Method to draw the entity 
public void draw() { 
    glBindTexture(GL_TEXTURE_2D, loadTexture(this.textureKey).getTextureID()); 

    glBindBuffer(GL_ARRAY_BUFFER, this.vboVertexHandle); 
    glVertexPointer(2, GL_FLOAT, 0, 0L); 

    glBindBuffer(GL_ARRAY_BUFFER, this.vboTextureCoordHandle); 
    glTexCoordPointer(2, GL_FLOAT, 0, 0L); 

    glEnableClientState(GL_VERTEX_ARRAY); 
    glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
    glDrawArrays(GL_TRIANGLES, 0, 6); 
    glDisableClientState(GL_TEXTURE_COORD_ARRAY); 
    glDisableClientState(GL_VERTEX_ARRAY); 

    glBindBuffer(GL_ARRAY_BUFFER, 0); 
} 

до сих пор я попытка переместить один объект по экрану, чтобы получить переводы на работа, но безрезультатно - я попытался использовать следующий метод обновления для объекта, чтобы обновить свою позицию, однако это приводит к Тропа копий объекта втягивается через экран, который, очевидно, не то, что я намеревался:

public void update(int delta) { // Updates the position of the object 
    this.x += this.dx * delta; 
    this.y += this.dy * delta; 
    this.setBounds(); 
    this.vertexData.rewind(); 
    this.vertexData.put(getVertices()); 
    this.vertexData.flip(); 
    glBindBuffer(GL_ARRAY_BUFFER, this.vboVertexHandle); 
    glBufferData(GL_ARRAY_BUFFER, this.vertexData, GL_STATIC_DRAW); 
    glBindBuffer(GL_ARRAY_BUFFER, 0); 
} 

Вот результат использования этого метода (спрайт просто заполнителем я рисовал в минуту, чтобы продемонстрировать выпуск) - Click

Любая помощь будет очень признательна, если вам нужна дополнительная информация, я обновлю это.

Заранее благодарен!

EDIT: Краткое примечание, getVertices():

public float[] getVertices() { // Returns array of vertices (for vertex VBO) 
    float[] vertices = { this.bounds[0], this.bounds[3], this.bounds[2], this.bounds[3], 
          this.bounds[2], this.bounds[1], this.bounds[2], this.bounds[1], 
          this.bounds[0], this.bounds[1], this.bounds[0], this.bounds[3] }; 
    return vertices; 
} 

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

public void setBounds() { 
    this.bounds[0] = this.x; 
    this.bounds[1] = this.y; 
    this.bounds[2] = this.x + this.width; 
    this.bounds[3] = this.y + this.height; 
} 

Какие эффективно обновляет новые х/у значений при вызове метода.

+0

Вы должны очистить буфер между кадром делает – arynaq

+0

* Facepalm * Я знал, что это будет что-то ненормальное, как это, спасибо ха-ха, это теперь исправлено. – ACraftyMarmoset

ответ

1

Это потому, что вы не очищаете буферы.

Необходимо очистить буферы, или новые визуализированные данные будут добавлены только к старым данным.

Для очистки буфера необходимо выполнить следующие действия.

glClear(GL_COLOR_BUFFER_BIT); 

Если вы используете GL_DEPTH_TEST, то не забудьте очистить, что хорошо. (Это больше, только так вы знаете)

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
+0

Да, спасибо, ха-ха, я буквально просто забыл добавить эту строку в цикле рендеринга ... Не буду делать эту ошибку снова в спешке. – ACraftyMarmoset

+0

Случается для большинства из нас! ;) – Vallentin