📄 fairy.java
字号:
//Source file: d:/MyProjects/Java/eatbean/eatbean/Fairy.java
package eatbean;
import java.awt.*;
//
import eatbean.util.*;
import eatbean.conf.*;
import java.util.Hashtable;
public class Fairy extends Actor {
public static final int MAX_FRAME = 2;
public static final int MIN_FRAME = 0;
public static final int MAX_SIZE = 16;
private static final Hashtable frameTable = new Hashtable();
private static final Hashtable imgBuffTable = new Hashtable();
private Rect bakR = null;
private Pos[] bakP = null;
private Image img = null;
private boolean keepRunning = true;
private int currFrame;
private long lastChangeFrameTime = -1;
public static final int DIR_WEST = 1;
public static final int DIR_EAST = -1;
public static final int DIR_NORTH = 2;
public static final int DIR_SOUTH = -2;
static {
for(int i = MIN_FRAME; i <= MAX_FRAME; i++) {
//分四个方向
frameTable.put(new Integer(parseImgIndex(i, DIR_WEST)), "fairyw"+i+".gif");
frameTable.put(new Integer(parseImgIndex(i, DIR_EAST)), "fairye"+i+".gif");
frameTable.put(new Integer(parseImgIndex(i, DIR_NORTH)), "fairyn"+i+".gif");
frameTable.put(new Integer(parseImgIndex(i, DIR_SOUTH)), "fairys"+i+".gif");
}
}
public Fairy(Mediator mediator) {
super(mediator);
init();
}
private void init() {
mapPos = mediator.getFairyBornPos();
MapElement e = mediator.getElement(mapPos);
rect.width = MAX_SIZE;
rect.height = MAX_SIZE;
rect.x = adjustX(e.getLeft(), e.getWidth(), rect.width);
rect.y = adjustY(e.getTop(), e.getHeight(), rect.height);
currCoveredPos = mediator.getCoveredElementsMapPos(this);
mapPos = mediator.getCurrMapPos(currCoveredPos, rect);
currFrame = MIN_FRAME;
img = getImage(parseImgIndex(currFrame, direction));
}
public void run() {
while(keepRunning) {
if(!mediator.getPaused()) {
nextstep();
//mediator.flushScreen(this);
} else
if(thread != null) thread.yield();
mediator.flushScreen(this);
nextframe();
}
}
public void die() {
keepRunning = false;
}
public boolean nextstep() {
boolean result = false;
boolean flag = true;
backup();
/*
if(Debug.ON) Debug.println("mapPos: " + mapPos);
if(Debug.ON) Debug.println("rect: " + rect);
if(Debug.ON) Debug.println("nextDirection: " + nextDirection);
*/
if(nextDirection == getReverse())
direction = nextDirection;
else if(nextDirection != direction) { //nextDirection 与 direction 互相垂直
if(mediator.acceptable(getMapPos(), nextDirection)) { // 如果此方向可行
//则调整位置到mapPos元素的重心
MapElement e = mediator.getElement(mapPos);
rect.x = adjustX(e.getLeft(), e.getWidth(), rect.width);
rect.y = adjustY(e.getTop(), e.getHeight(), rect.height);
direction = nextDirection;
flag = false;
}
}
//if(flag) {
switch(direction) {
case DIR_WEST :
rect.x = rect.x - step;
break;
case DIR_EAST :
rect.x = rect.x + step;
break;
case DIR_NORTH :
rect.y = rect.y - step;
break;
case DIR_SOUTH :
rect.y = rect.y + step;
break;
}
//}
currCoveredPos = mediator.getCoveredElementsMapPos(this);
//下一步是否有效
if(!flag || mediator.acceptable(this)) { //有效
clear(bakP); // 重绘被覆盖的背景
//paint();
Pos p = mediator.getCurrMapPos(currCoveredPos, rect);
if(p != null)
mapPos = p;
//mediator.beep();
result = true;
} else {
//restore data
restore();
}
mediator.eatBean(this);
mediator.checkSpriteIntersect(this);
return result;
}
private void nextframe() {
long currTime = System.currentTimeMillis();
if(currTime - lastChangeFrameTime < SysParam.CHANGE_FRAME_TIME) return;
currFrame++;
if(currFrame > MAX_FRAME || currFrame < MIN_FRAME) currFrame = MIN_FRAME;
img = getImage(parseImgIndex(currFrame, direction));
lastChangeFrameTime = currTime;
}
public void clear(Pos[] p) {
if(p == null) {
if(Debug.ON)System.out.println("Fairy.clear(): p == null!!!!");
} else
mediator.repaintBg(this, p);
}
public void clear() {
clear(currCoveredPos);
}
private void draw() {
OffScreen offScreen = mediator.getOffScreen();
offScreen.drawImage(img, rect.x, rect.y);
}
public boolean act() {
if(thread == null) {
thread = new Thread(this);
thread.start();
}
return true;
}
public void paint() {
draw();
}
private int adjustX(int x, int w1, int w2) {
return x + Math.abs(w1-w2)/2;
}
private int adjustY(int y, int h1, int h2) {
return y + Math.abs(h1-h2)/2;
}
private void backup() {
bakR = getRect(); //backup rect
//if(currCoveredPos == null) currCoveredPos = mediator.getCoveredElementsMapPos(this);
if(currCoveredPos != null) {
bakP = new Pos[currCoveredPos.length];
for(int i = 0; i < currCoveredPos.length; i ++)
bakP[i] = (Pos)currCoveredPos[i].clone();
}
}
private void restore() {
rect = bakR;
currCoveredPos = bakP;
}
private static int parseImgIndex(int frame, int dir) {
return 10*frame+dir;
}
private Image getImage(int imgIndex) {
Image result = null;
synchronized(imgBuffTable) { // 同步,保证同一Image仅被调入内存一次
result = super.getImage(imgBuffTable, frameTable, imgIndex);
}
return result;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -