有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java drawImage不起作用,但drawRect起作用?

真的很奇怪。。。我在游戏的某些部分上遵循了这个视频教程,当我使用

package dashiesgame;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;

public class Cell extends Rectangle {
    private static final long serialVersionUID = 1L;
    public int[] id = {0,0};
    public Cell(Rectangle size, int[] id) {
        setBounds(size);
        this.id = id;
    }
public void render(Graphics g){
    g.setColor(new Color(255,100,100));
    g.fillRect(x,y,width,height);

}
}

成功了。我的屏幕底部有一些红色方块。我想用我在GIMP中创建并导出到png的单元格类型的东西替换红方块,所以我用

 public void render(Graphics g){
    g.drawImage(Block.cell, x, y, width, height, null);

}

在视频中,那家伙就是这么做的,结果很好。然而,它似乎没有出现在我面前。我曾尝试将其改为this而不是null,但随后它使我实现了ImageObserver,这在我尝试运行代码时会给我带来大量错误。任何帮助都将不胜感激

还有,如果我对这件事有点无知,我也很抱歉。。。这是我第一次编码,我正在边走边学习,所以请耐心一点。。。。如果有人需要看的话,我还可以从其他部分提供更多代码来帮助我找出问题所在

这就是我要去的地方。cell已定义:(它是类块,然后cell是图像。我还取出了其他图像以节省空间,因为有一堆,但你明白了。)

package dashiesgame;

import java.awt.Transparency;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

public class Block {
    public static int tileSize = 20;
    public static int invLength = 6;
    public static int invCellSize = 40;
    public static int invCell = 8;
    public static int invCellSpace = 4;
    public static int invBorderSpace = 4;

    public static final int[] air1 = {-1, -1};
    public static final int[] TwilightBlock1 = {0,0};
    public static final int[] DashieBlock1 = {1,0};
    public static final int[] ApplejackBlock1 = {2,0};
    public static final int[] RarityBlock1 = {3,0};
    public static final int[] FluttershyBlock1 = {4,0};
    public static final int[] PinkieBlock1 = {5,0};


    public static BufferedImage cell ;
    {


    try {
        Block.cell = ImageIO.read(new File("cell.png"));
    } catch (IOException e) {
        e.printStackTrace();
    }
    }   
}

那么这也很重要

package dashiesgame;

import java.awt.Graphics;
import java.awt.Rectangle;

public class Inventory {
    public Cell[] invBar = new Cell[Block.invLength];
    public Inventory(){
        for (int i=0;i<invBar.length;i++){
            invBar[i] = new Cell(new Rectangle((Game.pixel.width / 2) - ((Block.invLength * (Block.invCellSize + Block.invCellSpace))/2) + (i * (Block.invCellSize + Block.invCellSpace)), Game.size.height - (Block.invCellSize + Block.invCellSpace), Block.invCellSize, Block.invCellSize), Block.air1 );
        }
    };
    public void render(Graphics g){
        for (int i=0;i<invBar.length;i++){
            invBar[i].render(g);
    }
}
}

共 (1) 个答案

  1. # 1 楼答案

    与fillRect不同,drawImage有一个奇怪的特性:它可能无法完成。如果完成,则返回true。否则,它将返回false,直到稍后调用paintComponent,绘图才会完成

    虽然这对于大型映像来说不是线程安全的,但有一个解决方法:

    while (!g.drawImage(...)) {
      // Loop body empty   wait for drawImage to return true
    }