Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.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 生成多个圆并使其移动_Java_Graphics_Applet - Fatal编程技术网

Java 生成多个圆并使其移动

Java 生成多个圆并使其移动,java,graphics,applet,Java,Graphics,Applet,我试图自学java,并“尝试”编写一个小游戏 我有一个问题,我想解决办法很简单,但我正在努力 其基本思想是,我控制一个圆,我希望每5秒在窗口边界内的任意位置生成一个圆。这些圆应该向我控制的圆的位置移动 以下是我目前掌握的情况: 窗口类: package TestGame; import java.awt.Graphics; public class Window extends GameIntern{ public void init(){ setSize(854,4

我试图自学java,并“尝试”编写一个小游戏

我有一个问题,我想解决办法很简单,但我正在努力

其基本思想是,我控制一个圆,我希望每5秒在窗口边界内的任意位置生成一个圆。这些圆应该向我控制的圆的位置移动

以下是我目前掌握的情况:

窗口类:

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);
    }
}
游戏实习班:

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){}
}
打包测试游戏;
导入java.applet.applet;
导入java.awt.Graphics;
导入java.awt.Image;
导入java.awt.event.KeyEvent;
导入java.awt.event.KeyListener;
公共类GameIntern扩展小程序实现可运行的KeyListener{
公共整数x,y;
屏幕外的公众形象;
公共图形d;
公共布尔上、下、左、右;
公开募捐{
x=100;
y=100;
while(true){
如果(左==真){
如果(x>=4){
x-=4;
}else{x=0;}
重新油漆();
}
if(right==true){
如果(x=4){
y-=4;
}else{y=0;}
重新油漆();
}
如果(向下==真){

如果(y注意在游戏中使用
线程.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()
方法中。(或等效方法)

然后你可以制作一个
ArrayList
,在你的
GameIntern
类中包含你的敌人

private static ArrayList<Enemy> enemies = new ArrayList<Enemy>();
要在屏幕内的任意位置每隔5秒添加一个敌人,您需要
int
delay

for (Enemy e : enemies) {
    e.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));
要让敌人追赶你,请将此添加到你的敌方中的
tick()
方法中

if (x < GameIntern.x) x++;
if (x > GameIntern.x) x--;
if (y < GameIntern.y) y++;
if (y > GameIntern.y) y--;
if(xGameIntern.x)x--;
if(yGameIntern.y)y--;

有关清除敌人的信息,请参见

非常感谢Caleb。我理解你写的所有内容:)我还有两个问题,不知道你能否给我一个答案。1.你在哪里使用变量
计时器
?2.屏幕基本上只在我移动可控圆时更新。有没有办法每隔20毫秒更新一次窗口而不必移动?另一件事是
if(延迟%60*5==0)
部分似乎不太正确。我在很短的时间内生成了许多圆圈。我只需将
repaint()
方法移动到tick方法的顶部,这样它每16.6毫秒发生一次。通过在
周围添加括号(60*5)来修复延迟
并确保添加
delay++;
。计时器变量是fps计数器的一部分,未显示。
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));
if (x < GameIntern.x) x++;
if (x > GameIntern.x) x--;
if (y < GameIntern.y) y++;
if (y > GameIntern.y) y--;