2013-04-08 108 views
0

我正在制作一个类似Space Impact的游戏。在我的比赛中,火箭队正在正常工作,但我无法随机创建怪物。怪物在屏幕上,但他们不动,所以他们不活跃 我该怎么做?如何创建随机怪物

public class Dnm extends JFrame implements Runnable { 
    Graphics dbg; 
    Image dbImage; 
    Image Pik1; 
    Image Boss; 
    static ImageIcon active; 

    int x, y, xDirection, yDirection, BossX, BossY; 

    public void run() { 
     try { 
      while (true) { 
       move(); 
       boss(); 
       Thread.sleep(10); 
      } 
     } catch (Exception e) { 
      System.out.println("Uh-oh, something went wrong!."); 
     } 
    } 

    private void move() { 
     x += xDirection; 
     y += yDirection; 
    } 

    private void boss() { 
     while (BossX == 0) { 
      BossX = getX() - 1; 
     } 

     Random rastgele = new Random(getY()); 
     BossY = rastgele.nextInt(); 
    } 

    public void setXDirection(int xdir) { 
     xDirection = xdir; 
    } 

    public void setYDirection(int ydir) { 
     yDirection = ydir; 
    } 

    // KEY COMMANDS // 
    public class AL extends KeyAdapter { 
     @Override 
     public void keyPressed(KeyEvent e) { 
      int keyCode = e.getKeyCode(); 

      if (keyCode == e.VK_LEFT) { 
       setXDirection(-1); 
      } 
      if (keyCode == e.VK_RIGHT) { 
       setXDirection(+1); 
      } 
      if (keyCode == e.VK_UP) { 
       setYDirection(-1); 
      } 
      if (keyCode == e.VK_DOWN) { 
       setYDirection(+1); 
      } 
     } 

     @Override 
     public void keyReleased(KeyEvent e) { 
      int keyCode = e.getKeyCode(); 
      if (keyCode == e.VK_LEFT) { 
       setXDirection(0); 
      } 
      if (keyCode == e.VK_RIGHT) { 
       setXDirection(0); 
      } 
      if (keyCode == e.VK_UP) { 
       setYDirection(0); 
      } 
      if (keyCode == e.VK_DOWN) { 
       setYDirection(0); 
      } 
     } 

     @Override 
     public void keyTyped(KeyEvent e) { 

     } 
    } 

    // CONSTRUCTOR // 
    public Dnm() { 
     //Image Import 
     ImageIcon still = new ImageIcon("img/rocket.png"); 
     Pik1 = still.getImage(); 

     addKeyListener(new AL()); 

     setTitle("Dnm"); 
     setSize(500, 500); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setResizable(true); 
     setVisible(true); 

     x = 15; 
     y = 15; 
    } 

    public void paint(Graphics g) { 
     dbImage = createImage(getWidth(), getHeight()); 
     dbg = dbImage.getGraphics(); 
     paintComponent(dbg); 
     g.drawImage(dbImage, 0, 0, this); 

    } 

    public void paintComponent(Graphics g) { 
     ImageIcon background = new ImageIcon("img/space.jpeg"); 
     Image background1 = background.getImage(); 

     ImageIcon still1 = new ImageIcon("img/Alien.png"); 
     Boss = still1.getImage(); 

     g.setColor(Color.red); 
     g.drawImage(background1, 0, 0, this); 
     g.drawImage(Boss, BossX, BossY, this); 
     g.drawImage(Pik1, x, y, this); 
     g.setColor(Color.blue); 

     repaint(); 
    } 

    public static void main(String[] args) { 
     Dnm game = new Dnm(); 

     Thread t1 = new Thread(game); 
     t1.start(); 
    } 
} 

谢谢。

+5

我认为这是学习使用调试器的绝佳机会。 – NPE 2013-04-08 15:30:46

+4

使用RMG - 随机怪兽发电机。 – 2013-04-08 15:32:10

+0

尝试仔细询问您的问题,而不是仅仅复制粘贴代码。因为没有办法告诉怪物,玩家或火箭是什么形象。 – phcoding 2013-04-08 16:03:13

回答

1

与您的代码是不完整的,这是很难肯定地说,但这一行看起来可疑:

while (BossX == 0) { 
    BossX = getX() - 1; 
} 

此代码是最有可能会被执行一次,对吗?如果BossX最初为零,则代码在您更改其值的位置执行。在下一次更新中,BossX不是零(假定),所以代码不会执行。因为BossX是你绘制老板的X坐标,所以它不会移动。相反,它只是在同一个地方反复重绘。

为了让怪物随机移动,在每个游戏循环中随机增加或减少X和Y坐标值。添加第二个随机变量,使它们以随机方向随机移动(通过调整坐标值大于1的值)。

由于NPE评论,您应该在调试器中单步执行代码,找出发生了什么。

0

我相当的编程初学者,但这里是我最好的尝试:

我会创建一个名为生成使用的Math.random()的随机数每x秒方法。我会说

int number = .5; 
if(number > Math.Random()) 
    GenerateMonster(); 

然后,您的GenerateMonster方法将创建一个新的对象与怪物的默认值。为了让怪物的行为以某种方式发挥作用,无论您如何定义怪物的行为方式,都需要继承这些功能。我没有看到这些函数的代码,所以我假设你只是没有列出它们。希望这至少有助于。祝你好运!