精灵(Sprite)和地图砖块应该使用硬件加速的BufferedImage对象,我们使用ImageIO读取BufferedImage:
BufferedImage image = ImageIO.read(url);
Sprite sprite = new Sprite(image, 96, 96);
在Sprite类中根据传进来的image创建每系列每祯的小图片:
int
r
=
image.getHeight()
/
height;
int c = image.getWidth() / width;
BufferedImage[][] frames = new BufferedImage[r][c];
for ( int i = 0 ; i < r; i ++ ) {
for ( int j = 0 ; j < c; j ++ ) {
BufferedImage bi = getGraphicsConfiguration().createCompatibleImage(width, height, Transparency.BITMASK);
Graphics2D g = bi.createGraphics();
g.setComposite(AlphaComposite.Src);
g.drawImage(image, - j * width, - i * height, null );
g.dispose();
frames[i][j] = bi;
}
}
int c = image.getWidth() / width;
BufferedImage[][] frames = new BufferedImage[r][c];
for ( int i = 0 ; i < r; i ++ ) {
for ( int j = 0 ; j < c; j ++ ) {
BufferedImage bi = getGraphicsConfiguration().createCompatibleImage(width, height, Transparency.BITMASK);
Graphics2D g = bi.createGraphics();
g.setComposite(AlphaComposite.Src);
g.drawImage(image, - j * width, - i * height, null );
g.dispose();
frames[i][j] = bi;
}
}
使用方法getGraphicsConfiguration().createCompatibleImage()创建的BufferedImage一般是硬件加速的,不过如果Transparency的类型不是BITMASK或者OPAQUE,是TRANSLUCENT,则要启用-Dsun.java2d.translaccel=true才能硬件加速,对于游戏的精灵来说使用BITMASK实现起来也不错。
使用g.drawImage(image, -j*width, -i*height, null);,避免使用BufferedImage.getSubImage,不能硬件加速。
下边是测试用的精灵图片:
下边是游戏中的截图,保存成JPG文件造成截图比较模糊,请见谅: