【发布时间】:2015-07-09 19:57:23
【问题描述】:
我正在开发一款 2D 游戏,但在调整大小时遇到了问题。所以你可以在下面的代码中看到,我把所有的游戏东西都画到了一个 BufferedImage 中。之后,我从我的 JPanel 获取图形并在其上绘制图像。
所以我的问题是我现在如何调整我的游戏大小?我认为有很多可能性:1是图像也只是用jpanel调整大小,另一种方法可能是如果你有一个2d世界并且你调整框架的大小,游戏仍然是相同的大小但是您现在可以看到更多的 2d 世界,就像您的观看距离增加了一样。
有人知道我的代码的解决方案吗?
package de.avarion.theenchanter;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Game implements Runnable{
public static int WIDTH = 800;
public static int HEIGHT = 600;
public static int FPS = 30;
private JFrame frame;
private JPanel panel;
private BufferedImage image;
private Graphics2D g;
private Thread thread;
private boolean running
public Game() {
panel = new JPanel();
panel.setPreferredSize(new Dimension(WIDTH, HEIGHT));
panel.setFocusable(true);
panel.requestFocus();
frame = new JFrame("The Enchanter - pre Alpha");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(panel, BorderLayout.CENTER);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setResizable(true);
frame.setVisible(true);
image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
g = (Graphics2D) image.getGraphics();
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
running = true;
thread = new Thread(this);
thread.start();
}
@Override
public void run() { //game loop
while(running) {
update();
render();
try {
Thread.sleep(1000/FPS);
} catch(InterruptedException e) {
e.printStackTrace();
}
}
}
private void update() {
if(frame.getWidth() != WIDTH || frame.getHeight() != HEIGHT) {
frame.pack();
}
}
private void render() {
g.setColor(Color.black);//drawing on my image
g.fillRect(0, 0, WIDTH, HEIGHT);
Graphics g2 = panel.getGraphics(); // get graphics from panel
g2.drawImage(image, 0, 0, null); //drawing on my panel
g2.dispose();
}
}
【问题讨论】:
-
首先,这个:panel.getGraphics();不是 Swing 中的绘画方式。相反,您覆盖组件的 paintComponent 方法,当系统调用时,您执行的是绘画。 Swing 使用被动绘制过程,因此您可以在任何时候多次绘制组件,而无需您的直接交互或知识,当调用时,您希望更新组件的当前状态。
标签: java resize components