3 所示。
图 3. 使用分层透明度结合起来的图像
Java:在二维动画中使用基于图像的路径(3)
时间:2011-08-31 IBM
让世界充满色彩
生成一个图像后,就可容易地将它转换为所需要的映射。我们只要遍历图像的 颜色并为每种颜色值指定一种行为。比如我们可以使用白色 ——它通常是全为 1 的值——表示无映射或者默认行为。黑色——通常是零值——可以用于表示自定 义的行为。如果是根据我们的图像映射的,当对象遇到一个有同样行为(即同一 种颜色,如黑色)的位置时,它就会继续沿着由这个位置定义的方向运行。如果 这个位置不是同样的行为,那么它就会找到与它有同样行为的相邻位置,但是不 会走回头路。
我们可以用不同的颜色表示其他行为。没有定义的颜色值将会被忽略。因此, 背景中的像素(如 图 3中的浅灰色)会被忽略。
清单 1 显示如何完成映射。先针对特定颜色值扫描该图像,然后用每一个颜 色像素的位置定义该位置在控制状态映射中的控制状态。在逃生的例子中,用不 同的 STATE_xxx 常量定义了六种行为。
清单 1. 处理控制路径图像
Map map = new HashMap();
:
public final static int STATE_UNKNOWN = -1;
public final static int STATE_NONE = 0;
public final static int STATE_HALLWAY = 1;
public final static int STATE_INTERSECTION = 2;
public final static int STATE_HINT = 3;
public final static int STATE_START = 4;
public final static int STATE_EXIT = 5;
:
/** Process the control image */
void processControl(Image img, int x, int y, int w, int h)
{
int pmap[] = new int[w * h];
PixelGrabber pg = new PixelGrabber(img, x, y, w, h, pmap, 0, w);
try {
pg.grabPixels();
if ((pg.getStatus() & ImageObserver.ABORT) != 0) {
System.err.println("image fetch error");
}
else {
Integer none = new Integer(STATE_NONE);
Integer hall = new Integer(STATE_HALLWAY);
Integer start = new Integer(STATE_START);
Integer exit = new Integer(STATE_EXIT);
Integer hint = new Integer (STATE_HINT);
Integer inter = new Integer (STATE_INTERSECTION);
// for each position
for (int i = 0; i < pmap.length; i++) {
int red = (pmap[i] >> 16) & 0xff;
int green = (pmap[i] >> 8) & 0xff;
int blue = (pmap [i] ) & 0xff;
if (red == 255 && green == 255 && blue == 255)
; // don''t bother to add NONE to map
else if (red == 0 && green == 0 && blue == 0)
map.put(new Integer(i), hall);
else if (red == 0 && green == 255 && blue == 0)
map.put(new Integer(i), start);
else if (red == 200 && green == 0 && blue == 0)
map.put(new Integer(i), exit);
else if (red == 255 && green == 0 && blue == 0)
map.put(new Integer(i), hint);
else if (red == 0 && green == 0 && blue == 255)
|