提问者:小点点

Graphics2d.DrawImage()出现异常[已关闭]


当我使用下面的代码时,它会引发异常。 但当我补充:

graphics.drawString("some string", 0, 0);

对于render方法,一切都正常工作我试图查找一些有关drawImage()的信息,如果在绘制之前必须要做什么,但是找不到。 你能告诉我怎么回事吗?

我创建了一个窗口,并将GamePanel类添加到其中。

import javax.swing.JPanel;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;

public class GamePanel extends JPanel implements Runnable{
    //Fields
    public static int WIDTH = 600;
    public static int HEIGHT = 400;

    private static double targetTicksPerSecond = 60;
    private static double targetNanosBetweenTicks = 1_000_000_000 / targetTicksPerSecond;

    private long startNanos, lastNanos, totalDeltaTime, timer;
    private int frames, updates;

    private BufferedImage image;   // = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
    private Graphics2D graphics;

    private Thread thread;
    private boolean running;

    public GamePanel(){
        if(thread == null){ thread = new Thread(this); thread.start(); }

        setPreferredSize(new Dimension(WIDTH, HEIGHT));

        setFocusable(true);
        requestFocusInWindow();
    }

    @Override
    public void run(){
        init();

        while(running){
            startNanos = System.nanoTime();
            totalDeltaTime += startNanos - lastNanos;
            lastNanos = startNanos;

            while(totalDeltaTime > targetNanosBetweenTicks){
                update();
                update++;

                totalDeltaTime = 0;
            }
            
            render();
            draw();
            frames++;

            if((System.nanoTime() - timer) > 1_000_000_000){
                timer += 1_000_000_000;
                
                System.out.println("FPS: " + frames + " Ticks: " + update);

                frames = 0; update = 0;
            }
        }
    }

    private void init() {
        running = true;
        timer = System.nanoTime();

        image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
        graphics = image.createGraphics();
    }

    private void update() {
    }

    private void render() {
        graphics.setColor(Color.BLACK);
        graphics.fillRect(0, 0, WIDTH, HEIGHT);
        graphics.drawString("a", 0, 0);
    }

    private void draw(){
        Graphics g = (Graphics) getGraphics();
        g.drawImage(image, 0, 0, null);
        g.dispose();
    }
}

好的,我正在尝试使用“Graphics2D”创建一个简单的游戏来理解它是如何工作的,并且我在一个循环中不停地调用draw()和render()方法。 在不添加graphics.drawsting(“some string”,x,y);的情况下,在第85行抛出此异常,即g.drawimage(image,0,0,null);

Exception in thread "Thread-0" java.lang.NullPointerException
        at GamePanel.draw(GamePanel.java:85)
        at GamePanel.run(GamePanel.java:54)
        at java.base/java.lang.Thread.run(Thread.java:832)

我以前实际使用过这段代码,但不知何故,它不起作用。 如果有更有效的方法来制作游戏,我想知道。


共1个答案

匿名用户

你得到的是什么样的例外? 要绘制图像,请参阅此处的链接。 https://docs.oracle.com/javase/tutorial/2D/images/drawimage.html试试:

private void draw(){
    Graphics g = (Graphics) getGraphics();
    if (image != null)
      g.drawImage(image, 0, 0, this);
    g.dispose();
}