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 楼答案
与fillRect不同,drawImage有一个奇怪的特性:它可能无法完成。如果完成,则返回true。否则,它将返回false,直到稍后调用paintComponent,绘图才会完成
虽然这对于大型映像来说不是线程安全的,但有一个解决方法: