【发布时间】:2026-01-15 23:20:03
【问题描述】:
我正在制作一个游戏(如文明),它具有不同类型的图块,我想将它们渲染为图像。我有 9 个不同的 16x16 png 图像要加载(称为 Con1、Con2 等),这是我的图像加载代码:(img[] 是我的 BufferedImage 数组)
public void loadImages(){
for(int i = 0; i < 9; i++){
try {
img[i] = ImageIO.read(this.getClass().getResource("Con"+i+".png"));
}catch (Exception ex) {
System.out.println("Missing Image");
ex.printStackTrace();
}
}
}
然后我使用以下代码绘制这些图像:(t[][] 是我的图块类型数组)
public void paint(Graphics g){
if(loop){
BufferedImage B = new BufferedImage(this.getWidth(), this.getHeight(), BufferedImage.TYPE_INT_RGB);
Graphics r = B.getGraphics();
for (int x = 0; x < WIDTH; x++){
for (int y = 0; y < HEIGHT; y++){
if(i[x][y] == 0){
if (t[x][y] == 0){
g.drawImage(img[0], x, y, this);
}
else if(t[x][y] == 1){
g.drawImage(img[1], x, y, this);
}
else if(t[x][y] == 3){
g.drawImage(img[3], x, y, this);
}
else if(t[x][y] == 4){
g.drawImage(img[4], x, y, this);
}
else if(t[x][y] == 5){
g.drawImage(img[5], x, y, this);
}
}
r.fillRect(x*SCALE, y*SCALE, SCALE, SCALE);
}
}
g.drawImage(B, 0, 22, this);
}
}
我的问题是当我运行它时它没有正确显示。我得到这张图片:
在窗口的左上角闪烁。我应该看到的是与上面的左上角部分相似的图像(被海洋包围的陆地),除了大到足以填满窗口。这是一些可运行的代码:(我认为如果没有所需的图像,该代码将无法运行,但我希望能在为大家提供图像方面提供一些帮助。)
//imports
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
public class MCVCon extends JFrame implements KeyListener, MouseListener{
//setting up variables
public BufferedImage[] img = new BufferedImage[9];
private final int WIDTH = 50, HEIGHT = 50;
private boolean loop = false;
private int SCALE = 16;
int t[][] = new int[WIDTH][HEIGHT]; //terrain type (since I took out the terrain generation it is set to 0 or ocean)
public MCVCon(){
//creating the window
super("Conqueror");
setSize(SCALE*WIDTH, SCALE*HEIGHT+22);
setVisible(true);
requestFocusInWindow();
setDefaultCloseOperation(EXIT_ON_CLOSE);
loadImages();
loop = true;
while(true){
this.repaint();
//delay for repaint
try{
Thread.sleep(50);
}
catch(Exception ex){
ex.printStackTrace();
}
}
}
//load images
public void loadImages(){
for(int i = 0; i < 9; i++){
try {
img[i] = ImageIO.read(this.getClass().getResource("Con"+i+".png"));
}catch (Exception ex) {
System.out.println("Missing Image");
ex.printStackTrace();
}
}
}
//paint the images
public void paint(Graphics g){
if(loop){
BufferedImage B = new BufferedImage(this.getWidth(), this.getHeight(), BufferedImage.TYPE_INT_RGB);
Graphics r = B.getGraphics();
for (int x = 0; x < WIDTH; x++){
for (int y = 0; y < HEIGHT; y++){
if (t[x][y] == 0){
g.drawImage(img[0], x, y, this);
}
else if(t[x][y] == 1){
g.drawImage(img[1], x, y, this);
}
r.fillRect(x*SCALE, y*SCALE, SCALE, SCALE);
}
}
g.drawImage(B, 0, 22, this);
}
}
//run the program
public static void main(String[] args) {
new MCVCon();
}
//necessary overrides
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
}
@Override
public void mouseClicked(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
}
我想知道问题可能是什么。提前致谢。
【问题讨论】:
-
看起来您在其中缺少缩放因子,但如果没有更多信息很难说,尤其是原始图像的外观。旁注——你不是在一个活跃的绘画方法中做这个绘图,比如JPanel的
paintComponent方法,是吗?如果是这样,它的效率非常低。 -
为了更好的帮助,创建并发布一个有效的minimal reproducible example,一个小但完整的演示程序,我们可以自己编译和运行。请阅读链接。
-
@HovercraftFullOfEels 我没有使用 paintComponent 方法,我使用的是 JFrame 并且只是为每个像素绘制一个矩形,关于这个主题,我有一个用于像素图形的 SCALE 最终变量,但是我不知道如何放大我加载的图像。你能解释一下如何做到这一点或将我链接到一个示例吗?
-
如果您直接在 JFrame 上绘图,听起来您并没有充分发挥 Swing 绘画的最大优势。
-
g.drawImage(img[1], x, y, this);不是绘制到BufferedImage,而是直接绘制到组件的Graphics上下文,但是你可以在顶部绘制缓冲图像,所以我有不知道发生了什么:P
标签: java image bufferedimage