我的Slick 2D API有问题。 我正在构建一个像2d游戏的小型塞尔达。所以我建立了一个小测试世界。世界由具有图像作为楼层的块组成。然后在render方法中绘制第一个所有块,并在网格上绘制网格之后。
主要是我使用光滑的Image类在屏幕上绘制和修改图像。
我在init()方法中加载图像。在render()方法中,我调用image.draw(x,y)来绘制图像。但似乎最后绘制的块没有绘制出来。相反,会出现黑洞。
作为测试我试图将特定图像写入硬盘。它取决于init方法,但是当我从渲染方法中保存图像时,我得到一个黑色图像。
在init方法之后图像会丢失,但其他图像仍然存在。
额外信息:在开始构建游戏时,我牢记从系统相关任务中分离游戏逻辑。这就是为什么我有一个基本的图像处理接口。游戏逻辑使用该界面。然后我使用java2d进行渲染,但性能很差。现在我切换到光滑,我写了一个适配器,除了“世界洞”之外它工作得很好。
这是界面:
public interface ImageRGBA {
public static final int CHANNEL_A = 3;
public static final int CHANNEL_R = 2;
public static final int CHANNEL_G = 1;
public static final int CHANNEL_B = 0;
public static final int CHANNEL_COUNT = 4;
public int getHeight();
public int getWidth();
public void setPixel(int x, int y, int channel, byte value);
public void setPixel(int x, int y, byte[] argb);
public byte getPixel(int x, int y, int channel);
public byte[] getPixel(int x, int y);
public int getPixelARGB(int x, int y);
public void setPixelARGB(int x, int y, int argb);
public void insertImage(int x, int y, ImageRGBA image);
}
光滑的实施:
public class SlickImageAdapter implements ImageRGBA {
private final Image image;
public SlickImageAdapter(Image image){
this.image = image;
}
@Override
public int getHeight() {
return this.image.getHeight();
}
@Override
public int getWidth() {
return this.image.getWidth();
}
@Override
public void setPixel(int x, int y, int channel, byte value) {
Color color = this.image.getColor(x,y);
int[] components = new int[ImageRGBA.CHANNEL_COUNT];
components[ImageRGBA.CHANNEL_R] = color.getRed();
components[ImageRGBA.CHANNEL_G] = color.getGreen();
components[ImageRGBA.CHANNEL_B] = color.getBlue();
components[ImageRGBA.CHANNEL_A] = color.getAlpha();
components[channel] = value - Byte.MIN_VALUE;
try {
Graphics graphics = this.image.getGraphics();
graphics.setColor(new Color(
components[ImageRGBA.CHANNEL_R],
components[ImageRGBA.CHANNEL_G],
components[ImageRGBA.CHANNEL_B],
components[ImageRGBA.CHANNEL_A]
));
graphics.fillRect(x, y, 1, 1);
// graphics.destroy();
} catch (SlickException e) {
e.printStackTrace();
}
}
@Override
public void setPixel(int x, int y, byte[] argb) {
try {
Graphics graphics = this.image.getGraphics();
graphics.setColor(new Color(
argb[ImageRGBA.CHANNEL_R] - Byte.MIN_VALUE,
argb[ImageRGBA.CHANNEL_G] - Byte.MIN_VALUE,
argb[ImageRGBA.CHANNEL_B] - Byte.MIN_VALUE,
argb[ImageRGBA.CHANNEL_A] - Byte.MIN_VALUE
));
graphics.fillRect(x,y,1,1);
//graphics.destroy();
} catch (SlickException e){
e.printStackTrace();
}
}
@Override
public byte getPixel(int x, int y, int channel) {
return this.getPixel(x,y)[channel];
}
@Override
public byte[] getPixel(int x, int y) {
Color color = this.image.getColor(x,y);
byte[] bytes = new byte[ImageRGBA.CHANNEL_COUNT];
bytes[ImageRGBA.CHANNEL_R] = (byte) (color.getRedByte() + Byte.MIN_VALUE);
bytes[ImageRGBA.CHANNEL_G] = (byte) (color.getGreenByte() + Byte.MIN_VALUE);
bytes[ImageRGBA.CHANNEL_B] = (byte) (color.getBlueByte() + Byte.MIN_VALUE);
bytes[ImageRGBA.CHANNEL_A] = (byte) (color.getAlphaByte() + Byte.MIN_VALUE);
return bytes;
}
@Override
public int getPixelARGB(int x, int y) {
ImageManager imageManager = Device.getDevice().getImageManager();
return imageManager.byteArrayToIntARGB(this.getPixel(x,y));
}
@Override
public void setPixelARGB(int x, int y, int argb) {
ImageManager imageManager = Device.getDevice().getImageManager();
this.setPixel(x,y, imageManager.intARGBToByteArray(argb));
}
@Override
public void insertImage(int x, int y, ImageRGBA image) {
try{
Graphics graphics = this.image.getGraphics();
graphics.drawImage(((SlickImageAdapter) image).getImage(), x, y);
//graphics.destroy();
}catch (SlickException e){
e.printStackTrace();
}
}
public Image getImage(){
return this.image;
}
}
答案 0 :(得分:0)
操作图像后我没有调用Graphics.flush()方法。