在 Java Pong 中同时更新两个实体



自从我停止使用Java并想要快速复习一些新内容以来,我最近开始使用LWJGL。不幸的是,我在开发一个小型Java乒乓球游戏时遇到了一个问题。我有点加快了速度,但是我已经多次查看了我的代码,但我无法弄清楚出了什么问题。

问题:我无法同时更新屏幕上的多个实体。这很奇怪,因为我移动它们没有问题,并且它们的值会根据调试器相应地更新,但图形不会在屏幕上更新。这是我的主程序代码:

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()方法的实体,在本例中为球。如果我先叫球拍,那么球拍会移动,但球会保持静止。我知道我一定在某个地方犯了一个愚蠢的错误,但我找不到它。

此外,实体类,可能是罪魁祸首:

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){
    }
}

我已经想通了。碰巧通过循环在不同时间更新多个实体不是一个好主意,因此您应该创建一个一次更新每个实体的方法。

相关内容

  • 没有找到相关文章

最新更新