我目前正在尝试将图像打印到屏幕上,以便准备创建游戏。我可以自己显示图像,但是只有在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;(