Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java Pong中同时更新两个实体_Java_Lwjgl_Pong - Fatal编程技术网

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

在Java Pong中同时更新两个实体,java,lwjgl,pong,Java,Lwjgl,Pong,我最近开始使用LWJGL,因为我停止使用Java,并希望快速复习一些新的东西。不幸的是,我在开发一个小型Java pong游戏时遇到了一个问题。我很快就看完了它,但我已经多次检查了我的代码,我无法找出哪里出了问题 问题:我不能同时更新屏幕上的多个实体。这很奇怪,因为我移动它们没有问题,它们的值会根据调试器相应地更新,但图形不会在屏幕上更新。以下是我的主程序代码: package lwjgl2; import static org.lwjgl.opengl.GL11.*; import org

我最近开始使用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()
方法,在本例中是球。如果我先叫球拍,球拍会移动,但球会静止不动。我知道我一定在什么地方犯了个愚蠢的错误,但我找不到

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

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

    }

}

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

如果这是问题的正确答案,那么您应该接受它。@codeNinja我会的,但接受我自己的答案需要2天时间