使用javax.imageio制作精灵时发生IllegalStateException(Input == null!)

在遵循本教程的同时,我的代码存在一些错误。

我正在尝试加载精灵表。

当我删除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;
    }
}
wanyfkkk 回答:使用javax.imageio制作精灵时发生IllegalStateException(Input == null!)

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/2971986.html

大家都在问