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

Проблема: я не могу обновить несколько объектов на экране одновременно. Это странно, потому что у меня нет проблем с их перемещением, и их значения обновляются соответственно в соответствии с отладчиком, но графика на экране не обновляется. Вот мой код для основной программы:

package lwjgl2;

import static org.lwjgl.opengl.GL11.*;

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

public class Main {

    private Box ball = new Box(640>>1, 480>>1, 5, 5);
    private Box paddle = new Box(10, 10, 10, 40);

    private long lastTime;
    private long getTime(){
        return (Sys.getTime() * 1000) / Sys.getTimerResolution();
    }
    private int getDelta(){
        long currentTime = getTime();
        int delta = (int) (currentTime - lastTime);
        lastTime = getTime();
        return delta;
    }

    public Main() {
        //display
        try{
            Display.setDisplayMode(new DisplayMode(640,480));
            Display.setTitle("Hello");
            Display.create();
        } catch(LWJGLException e){
            e.printStackTrace();
        }
        //ogl
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho(0, 640, 480, 0, 1, -1);
        glMatrixMode(GL_MODELVIEW);

        lastTime = getTime();

        //main loop
        while(!Display.isCloseRequested()){

            glClear(GL_COLOR_BUFFER_BIT);
            if(Keyboard.isKeyDown(Keyboard.KEY_ESCAPE)){
                Display.destroy();
                System.exit(0);
            }
            paddle.setDX(0.1);
            ball.setDX(0.3);
            ball.setDY(0.2);

            //main game loop goes nyah

            ball.update(getDelta());
            paddle.update(getDelta());
            ball.draw();
            paddle.draw();
            Display.update();
            Display.sync(60);
        }
        //destroy display
        Display.destroy();

    }

    private class Box extends Entity{

        public Box(int x, int y, int height, int width) {
            super(x, y, height, width);
            // TODO Auto-generated constructor stub
        }

        public void update(int delta){
            super.x += dx * delta;
            super.y += dy * delta;
        }

        public void draw(){
            glRecti(x, y, x + height, y + width);
        }

    }

    public static void main(String args[]){
        new Main();
    }

}

Как я уже сказал, единственная сущность, которая действительно будет правильно отображаться на экране, - это то, что я сначала вызываю в методе update(), в данном случае - мяч. Если я сначала позову ракетку, она будет двигаться, но мяч останется на месте. Я знаю, что, должно быть, где-то совершил глупую ошибку, но не могу ее найти.

Также класс Entity, возможно, главный виновник:

package lwjgl2;

import java.awt.Rectangle;

public abstract class Entity {

    protected int x;
    protected int y;
    protected int height;
    protected int width;
    protected double dx;
    protected double dy;
    protected Rectangle bounds = new Rectangle();


    public Entity(int x, int y, int height, int width) {
        this.x = x;
        this.y = y;
        this.height = height;
        this.width = width;
        this.dx = 0;
        this.dy = 0;
    }

    public int getX(){
        return x;

    }

    public int getY(){
        return y;

    }

    public double getDX(){
        return dx;

    }

    public double getDY(){
        return dy;

    }

    public void setX(int x){
        this.x = x;
    }

    public void setY(int y){
        this.y = y;
    }

    public void setDX(double dx){
        this.dx = dx;
    }

    public void setDY(double dy){
        this.dy = dy;
    }

    public void update(int delta){

    }

    public void draw(int delta){

    }

}
0
user3094226 1 Апр 2014 в 00:05

1 ответ

Лучший ответ

Я понял это. Бывает, что обновление нескольких сущностей в разное время в цикле - не лучшая идея, поэтому вам следует создать метод для обновления каждой сущности сразу.

1
user3094226user3094226 1 Апр 2014 в 04:13
Если это правильный ответ на вашу проблему, вы должны принять его.
 – 
BitNinja
1 Апр 2014 в 04:23
Я бы хотел, но на принятие моего ответа уйдет 2 дня
 – 
user3094226
1 Апр 2014 в 09:17