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

时间:2014-03-31 20:05:10

标签: java lwjgl pong

我最近开始使用LWJGL,因为我停止使用Java并希望快速复习新的内容。不幸的是,我在使用小型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){

    }

}

1 个答案:

答案 0 :(得分:1)

我已经弄明白了。碰巧通过循环在不同时间更新多个实体并不是一个好主意,所以你应该创建一个方法来同时更新每个实体。