Ошибка JAVA при загрузке спрайта с использованием BufferedImage - PullRequest
0 голосов
/ 26 января 2019

Я следую учебному пособию, и я сталкиваюсь с этой ошибкой, я не могу понять, в чем проблема. Все, что я пытаюсь сделать, это загрузить изображение Sprite. Вот код:

Вот ошибка:

Исключение в потоке "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)

Основной игровой класс:

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()];
        }
    }
}

1 Ответ

0 голосов
/ 26 января 2019

Проблема здесь:

BufferedImage loadedImage = ImageIO.read(Game.class.getResource(path));

getResource (путь) возвращает ноль, и это вызывает исключение.

Попробуйте изменить путь к изображению на «Assets / GrassTile.png»

Один совет:

Вам следует избегать использования абсолютных путей для определения местоположения ваших ресурсов.Это действительно плохая идея, потому что если вы измените местоположение вашего проекта, он перестанет работать, попробуйте использовать относительные пути.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...