2014-01-13 65 views
-4

所以我製作了一個叫做閃避的小遊戲,是從「天空」墜落的矩形,你必須躲避它們。當我運行遊戲時,這個錯誤消息剛剛彈出,我不知道爲什麼。此外,只要我運行程序,屏幕就會變白。遊戲引發NullPointerException

我無法弄清楚這一點,我在我的代碼找了幾個小時找不到原因。請致電

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
    at dodge.Enemy.move(Enemy.java:22) 
    at dodge.Enemy.draw(Enemy.java:32) 
    at dodge.EnemyManager.draw(EnemyManager.java:34) 
    at dodge.Dodge.paint(Dodge.java:38) 
    at javax.swing.JComponent.paintChildren(JComponent.java:887) 
    at javax.swing.JComponent.paint(JComponent.java:1063) 
    at javax.swing.JComponent.paintChildren(JComponent.java:887) 
    at javax.swing.JComponent.paint(JComponent.java:1063) 
    at javax.swing.JLayeredPane.paint(JLayeredPane.java:585) 
    at javax.swing.JComponent.paintChildren(JComponent.java:887) 
    at javax.swing.JComponent.paintToOffscreen(JComponent.java:5226) 
    at 

對不起,很長。但這是我的代碼。

Dodge.java

package dodge; 
import java.awt.event.KeyListener; 
import java.awt.Color; 
import java.awt.Dimension; 
import javax.swing.*; 
import java.awt.Graphics; 
import java.awt.event.*; 
public class Dodge extends JPanel implements KeyListener{ 

    private Player player; 
    private Stage stage; 

    private EnemyManager manager; 

    public Dodge(){ 
     setSize(new Dimension(800, 600)); 
     setPreferredSize(new Dimension(800, 600)); 
     addKeyListener(this); 
     setFocusable(true); 

     stage = new Stage(); 
     player = new Player(this, 200, 200); 
     manager = new EnemyManager(this, 10); 
    } 

    @Override 
    public void update(Graphics g){ 
     paint(g); 
    } 
    @Override 
    public void paint(Graphics g){ 
     g.setColor(Color.BLACK); 
     g.fillRect(0, 0, getWidth(), getHeight()); 

     stage.draw(g); 
     player.draw(g); 
     manager.draw(g); 
     g.dispose(); 
     repaint(); 
    } 
@Override 
    public void keyReleased(KeyEvent e){ 
      player.setXD(0); 
      player.setYD(0); 
    } 

    @Override 
    public void keyTyped(KeyEvent e){ 

    } 

    public Stage getStage(){ 
     return stage; 
    } 

    @Override 
    public void keyPressed(KeyEvent e){ 
     int c = e.getKeyCode(); 
     if(c == KeyEvent.VK_W){ 

     } 
     if(c ==KeyEvent.VK_A){ 
     player.setXD(-1); 
     } 
     if(c == KeyEvent.VK_S){ 

     } 
     if(c ==KeyEvent.VK_D){ 
     player.setXD(1); 
     } 
    } 

public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     frame.setTitle("Dodge the Rectangles"); 
     frame.add(new Dodge()); 
     frame.pack(); 
     frame.setResizable(false); 
     frame.setSize(new Dimension(800, 600)); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 

EnemyManager.java

package dodge; 

import java.awt.*; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.*; 

public class EnemyManager { 

    private int amount; 
    private List<Enemy> enemies = new ArrayList<Enemy>(); 
    private Dodge instance; 

    public EnemyManager(Dodge instance, int a){ 
     this.amount = a; 
     spawn(); 
     this.instance = instance; 
    } 

    private void spawn(){ 
     Random random = new Random(); 
     int ss = enemies.size(); 
     if(ss<amount){ 
      for(int i = 0; i < amount - ss; i++){ 
       enemies.add(new Enemy(instance, random.nextInt(778), 10)); 
      } 
     }else if(ss>amount){ 
      for(int i = 0; i < ss - amount; i++){ 
       enemies.remove(i); 
     } 
    } 
    } 
    public void draw(Graphics g){ 
     for(Enemy e : enemies) e.draw(g); 
    } 
} 

Enemy.java

package dodge; 

import java.awt.*; 

public class Enemy extends Entity{ 

    private Rectangle hitbox; 
    private int ix, iy; 
    private boolean dead = false; 
    private Dodge instance; 

    public Enemy(Dodge instance, int x, int y){ 
     super(x, y); 
     this.instance = instance; 
     hitbox = new Rectangle (x, y, 32, 32); 

     ix = 0; 
     iy = 1; 
    } 

    private void move(){ 
     if(instance.getStage().isCollided(hitbox)){ 
      iy = 0; 
      dead = true; 
     } 
     hitbox.x += ix; 
     hitbox.y +=iy; 
    } 
    private boolean isDead() {return dead;} 

    @Override 
    public void draw(Graphics g){ 
     move(); 
     g.setColor(Color.CYAN); 
     g.fillRect(hitbox.x, hitbox.y, hitbox.width, hitbox.height); 
    } 

} 

Entity.java

package dodge; 

import java.awt.*; 

public abstract class Entity { 

    protected int x, y, w, h; 
    protected boolean removed = false; 

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

    } 

    public void draw(Graphics g){ 

    } 

    public int getX() {return x;} 
    public int getY(){return y;} 
    public int getW() {return w;} 
    public int getH(){return h;} 
} 

Player.java

package dodge; 

import java.awt.*; 

public class Player extends Entity{ 

    private int xd, yd; 
    private Dodge instance; 
    private Rectangle hitbox; 

    public Player(Dodge instance, int x , int y){ 
     super(x, y); 
     this.instance = instance; 
     w = 16; h = 16; 

     hitbox = new Rectangle(x, y, w, h); 
    } 
    public void draw(Graphics g){ 
     move(); 
     if(!instance.getStage().isCollided(hitbox)){ 
      yd = 1; 

     }else yd = 0; 
     g.setColor(Color.ORANGE); 
     g.fillOval(hitbox.x, hitbox.y, hitbox.width, hitbox.height); 
    } 

    private void move(){ 
     hitbox.x += xd; 
     hitbox.y +=yd; 

    } 

    public void setXD(int value){ 
     xd = value; 
    } 

    public void setYD(int value){ 
     yd = value; 

    } 
} 

Stage.java

package dodge; 
import java.awt.*; 
public class Stage { 

    private Rectangle platform = new Rectangle(0, 540, 800, 100); 

    public Stage(){ 
    } 

    public boolean isCollided(Rectangle entity){ 
     return platform.intersects(entity); 
    } 

    public void draw(Graphics g){ 
     g.setColor(Color.WHITE); 
     g.fillRect(platform.x, platform.y, platform.width, platform.height); 
    } 

} 

我希望並不太高長。謝謝

+4

當然,你可以夢想一個實際總結問題的標題。是的,它太長了。 –

+2

你有什麼嘗試?你認爲會發生什麼?這是提問的第一個非常好的方法。儘量在*你的分析*上提供儘可能多的信息,而不是像你在這裏一樣提供關於*問題*的信息。即使你的分析結束了,解釋你爲什麼會遇到問題也更容易。大多數時候,這些問題都與誤解框架的工作方式有關。 – Acapulco

回答

3

閱讀堆棧跟蹤。 Enemy.instanceEnemy.instance.getStage()null

1

此外,只要我運行程序,屏幕就會變白。

  1. 不覆蓋的update()和paint()。這是AWT中使用的舊代碼,並不是自定義繪畫在Swing中完成的方式。在Swing中,您只需重寫JPanel的paintComponent()方法,並且不要忘記調用super.paintComponent()。有關更多信息和示例,請參閱Custom Painting上的Swing教程部分。

  2. 不要在繪畫方法中調用repaint()。這將導致無限循環。這不是做動畫的方式。使用擺動計時器或單獨的線程來安排動畫。