繁体   English   中英

在尝试获取对象的y坐标时无法解决NullPointerException问题

[英]Can't work around a NullPointerException when trying to get the y-coordinate of an object

我正在制作太空入侵者类型的游戏,我正在尝试实施碰撞检测,这样如果镜头击中目标,目标就会从帧中移除。 但是我在下面标记的行中得到一个空指针异常(我也会发布异常跟踪)。 问题是因为我没有正确设置镜头对象的y坐标? 我试图解决这个问题,但没有任何事情发生,虽然我可能没有以适当的方式做到这一点。

以下是两个相关的课程,如有必要,我可以发布更多:

public class GamePanel extends JPanel {

Launcher launcher1;
Background bground1;
public static Shot shot;
public int shotCounter;
public int rCount;
public int cCount;
Timer timer;
Timer eTimer;
Timer rTimer;
Timer cTimer;
Russia russia;
China china;
public ArrayList<Object> enemies;


public GamePanel() throws IOException {
    super();
    enemies = new ArrayList<>();
    this.shotCounter = 0;
    launcher1 = new Launcher();
    bground1 = new Background();
    timer = new Timer(10, new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            componentMove(3);
            repaint();
        }
    });
    rTimer = new Timer(10, new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            componentMove(1);
            repaint();
        }
    });
    cTimer = new Timer(10, new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            componentMove(2);
            repaint();
        }
    });
    eTimer = new Timer(10, new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            addEnemy();
            eTimer.setDelay(7000);
            repaint();
        }
    });
    eTimer.start();
}//end constructor

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.drawImage(bground1.background, 0, 0, getWidth(), getHeight(), null);
    g.drawImage(launcher1.baldEagleImage, launcher1.getLxCoord(), launcher1.lyCoord, null);//paint the launcher
    if (rCount == 1) {
        g.drawImage(russia.image, russia.getXCoord(), russia.getYCoord(), null);
        rTimer.start();
    }
    if (cCount == 1) {
        g.drawImage(china.image, china.getXCoord(), china.getYCoord(), null);
        cTimer.start();
    }
    if (shotCounter == 1) {
        g.drawImage(shot.mcDShotImage, shot.staticXLauncherCoord, shot.getSyCoord(), null);
        timer.start();
    }
}//end paintComponent method

public void move(GamePanel gamePanel) {
    launcher1.moveX();
    repaint();
}//end move method

public void componentMove(int c) {
    if (c == 1) {
        do {
            russia.move();
        } while (!collisionDetected(russia));
    } else if (c == 2) {
        do {
            china.move();
        } while (!collisionDetected(china));
    } else if (c == 3) {
        shot.moveY();
    }
}

public boolean collisionDetected(Entity object) {
    // Create variables to hold temporary values to check for ball colision
    int oTempX = object.getXCoord();
    int oTempY = object.getYCoord();
    int oTempW = object.getImageWidth();
    int oTempH = object.getImageHeight();
    int sTempX = shot.staticXLauncherCoord;
    int sTempY = shot.getSyCoord();     // THIS IS THE EXCEPTION
    int sTempH = shot.mcDShotImage.getHeight();
    int sTempW = shot.mcDShotImage.getWidth();
    double xDiff = Math.pow((oTempX - sTempX), 2);
    double yDiff = Math.pow((oTempY - sTempY), 2);
    double hSum = Math.pow(oTempH + sTempH, 2);
    double wSum = Math.pow(oTempW + sTempW, 2);
    if (shotCounter == 1) {
        if ((xDiff + yDiff) <= hSum) {//use the ball heights to check if two balls intersect
            if ((xDiff + yDiff) <= wSum) {//use the ball widths to check if two balls intersect
                enemies.remove(this);
                repaint();
                return true;
            } else {
                return false;
            }
        } else {
            return false;
        }
    } else {
    return false;
    }
}

public void addShot() {
    try {
        shot = new Shot();
        shotCounter = 1;
        repaint();
    } catch (IOException ex) {
    }
}

public void addEnemy() {
    int enemy = (int) (Math.round(Math.random()));
    if (enemy == 0) {
        try {
            enemies.add(russia = new Russia());
            rCount = 1;
            repaint();
        } catch (IOException ex) {
        }
    } else {
        try {
            enemies.add(china = new China());
            cCount = 1;
            repaint();
        } catch (IOException ex) {
        }
    }
}

}//end GamePanel class


public class Shot {

public int syCoord;
public int sRise = 1;
public BufferedImage mcDShotImage;
GamePanel gPanel;
public static int staticXLauncherCoord;

public Shot() throws IOException {
    staticXLauncherCoord = Launcher.getLxCoord() + 10;
    syCoord = 381;
    mcDShotImage = ImageIO.read(new File("mcdonaldsarchesshot.jpg"));
}//end constructor

public void moveY() {
    do {
    syCoord -= sRise;
    setSyCoord(syCoord);
    } while (syCoord <= 1);
}//end moveY method

public void setSyCoord(int syCoord) {
    this.syCoord = syCoord;
}

public int getSyCoord() {
    return syCoord;
}

}//end Shot class

这是例外打印输出:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at GamePanel.collisionDetected(GamePanel.java:125)
at GamePanel.componentMove(GamePanel.java:112)
at GamePanel$3.actionPerformed(GamePanel.java:65)
at javax.swing.Timer.fireActionPerformed(Timer.java:312)
at javax.swing.Timer$DoPostEvent.run(Timer.java:244)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:733)
at java.awt.EventQueue.access$200(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:694)
at java.awt.EventQueue$3.run(EventQueue.java:692)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:703)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)

你没有初始化镜头。 可能是因为在addShot()之前调用了collisionDetected()。

你何时/何时调用addShot 这是显示shot初始化的唯一逻辑(通过shot = new Shot() )。

从堆栈跟踪中,似乎actionPerformed调用了componentMove ,它调用了collisionDetected ,但是这些都没有调用addShot ,因此你的公共静态shot永远不会被初始化并且为null(因此是异常)。

请注意,访问shot的公共静态staticXLauncherCoord不是问题,因为它是静态的并且不依赖于Shot的实例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM