slick2d图像丢失了

时间:2014-10-13 11:03:40

标签: java image lwjgl slick2d

我的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;
}
}

1 个答案:

答案 0 :(得分:0)

操作图像后我没有调用Graphics.flush()方法。