2015-05-25 34 views
1

我想教自己java和我“尝试”编码一个小游戏。产生多圈并使它们移动

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

其基本思想是我控制一个圆圈,并且我想每隔5秒在我的窗口边界内随机位置产生一个圆圈。圈子应该将towords移动到我控制的圈子的位置。

这是我到目前为止有:

窗口级:

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级:

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

我知道这是没有任何幻想,但我与如何挣扎创造并产生“敌人” - 圈以及如何控制每一个创建的圈的x/y值向可控圈移动。

任何形式的帮助表示赞赏。

回答

2

注意在游戏中使用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(); 
} 

回答我会做包含你的敌人的信息的新类。它需要一个具有intxintytick()方法的构造函数。

public class Enemy { 

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

    public void tick() { 
    } 
} 

然后可以使包含你的敌人在你的GameIntern

private static ArrayList<Enemy> enemies = new ArrayList<Enemy>(); 

这可以让你只要你想拥有尽可能多的敌人的ArrayList。您需要通过环路调用所有tick()方法来更新敌人。下面需要被添加到tick()方法GameIntern

for (Enemy e : enemies) { 
    e.tick(); 
} 

要使用一个随机位置添加一个敌人每5秒画面里面,你会需要一个intdelay。以下是添加到tick()方法GameIntern

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--; 

添加到您的tick()方法要消除敌人看到here

有关信息
+0

非常感谢Caleb。我明白你写的所有东西:) 我仍然有两个问题,我不知道你能否给我一个答案。 1.你在哪里使用变量'timer'? 2.当我移动可控圆时,屏幕基本上只会更新。有没有办法更新每20毫秒的窗口而不必移动? – ViktorG

+0

另一件事是'if(delay%60 * 5 == 0)'部分似乎不安静正确。我在很短的时间内产卵了许多圈子。 – ViktorG

+1

我只是将'repaint()'方法移动到tick方法的顶部,因此它每16.6毫秒发生一次。延迟通过在(60 * 5)周围添加括号并确保添加'delay ++;'来确定。计时器变量是未显示的fps计数器的一部分。 –