使用BuffereImage加载精灵时出现JAVA错误
我在遵循一个教程,我遇到了这个错误,我似乎无法解决问题是什么。我所要做的就是加载一个精灵图像。代码如下: 以下是错误: 线程“thread-0”java.lang.NullPointerException中出现异常 位于com.mainpkg.game.Handler.gg(Handler.java:27) 位于com.mainpkg.game.game.render(game.java:107) 在com.mainpkg.game.game.run(game.java:83) 位于java.base/java.lang.Thread.run(Thread.java:844) 主要游戏类别:使用BuffereImage加载精灵时出现JAVA错误,java,image,graphics,Java,Image,Graphics,我在遵循一个教程,我遇到了这个错误,我似乎无法解决问题是什么。我所要做的就是加载一个精灵图像。代码如下: 以下是错误: 线程“thread-0”java.lang.NullPointerException中出现异常 位于com.mainpkg.game.Handler.gg(Handler.java:27) 位于com.mainpkg.game.game.render(game.java:107) 在com.mainpkg.game.game.run(game.java:83) 位于java.b
public class Game extends Canvas implements Runnable {
public static final int WIDTH = 800, HEIGHT = WIDTH / 12 * 9;
private Thread thread;
private boolean running = false;
private Handler handler;
private BufferedImage grassTile;
public Game() {
new Window(WIDTH, HEIGHT, "MOON EXPOLATION", this);
handler = new Handler(getWidth(), getHeight());
testImage = loadImage("Resources/GrassTile.png");
}
private BufferedImage loadImage(String path) {
try {
BufferedImage loadedImage = ImageIO.read(new FileInputStream(path));
BufferedImage formattedImage = new BufferedImage(loadedImage.getWidth(), loadedImage.getHeight(),
BufferedImage.TYPE_INT_RGB);
formattedImage.getGraphics().drawImage(loadedImage, 0, 0, null);
return formattedImage;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
public synchronized void start() {
thread = new Thread(this);
thread.start();
running = true;
}
public synchronized void stop() {
try {
thread.join();
running = false;
} catch (Exception e) {
e.printStackTrace();
}
}
public void run() {
int FRAMES = 0;
int TICKS = 0;
long lastTime = System.nanoTime();
double unprocessed = 0;
double nsPerSecs = 1000000000 / 60.0;
long Timer = System.currentTimeMillis();
while (running) {
long now = System.nanoTime();
unprocessed += (now - lastTime) / nsPerSecs;
lastTime = now;
if (unprocessed >= 1) {
TICKS++;
ticks();
unprocessed -= 1;
}
try {
Thread.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
FRAMES++;
render();
if (System.currentTimeMillis() - Timer > 1000) {
System.out.println("Ticks: " + TICKS + " FPS: " + FRAMES);
TICKS = 0;
FRAMES = 0;
Timer += 1000;
}
}
stop();
}
private void ticks() {
}
void render() {
BufferStrategy bs = this.getBufferStrategy();
if (bs == null) {
super.paint(getGraphics());
this.createBufferStrategy(3);
return;
}
Graphics g = bs.getDrawGraphics();
handler.renderImage(testImage, 0, 0);
handler.render(g);
// g.setColor(Color.BLACK);
// g.fillRect(0,0,WIDTH,HEIGHT);
g.dispose();
bs.show();
}
public static void main(String[] args) {
new Game();
}
处理程序类:
public class Handler {
private BufferedImage view;
private int pixels[];
public Handler(int width, int height) {
view = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
pixels = ((DataBufferInt) view.getRaster().getDataBuffer()).getData();
}
public void render(Graphics g) {
g.drawImage(view, 0, 0, view.getWidth(), view.getHeight(), null);
}
public void renderImage(BufferedImage image, int xPosition,int yPosition) {
int[] imagepixels = ((DataBufferInt) image.getRaster().getDataBuffer()).getData();
for(int y = 0; y < image.getHeight(); y++) {
for(int x = 0; x < image.getWidth(); x++) {
pixels[(x + xPosition) + (y + yPosition ) * view.getWidth()] = imagepixels[x + y * image.getWidth()];
}
}
}
公共类处理程序{
私有缓冲区图像视图;
私有整数像素[];
公共处理程序(整数宽度、整数高度){
视图=新的BuffereImage(宽度、高度、BuffereImage.TYPE_INT_RGB);
像素=((DataBufferInt)view.getRaster().getDataBuffer()).getData();
}
公共空间渲染(图形g){
g、 drawImage(视图,0,0,view.getWidth(),view.getHeight(),null);
}
公共空白渲染(BuffereImage图像、int xPosition、int yPosition){
int[]imagepixels=((DataBufferInt)image.getRaster().getDataBuffer()).getData();
对于(int y=0;y
问题在于:
BufferedImage loadedImage = ImageIO.read(Game.class.getResource(path));
getResource(path)返回null,这导致异常
尝试将图像路径更改为“Assets/GrassTile.png”
一个提示:
你应该避免使用绝对路径来定位你的资源。这是一个非常糟糕的主意,因为如果你更改项目的位置,它将停止工作,请尝试使用相对路径。嘿,谢谢你的回复,我已经尝试了你建议的方法,但不幸的是没有成功,我仍然收到一个错误。是相同的错误吗?如果是这样的话在这种情况下,我确信这是导致异常的路径。我将精灵移动到项目的主文件中,并使用这个buffereImage LoadeImage=ImageIO.read(getClass().getResource(“GrassTile.png”);