【问题标题】:Game throws NullPointerException游戏抛出 NullPointerException
【发布时间】:2014-01-13 05:38:17
【问题描述】:

所以我正在制作一个叫做闪避的小游戏,矩形从“天空”掉下来,你必须躲避它们。当我运行游戏时,此错误消息刚刚弹出,我不知道为什么。每当我运行程序时,屏幕也会变白。

我无法弄清楚这一点,我在我的代码中搜索了几个小时无法弄清楚原因。请停下来

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 

抱歉,说的太长了。但这是我的代码。

道奇.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);
    }

}

我希望这不会太长。谢谢

【问题讨论】:

  • 您当然可以想出一个真正概括问题的标题。是的,它太长了。
  • 你试过什么?你认为会发生什么?这是提出问题的非常好的第一种方法。尝试提供尽可能多的关于你的分析的信息,而不是像你在这里所做的那样提供关于问题的尽可能多的信息。即使您的分析有问题,也更容易解释为什么您会遇到问题。大多数情况下,这些问题与对框架如何工作的误解有关。

标签: java swing nullpointerexception


【解决方案1】:

读取堆栈跟踪。 Enemy.instanceEnemy.instance.getStage()null

【讨论】:

    【解决方案2】:

    当我运行程序时,屏幕也会变白。

    1. 不要覆盖 update() 和 paint()。这是在 AWT 中使用的旧代码,而不是在 Swing 中完成自定义绘制的方式。在 Swing 中,您只需覆盖 JPanel 的 paintComponent() 方法,并且不要忘记调用 super.paintComponent()。阅读 Custom Painting 上的 Swing 教程部分,了解更多信息和示例。

    2. 不要在绘画方法中调用 repaint()。这将导致无限循环。这不是做动画的方法。使用 Swing Timer 或单独的线程来安排动画。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-09
      • 1970-01-01
      • 2017-08-11
      • 2013-09-07
      • 2013-06-18
      • 2016-07-07
      • 2014-10-02
      • 2012-05-21
      相关资源
      最近更新 更多