package invaders101.spritesystem;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsEnvironment;
import java.awt.Image;
import java.awt.Transparency;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import java.util.HashMap;
import javax.imageio.ImageIO;
/**
* resource manager para los sprites del juego.
* <p>
* [singleton]
* <p>
* @author Alejandro Cerutti, Mauricio Blint, Patricio Marrone
*/
public class ImageCache {
private static ImageCache single = new ImageCache();
private ImageCache() {
super();
}
/**
*
* @return single instance de esta clase
*/
public static ImageCache getInstance() {
return single;
}
private HashMap<String, Image> images = new HashMap<String, Image>();
/**
* Recupera un sprite del store
*
* @return Instancia de sprite, conteniendo una imagen acelerada de la referencia pedida
*/
public Image getImage(String imageUrl) {
// si el sprite se encuentra en el hashMap, simplemente se retorna
if (images.get(imageUrl) != null) {
return images.get(imageUrl);
}
BufferedImage sourceImage = getImageFromUrl(imageUrl);
// crea una imagen acelerada para almacenar es sprite dentro
GraphicsConfiguration gc = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration();
Image image = gc.createCompatibleImage(sourceImage.getWidth(), sourceImage.getHeight(), Transparency.BITMASK);
//todo esto se hace para que no trabaje la CPU, la placa de video debe hacer el trabajo
// dibuja nuestra imagen fuente dentro de una imagen acelerada
image.getGraphics().drawImage(sourceImage, 0, 0, null);
images.put(imageUrl, image);
return image;
}
private BufferedImage getImageFromUrl(String spriteUrl) {
BufferedImage sourceImage = null;
try {
// ClassLoader.getResource() asegura que se busque el sprite en el lugar correcto
URL url = this.getClass().getClassLoader().getResource(spriteUrl);
if (url == null) {
fail("No se encuentra el archivo en la url: " + spriteUrl);
}
sourceImage = ImageIO.read(url);
} catch (IOException e) {
fail("Falló la carga: " + spriteUrl);
}
return sourceImage;
}
/**
* Indica falla al abrir un recurso
*
* @param message El mensaje para indicar falla
*/
private void fail(String message) {
System.err.println(message);
System.exit(0);
}
}