产生多个圆圈并使它们移动

Spawning mutiple circles and make them move

我正在尝试自学 java 我 "try" 编写一个小游戏。

我有一个问题,我想解决方案很简单,但我很挣扎。

基本的想法是我正在控制一个圆圈,我想每 5 秒在 window 范围内的随机位置生成一个圆圈。圆圈应该移动到我控制的圆圈的位置。

这是我目前的情况:

Window-Class:

package TestGame;
import java.awt.Graphics;

public class Window extends GameIntern{

    public void init(){
        setSize(854,480);   
        Thread th = new Thread(this);
        th.start();
        offscreen = createImage(854,480);
        d = offscreen.getGraphics();
        addKeyListener(this);
    }

    public void paint(Graphics g){
        d.clearRect(0,0,854,480);
        d.drawOval(x, y, 20, 20);
        g.drawImage(offscreen,0,0,this);
    }

    public void update(Graphics g){
        paint(g);
    }
}

GameIntern-Class:

package TestGame;


import java.applet.Applet;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class GameIntern extends Applet implements Runnable , KeyListener {

    public int x,y;
    public Image offscreen;
    public Graphics d;
    public boolean up,down,left,right;

    public void run() {
        x = 100;
        y = 100;

        while(true){
            if(left == true){
                if(x>=4){
                x-=4;
                }else{ x=0;}
                repaint();
            }
            if(right == true){
                if(x<=826){
                    x+=4;
                    }else{ x=830;}
                repaint();
            }
            if(up == true){
                if(y>=4){
                y-=4;
                }else{ y=0;}
                repaint();
            }
            if(down == true){
                if(y<=454){
                y+=4;
                }else{y=459;}
                repaint();
            }
            try {
                Thread.sleep(20);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public void keyPressed(KeyEvent e) {

        if(e.getKeyCode() == 37){
            left=true;
        }
        if(e.getKeyCode() == 38){
            up=true;
        }
        if(e.getKeyCode() == 39){
            right=true;
        }
        if(e.getKeyCode() == 40){
            down=true;
        }

    }


    public void keyReleased(KeyEvent e) {

        if(e.getKeyCode() == 37){
            left=false;
        }
        if(e.getKeyCode() == 38){
            up=false;
        }
        if(e.getKeyCode() == 39){
            right=false;
        }
        if(e.getKeyCode() == 40){
            down=false;
        }


    }

    public void keyTyped(KeyEvent e){}
}

我知道这没什么特别的,但我正在努力研究如何创建和生成 "enemy"-circles 以及如何控制每个创建的圆圈的 x/y 值以朝着可控方向移动圆.

感谢任何形式的帮助。

注意 在游戏中使用 thread.sleep 不是 一个好主意。这是每秒迭代 60 次的游戏循环示例。

public void run() {
    double ns = 1000000000.0 / 60.0;
    double delta = 0;

    long lastTime = System.nanoTime();

    while (running) {
        long now = System.nanoTime();
        delta += (now - lastTime) / ns;
        lastTime = now;

        while (delta >= 1) {
            tick();
            delta--;
        }
    }
}

然后您需要将控制游戏的代码移动到 tick() 方法中。 (或同等学历)

private void tick() {
    if(left == true){
        if(x>=4){
            x-=4;
            }else{ x=0;}
            repaint();
        }
        if(right == true){
            if(x<=826){
                x+=4;
                }else{ x=830;}
            repaint();
        }
        if(up == true){
            if(y>=4){
            y-=4;
            }else{ y=0;}
            repaint();
        }
        if(down == true){
            if(y<=454){
            y+=4;
            }else{y=459;}
            repaint();
}

回答 我会制作一个新的 class 包含你的敌人的信息。它需要一个带有 int xint y 以及 tick() 方法的构造函数。

public class Enemy {

    public enemy(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public void tick() {
    }
}

然后你可以在 GameIntern class

中创建一个包含你的敌人的 ArrayList
private static ArrayList<Enemy> enemies = new ArrayList<Enemy>();

这让你可以拥有任意数量的敌人。您将需要通过使用 for 循环调用他们所有的 tick() 方法来更新敌人。 GameIntern

中的tick()方法需要添加以下内容
for (Enemy e : enemies) {
    e.tick();
}

要每 5 秒在屏幕内的随机位置添加一个敌人,您需要 int delayGameIntern

中的tick()方法添加了以下内容
private int delay;
private Random random= new Random();

private void tick() {
    delay++;
    if(delay % (60 * 5) == 0)
        enemies.add(new Enemy(random.nextInt(your game width), random.nextInt(your game height));

为了让敌人追你,在 Enemy

中将此添加到你的 tick() 方法中
if (x < GameIntern.x) x++;
if (x > GameIntern.x) x--;
if (y < GameIntern.y) y++;
if (y > GameIntern.y) y--;

有关移除敌人的信息,请参阅