在遵循本教程的同时,我的代码存在一些错误。
我正在尝试加载精灵表。
当我删除spriteSheet = loader.loadImage("/sprite_sheet.png");
中的代码init()
时,
效果很好,但是当我添加该代码时,就会出现错误。
'sprite_sheet.png'
和'background_3.png'
在JAVA Project文件夹中。
这是我的错误和代码。谢谢。
Exception in thread "Thread-0" java.lang.IllegalArgumentException: input == null!
at java.desktop/javax.imageio.ImageIO.read(ImageIO.java:1400)
at com.game.src.main.BufferedImageLoader.loadImage(BufferedImageLoader.java:16)
at com.game.src.main.Game.init(Game.java:46)
at com.game.src.main.Game.run(Game.java:91)
at java.base/java.lang.Thread.run(Thread.java:835)
代码:
public class Game extends Canvas implements Runnable{
private static final long serialVersionUID = 1L;
public static final int WIDTH = 320;
public static final int HEIGHT = WIDTH / 12 * 9;
public static final int SCALE = 2;
public final String TITLE = "2D Space Game";
private boolean running = false;
private Thread thread;
private BufferedImage image = new BufferedImage(WIDTH,HEIGHT,BufferedImage.TYPE_INT_RGB);
BufferedImageLoader loader = new BufferedImageLoader();
//private BufferedImage spriteSheet = null;
private BufferedImage spriteSheet = null;
private BufferedImage background = null;
private Player p;
public void init() {
requestFocus();
BufferedImageLoader loader = new BufferedImageLoader();
try {
//spriteSheet = loader.loadImage("./images/sprite_sheet.png");
spriteSheet = loader.loadImage("/sprite_sheet.png");
background = loader.loadImage("/background_3.png");
}catch(IOException e) {
System.out.println("The problem is "+ e.getMessage());
e.printStackTrace();
}
addKeyListener(new KeyInput(this));
//this == game
p = new Player(200,200,this);
}
private synchronized void start() {
if(running)
return;
running = true;
thread = new Thread(this);
thread.start();
}
private synchronized void stop() {
if(!running)
return;
running = false;
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
system.exit(1);
}
@Override
public void run() {
init();
long lastTime = System.nanoTime();
final double amountOfTicks = 60.0;
double ns = 1000000000/ amountOfTicks;
double delta = 0;
int updates = 0;
int frames = 0;
long timer = System.currentTimeMillis();
// game loop,게임을 update
while(running) {
long now = System.nanoTime();
delta += (now - lastTime)/ns;
lastTime = now;
if(delta >=1) {
tick();
updates++;
delta--;
}
render();
frames++;
if(System.currentTimeMillis() - timer > 1000) {
timer += 1000;
System.out.println(updates+" Ticks,FPS "+frames);
updates = 0;
frames = 0;
}
}
stop();
}
// Game update
private void tick() {
p.tick();
}
// Game render
private void render() {
BufferStrategy bs = this.getBufferStrategy();
if(bs == null) {
createBufferStrategy(3);
return;
}
Graphics g = bs.getDrawGraphics();
/////////////////////////////////
g.drawImage(image,getWidth(),getHeight(),this);
g.drawImage(background,null);
p.render(g);
//////////////////////////////////
g.dispose();
bs.show();
}
public void keypressed(KeyEvent e) {
int key = e.getKeyCode();
if(key == KeyEvent.VK_RIGHT) {
p.setVelX(3);
}else if(key == KeyEvent.VK_LEFT) {
p.setVelX(-3);
}else if(key == KeyEvent.VK_DOWN) {
p.setVelY(3);
}else if(key == KeyEvent.VK_UP) {
p.setVelY(-3);
}
}
public void keyReleased(KeyEvent e) {
int key = e.getKeyCode();
if(key == KeyEvent.VK_RIGHT) {
p.setVelX(0);
}else if(key == KeyEvent.VK_LEFT) {
p.setVelX(0);
}else if(key == KeyEvent.VK_DOWN) {
p.setVelY(0);
}else if(key == KeyEvent.VK_UP) {
p.setVelY(0);
}
}
public static void main(String[] args) {
Game game = new Game();
game.setPreferredSize(new Dimension(WIDTH * SCALE,HEIGHT * SCALE));
game.setMaximumSize(new Dimension(WIDTH * SCALE,HEIGHT * SCALE));
game.setMinimumSize(new Dimension(WIDTH * SCALE,HEIGHT * SCALE));
JFrame frame = new JFrame(game.TITLE);
frame.add(game);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
game.start();
}
public BufferedImage getSpriteSheet() {
return spriteSheet;
}
}
“ BufferedImageLoad”类是这个。
public class BufferedImageLoader {
private BufferedImage image;
public BufferedImage loadImage(String path) throws IOException {
image = ImageIO.read(getclass().getResource(path));
return image;
}
}