gpt4 book ai didi

java - drawImage() 拒绝绘制在方法外部实例化的图像

转载 作者:行者123 更新时间:2023-12-02 05:14:28 28 4
gpt4 key购买 nike

我目前正在尝试将图像打印到屏幕上,以便准备创建游戏。我可以单独显示图像,但前提是该图像是在 paintComponents() 类中实例化的。当然,我不想每帧都重新实例化整个板,但似乎无法让它工作。我该如何实现这个目标?

我尝试在类范围内声明一个图像并在类的构造函数中实例化它。但当我尝试调用drawImage()时,图像拒绝显示。当我在 printComponents() 中实例化它后,这个问题就消失了。我尝试过(少量)使用 JLabel 和 JIcon,但运气不佳。特别是因为我无法将 drawImage 与 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);
}
}

我想最终创建一个包含预加载图像的 Tile 对象的双数组,例如 myFile.png 我可以调用它来打印,例如 g.drawImage(tiles [1][1].getTexture(), 50, 50, null);

加载我的文件是有效的,因为我从不抛出异常,并且代码在 paintComponents 中工作正常。我错过了什么?

最佳答案

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

除此之外,您的paintMethod 似乎有一个错误(它实际上应该是paint 并覆盖JPanel 中的super 方法),您将需要对更新进行更改。我建议您看一下“Game-Loops”,尽管它也可以为每个实例使用单独的线程,但我不建议这样做。我更正了您的代码,以便您可以查看它:带有单独线程的第一个版本:

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++;
}
}
}

您需要问自己的第二件事是您是否可以为每个实体使用 BufferedImage 对象而不是整个 JPanel ;)

关于java - drawImage() 拒绝绘制在方法外部实例化的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56306281/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com