我正在制作一个游戏并有一个班级来打印屏幕上的所有内容。我在这一行收到错误:g.drawImage(chImage, imageP.x*scale, imageP.y*scale, null);
是不是因为我的结尾是空的?我已经查找了这个错误,并试图找到它,我明白在该行中有些东西是空的,但我无法弄清楚什么是null或如何解决这个问题。如果你需要我发布其他课程我可以。到目前为止,我的谷歌搜索认为它可能与我的变量初始化方式有关。
package Game;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import javax.swing.JPanel;
public class Printer extends JPanel{
private Map map;
private Character ch;
private int scale;
private Point imageP;
private BufferedImage chImage;
private ArrayList<Rectangle> part;
public Printer(int scale1){
scale = scale1;
map = new Map();
ch = new Character();
imageP = ch.getPoint();
chImage = ch.getImage();
part = map.setPart();
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(chImage, imageP.x*scale, imageP.y*scale, null);
for(int i=0; i<part.size(); i++){
Rectangle temp = new Rectangle(part.get(i));
g.drawRect(temp.x, temp.y, temp.width, temp.height);
g.fillRect(temp.x, temp.y, temp.width, temp.height);
}
}
}
package Game;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JPanel;
//Creates a image for a character and allows him to walk around the screen
public class Character extends JPanel{
private BufferedImage image;
private Point imageP;
private int speed;
private int scale;
private int width;
private int height;
public Character(){
}
public Character(int x, int y, int scale1, int w, int h){
super();
try {
image = ImageIO.read(new File("F:\\Programming\\Final Project\\Top_down\\narwhal.png"));
} catch (IOException ex) {
}
scale = scale1;
imageP = new Point(x,y);
speed = 10;
width = w;
height = h;
addKeyListener(new KeyAdapter(){
@Override
public void keyPressed(KeyEvent evt){
moveIt(evt);
}
});
}
public void moveIt(KeyEvent evt){
switch(evt.getKeyCode()){
case KeyEvent.VK_S:
if(imageP.y <= height-33)
imageP.y += 1*speed;
break;
case KeyEvent.VK_W:
if(imageP.y >=0+5)
imageP.y -= 1*speed;
break;
case KeyEvent.VK_A:
if(imageP.x >=0+5)
imageP.x -= 1*speed;
break;
case KeyEvent.VK_D:
if(imageP.x <= width-30)
imageP.x += 1*speed;
break;
}
repaint();
}
public Point getPoint(){
//g.drawImage(image, imageP.x*scale, imageP.y*scale, null); IGNORE THIS
return this.imageP;
}
public BufferedImage getImage(){
return this.image;
}
}
答案 0 :(得分:2)
确保您的chImage
实际上是Image
。换句话说,一个简单的测试就是打印到System.out
这里有一个例子:
System.out.println("chImage: " + chImage);
如果chImage在输出中打印类似AwtImage@17089
的内容,则会加载它。如果if在该点中显示为null,则表示没有加载的Image。如果发生这种情况,请检查您的图像路径,或者图像名称是否拼写正确。
答案 1 :(得分:1)
如何对所有这些做一些简单的if(component == null)。这样你就可以看到哪些是null。在我看来,这是一个非常直接的解决方案。
或者您调试代码并通过调试器检查变量的内容。
答案 2 :(得分:0)
NullPointerExcpetion很可能来自语句imageP.x*scale
和imageP.y*scale
。如果该点为null,则尝试访问x和y将抛出NPE。
这表示您的点imageP
未设置。
我在你的打印机方法中看到了
ch = new Character();
imageP = ch.getPoint();
chImage = ch.getImage();
因此,Character
的默认构造函数不会设置点和图像(或Character类中的任何内容),因此getter将返回null,这意味着该点为null。
您需要调用Character类的构造函数来执行所有这些操作,或者在默认构造函数Character()
中调用其他构造函数,并使用一些默认值。
在打印机中执行此操作
ch = new Character(0,0,1,10,10); //Or what ever defaults
imageP = ch.getPoint();
chImage = ch.getImage();
在角色中更改您的默认构造函数
public Character(){
this(0,0,1,10,10);
}
关于吸气剂和二传手的说明:
具有这些名称的方法的约定将使这些方法的类型为void
并接受如下参数:
public void setPoint(Point p)
{
this.characterPoint = p;
}
这会给你一个编译错误,好像你试图调用set
方法并为其分配变量,然后你知道有什么不对劲;
根据惯例,这些是getPoint()
这些不会采取批评但返回某种类型的对象,如
public Image getImage()
{
return this.characterImage;
}