1

我正在使用自定义像素引擎制作一个 rpg,当我尝试运行它时,我只得到一个 NullPointerException 并且我知道原因,但是当我尝试初始化该变量时,我在不同的位置得到另一个变量并修复了它现在它根本不会运行,我仍然得到一个 NullPointerException。这是出现错误的类,控制台告诉我错误出现在 screen.render(); 行。

import java.awt.Canvas;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferInt;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import sprites.SpriteSheetLoader;

public class Game extends Canvas implements Runnable{

    private static final long serialVersionUID = 1L;

    public static final int HEIGHT = 120;
    public static final int WIDTH = 120;
    public static final int SCALE = 3;
    public static final String NAME = "TypicalRPG";
    public SpriteSheetLoader loader;

    private BufferedImage img = new BufferedImage(WIDTH * SCALE, HEIGHT * SCALE, BufferedImage.TYPE_INT_RGB);
    private int[] pixels = ((DataBufferInt) img.getRaster().getDataBuffer()).getData();
    private boolean running = false;
    private Screen screen = new Screen(WIDTH, HEIGHT, loader);

    Random random = new Random();

    public void start(){

        running = true;

        new Thread(this).start();

    }

    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 jf = new JFrame(NAME);

        jf.add(game);

        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        jf.pack();

        jf.setVisible(true);
        jf.setResizable(true);

        game.start();

    }

    public void run(){

        while(running){

            tick();

            render();

            try{

                Thread.sleep(5);

            }

            catch(InterruptedException e){ e.printStackTrace(); }

        }

    }

    public void stop(){ running = false; }

    public void tick(){

        screen.render(0, 0, 0, 16, 16);

    }

    public void render(){

        BufferStrategy bs = getBufferStrategy();

        if(bs == null){

            createBufferStrategy(3);

            requestFocus();

            return;

        }

        for(int i = 0; i < screen.pixels.length; i++){

            pixels[i] = screen.pixels[i];

        }

        Graphics g = bs.getDrawGraphics();

        g.drawImage(img, 0, 0, getWidth(), getHeight(), null);

        g.dispose();

        bs.show();

    }

    public void init(){

        BufferedImage sheet = null;

        try {

            sheet = ImageIO.read(Game.class.getResourceAsStream("res/tiles.png"));

        }

        catch (IOException e) {

            e.printStackTrace();

    }

    loader = new SpriteSheetLoader(sheet);

    screen = new Screen(WIDTH, HEIGHT, loader);

    }

}

这是具有 render() 的类:

import sprites.SpriteSheetLoader;

public class Screen{

    public int[] pixels;

    private SpriteSheetLoader loader;
    private int w, h;

    int xoff = 0, yoff = 0;

    public Screen(int w, int h, SpriteSheetLoader loader){

        this.loader = loader;
        this.w = w;
        this.h = h;

        pixels = new int[w * h];

    }

    public void render(int xpos, int ypos, int tile, int width, int height){

        loader.grabTile(tile, width, height);

        xpos -= xoff;
        ypos -= yoff;

        for(int y = 0; y < height; y++){

            if(ypos + y < 0 || ypos + y >= h) continue;

            for(int x = 0; x < width; x++){

                if(xpos + x < 0 || xpos + x >= w) continue;

                int col = loader.pixels[x + (y * height)];

                if(col != -65281) pixels[(x + xpos) + (y + ypos)] = col;

            }

        }

    }

}
4

2 回答 2

5

似乎您从未在第一堂课中启动加载器。

你定义你的变量是这样的:

public SpriteSheetLoader loader;
private Screen screen = new Screen(WIDTH, HEIGHT, loader);

因此,您将一个空对象传递给您的屏幕。然后从那里尝试调用该空对象的方法:

loader.grabTile(tile, width, height);
于 2012-08-12T17:05:49.440 回答
1

只是宣布 loader,但从未启动它。

public SpriteSheetLoader loader;

于 2012-08-12T17:15:40.967 回答