В настоящее время я занимаюсь созданием 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;
}
Какие эффективно обновляет новые х/у значений при вызове метода.
Вы должны очистить буфер между кадром делает – arynaq
* Facepalm * Я знал, что это будет что-то ненормальное, как это, спасибо ха-ха, это теперь исправлено. – ACraftyMarmoset