drawimage()拒绝绘制实例化外部方法的图像



我目前正在尝试将图像打印到屏幕上,以便准备创建游戏。我可以自己显示图像,但是只有在paintComponents()类中实例化图像。当然,我不想在每个框架中重新构成整个板,但似乎无法使其正常工作。我将如何完成?

我尝试声明整个图像范围内的图像,并在类的构造函数中实例化。一旦我尝试致电drawImage(),图像就会拒绝出现。一旦我在printComponents()中实例化,这个问题就消失了。我已经(少量(使用了Jlabel和Jicon,但运气并没有太多运气。特别是因为我不能用jlabel使用绘图。

这就是不工作的>工作:

public class Skeleton extends JPanel
{
    BufferedImage img = null;
    public Skeleton()
    {
        try{
            img = ImageIO.read(new File(myFile.png));
        } catch (IOException e){
            System.out.println("Loading failed.");
        }
        while(true)
        {
            repaint();
        }
    }
    public paintComponents(Graphics g)
    {
        g.drawImage(img, 50, 50, null);
    }   
}

工作:

public class Skeleton extends JPanel
{

    public Skeleton()
    {
        while(true)
        {
            repaint();
        }
    }
    public paintComponents(Graphics g)
    {
        BufferedImage img = null;
        try{
            img = ImageIO.read(new File(myFile.png));
        } catch (IOException e){
            System.out.println("Loading failed.");
        }
        g.drawImage(img, 50, 50, null);
    }   
}

我想最终创建一个包含预加载图像的瓷砖对象,例如myFile.png,我可以打电话给它打印,例如g.drawImage(tiles[1][1].getTexture(), 50, 50, null);

加载文件的工作起作用,因为我永远不会引发异常,并且在paintComponents中,代码正常。我想念什么?

好的,我会做2件事:首先,我测试了两个版本,并且都对我不起作用。我想这可能是由您在构造函数中创建的无限循环引起的,因为它永远不会退出。

除此之外,您似乎在画面上遇到了一个错误(实际上应该是油漆并覆盖jpanel中的超级方法(,您将需要对更新进行更改。我建议您看一下"游戏环",尽管它也可以与每个实例的单独线程一起使用,尽管我建议您反对。我纠正了您的代码,以便您可以查看它:第一个版本带有单独的线程:

package stackoverflowtests;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JPanel;
public class Skeleton extends JPanel implements Runnable {
    private BufferedImage img = null;
    public Skeleton() {
        setSize(1000, 500);
        try {
            img = ImageIO.read(new File("index.jpg"));
        } catch (IOException e) {
            System.out.println("Loading failed.");
        }
    }
    public void paint(Graphics g) {
        g.drawImage(img, 50, 50, null);
    }
    @Override
    public void run() {
        while (true) repaint();
    }
}

和这样的主要内容:

package stackoverflowtests;
import javax.swing.JFrame;
public class Main extends JFrame {
    public Main() {
        setSize(1280, 720);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Skeleton skeli = new Skeleton();
        skeli.setLocation(0, 0);
        skeli.setSize(1000, 500);
        add(skeli);
        new Thread(skeli).start();
        setVisible(true);
    }
    public static void main(String[] args) {
        Main main = new Main();
    }
}

可能与游戏循环的可能性2:

package stackoverflowtests;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JPanel;
public class Skeleton extends JPanel {
    private BufferedImage img = null;
    public Skeleton() {
        setSize(1000, 500);
        try {
            img = ImageIO.read(new File("index.jpg"));
        } catch (IOException e) {
            System.out.println("Loading failed.");
        }
    }
    public void paint(Graphics g) {
        g.drawImage(img, 50, 50, null);
    }
}

和主要:

package stackoverflowtests;
import javax.swing.JFrame;
public class Main extends JFrame {
    public Main() {
        setSize(1280, 720);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Skeleton skeli = new Skeleton();
        skeli.setLocation(0, 0);
        skeli.setSize(1000, 500);
        add(skeli);
        setVisible(true);
    }
    public static void main(String[] args) {
        Main main = new Main();
        // Gameloop
        long lastTime = System.nanoTime();
        double amountOfTicks = 60.0;
        double ns = 1000000000 / amountOfTicks;
        double delta = 0;
        long timer = System.currentTimeMillis();
        int frames = 0;
        while (true) {
            long now = System.nanoTime();
            delta += (now - lastTime) / ns;
            lastTime = now;
            while (delta >= 1) {
                // updates++;
                delta--;
            }
            System.out.println("repaint");
            main.repaint();
            frames++;
        }
    }
}

您需要质疑的第二件事是,您是否只能使用一个缓冲图的对象而不是为每个实体使用整个jpanel;(

最新更新