package org.ripple.power.ui.projector.action.sprite; import java.awt.Color; import java.awt.Graphics; import java.awt.Image; import java.awt.image.ImageProducer; import java.awt.image.MemoryImageSource; import java.awt.image.PixelGrabber; import java.util.HashMap; import org.ripple.power.ui.graphics.LGraphics; import org.ripple.power.ui.graphics.LImage; import org.ripple.power.utils.CollectionUtils; import org.ripple.power.utils.GraphicsUtils; public class AnimationHelper { private final static HashMap<String, AnimationHelper> animations = new HashMap<String, AnimationHelper>(); // 角色向下 public Image[] downImages; // 角色向上 public Image[] upImages; // 角色向左 public Image[] leftImages; // 角色向右 public Image[] rightImages; /** * 以RMVX的角色格式创建对象(总图大小96x128,每格大小32x32) * * @param fileName * @return */ public static AnimationHelper makeRMVXObject(String fileName) { return makeObject(fileName, 4, 3, 32, 32); } /** * 以RMXP的角色格式创建对象(总图大小128x192,每格大小32x48) * * @param fileName * @return */ public static AnimationHelper makeRMXPObject(String fileName) { return makeObject(fileName, 4, 4, 32, 48); } /** * 以E社的角色格式创建对象(总图大小200x200,每格大小40x50) * * @param fileName * @return */ public static AnimationHelper makeEObject(String fileName) { return makeObject(fileName, 40, 50, Color.green); } /** * 以RMVX的角色格式创建分解头象 * * @param fileName * @return */ public static Image[] makeFace(String fileName) { return GraphicsUtils.getSplitImages(fileName, 96, 96); } /** * 绘制一个RMVX样式的游标 * * @return */ public static Image makeCursor(int w, int h) { LImage cursor = LImage.createImage(w, h, true); LGraphics g = cursor.getLGraphics(); g.setColor(0, 0, 0, 255); g.fillRect(0, 0, w, h); g.setColor(255, 255, 255, 255); g.fillRect(1, 1, w - 2, h - 2); g.setColor(0, 0, 0, 255); g.fillRect(4, 4, w - 8, h - 8); g.setColor(0, 0, 0, 255); g.fillRect(w / 4, 0, w / 2, h); g.setColor(0, 0, 0, 255); g.fillRect(0, h / 4, w, h / 2); g.dispose(); g = null; int[] basePixels = cursor.getPixels(); int length = basePixels.length; int c = Color.black.getRGB(); for (int i = 0; i < length; i++) { if (basePixels[i] == c) { basePixels[i] = 0xffffff; } } cursor.setPixels(basePixels, w, h); return cursor.getBufferedImage(); } public static AnimationHelper makeObject(String fileName, int row, int col, int tileWidth, int tileHeight) { String key = fileName.trim().toLowerCase(); AnimationHelper animation = (AnimationHelper) animations.get(key); if (animation == null) { Image[][] images = GraphicsUtils.getSplit2Images(fileName, tileWidth, tileHeight); Image[][] result = new Image[row][col]; for (int y = 0; y < col; y++) { for (int x = 0; x < row; x++) { result[x][y] = images[y][x]; } } images = null; animations.put( key, animation = makeObject(result[0], result[1], result[2], result[3])); } return animation; } public static AnimationHelper makeObject(String fileName, int tileWidth, int tileHeight, Color col) { String key = fileName.trim().toLowerCase(); AnimationHelper animation = (AnimationHelper) animations.get(key); if (animation == null) { Image image = GraphicsUtils.loadNotCacheImage(fileName); int c = col.getRGB(); int wlength = image.getWidth(null) / tileWidth; int hlength = image.getHeight(null) / tileHeight; Image[][] images = new Image[wlength][hlength]; for (int y = 0; y < hlength; y++) { for (int x = 0; x < wlength; x++) { images[x][y] = GraphicsUtils.createImage(tileWidth, tileHeight, true); Graphics g = images[x][y].getGraphics(); g.drawImage(image, 0, 0, tileWidth, tileHeight, (x * tileWidth), (y * tileHeight), tileWidth + (x * tileWidth), tileHeight + (y * tileHeight), null); g.dispose(); g = null; PixelGrabber pgr = new PixelGrabber(images[x][y], 0, 0, -1, -1, true); try { pgr.grabPixels(); } catch (InterruptedException ex) { ex.getStackTrace(); } int pixels[] = (int[]) pgr.getPixels(); for (int i = 0; i < pixels.length; i++) { if (pixels[i] == c) { pixels[i] = 0; } } ImageProducer ip = new MemoryImageSource(pgr.getWidth(), pgr.getHeight(), pixels, 0, pgr.getWidth()); images[x][y] = GraphicsUtils.toolKit.createImage(ip); } } Image[][] result = new Image[hlength][wlength]; for (int y = 0; y < wlength; y++) { for (int x = 0; x < hlength; x++) { result[x][y] = images[y][x]; } } images = null; animations.put( key, animation = makeObject(result[0], result[1], result[3], result[2])); } return animation; } public final static AnimationHelper makeObject(Image[] down, Image[] left, Image[] right, Image[] up) { AnimationHelper animation = new AnimationHelper(); animation.downImages = down; animation.leftImages = left; animation.rightImages = right; animation.upImages = up; return animation; } public final static void dispose(Image[] images) { if (images == null) { return; } for (int i = 0; i < images.length; i++) { images[i].flush(); images[i] = null; } } AnimationHelper() { } public AnimationHelper(AnimationHelper animation) { leftImages = (Image[]) CollectionUtils.copyOf(animation.leftImages); downImages = (Image[]) CollectionUtils.copyOf(animation.downImages); upImages = (Image[]) CollectionUtils.copyOf(animation.upImages); rightImages = (Image[]) CollectionUtils.copyOf(animation.rightImages); } public void dispose() { dispose(downImages); dispose(upImages); dispose(leftImages); dispose(rightImages); animations.remove(this); } }