📄 monstersprite.java
字号:
package org.loon.test;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.ImageObserver;
/**
*
* <p>Title: LoonFramework</p>
* <p>Description:</p>
* <p>Copyright: Copyright (c) 2008</p>
* <p>Company: LoonFramework</p>
* <p>License: http://www.apache.org/licenses/LICENSE-2.0</p>
* @author chenpeng
* @email:ceponline@yahoo.com.cn
* @version 0.1
*/
public class MonsterSprite extends Sprite {
int state; //怪物状态 0:普通 1:衰弱 2:接触宝物 3:巢穴
int homex, homey; //在巢穴中的位置
int nx, ny;
boolean isN;
int bound, boundc;
int yowakic;
int vx, vy;
int cx, cy;
int cx0, cy0;
int m; //移动范围(0~127)
int p; //移动方向(0,1,2,3 = →↓←↑)
int timer; //速度
MazeManager manager;
public MonsterSprite(int cx, int cy, MazeManager manager) {
super(cx<<3,cy<<3,8,8);
setOrientation(2,2,4,4);
this.manager = manager;
cx0 = cx; cy0 = cy;
}
public void init(int cx, int cy) {
this.cx = cx;
this.cy = cy;
x = cx << 3;
y = cy << 3;
vx = cx << 7;
vy = cy << 7;
m = 0;
p = 2; //默认方向为左
timer = 0;
}
public void init() {
init(cx0,cy0);
}
public void setCXCY(int cx, int cy) {
this.cx = cx;
this.cy = cy;
x = cx << 3;
y = cy << 3;
vx = cx << 7;
vy = cy << 7;
}
public void setP(int p) {
this.p = p;
}
public int getX() {
return vx>>4;
}
public int getY() {
return vy>>4;
}
public int getCX() {
return vx>>7;
}
public int getCY() {
return vy>>7;
}
public int getState() {
return state;
}
public int abs(int n) {
if(n<0) return -n; else return n;
}
public void run() {
int jx = target.getX();
int jy = target.getY();
int tx,ty;
int mask;
if( state==1 ) if ((yowakic--)<=0) state=0;
if((m<=0)||(m>=128)) {
m=0;
vx=((vx+32)>>7)<<7; vy=((vy+32)>>7)<<7;
cx=vx>>7; cy=vy>>7;
if( (state==2) && (cx == homex) && (cy == homey)) {
state = 3;
boundc = bound;
}
if( state==3 && cx == 10 && cy == 10) state = 0;
if(state == 2) {
if ((cx==10)&&(cy>=10)&&(cy<=11)) {
d = 2;
}else if ((cx==10)&&(cy>=12)&&(cy<=13)) {
tx = homex<<7;
ty = homey<<7;
mask=manager.onWay(cx+cy*21,d);
d = calcDist(mask,tx,ty);
}else{
mask=manager.onWay(cx+cy*21,d);
if(cy>=18) d = calcDist(mask,cx<<7,17<<7);
else d = calcDist(mask,10<<7,10<<7);
}
}else if(state == 3) {
d = 0;
if(boundc == 0) {
tx = 10<<7; ty = 10<<7;
mask=manager.onWay(cx+cy*21,d);
d = calcDist(mask,tx,ty);
} else {
if(cy==12) { d=2; }
else { d=8; }
boundc--;
}
} else {
if((state==0)&&isN)
{ tx = nx<<7; ty = ny<<7; }
else {
tx = jx<<4; ty = jy<<4;
}
mask=manager.onWay(cx+cy*21,d);
d = calcDist(mask,tx,ty);
}
}
build();
this.x = vx >> 4;
this.y = vy >> 4;
}
public int calcDist(int mask, int tx, int ty) {
int d;
int dx = tx-vx; int dy = ty-vy;
if(state==1) {dx=-dx; dy=-dy;}
int adx=0; if(dx>0) adx+=1; if(dx<0) adx+=4; adx &= mask;
int ady=0; if(dy>0) ady+=2; if(dy<0) ady+=8; ady &= mask;
if((adx>0)&&(ady>0)) {
if(abs(dy)<=abs(dx)) d = ady;
else d = adx;
}else{
d = adx|ady;
}
if(d==0) d = goRandom(mask);
return d;
}
public int goRandom(int mask) {
int[] ds = new int[4];
int dsc = 0;
if((mask&1)>0) ds[dsc++] = 1;
if((mask&2)>0) ds[dsc++] = 2;
if((mask&4)>0) ds[dsc++] = 4;
if((mask&8)>0) ds[dsc++] = 8;
if (dsc > 0) {
return ds[(int)(Math.random()*dsc)];
} else {
return 0;
}
}
public void build() {
int dd;
if(d > 0) {
if(state==1) dd=6; else dd=10;
if ((cy==13)&&((cx<4)||(cx>18))) dd=4;
if(state==2) dd=24;
if ((m+dd)>128) dd = 128 - m;
switch(d) {
case 1:
vx += dd; if(vx>=2560) vx=0;
p = 0;
break;
case 4:
vx -= dd; if(vx<0) vx=2560;
p = 2;
break;
case 2:
vy += dd;
p = 1;
break;
case 8:
vy -= dd;
p = 3;
break;
}
if( ((timer++)>>3)%2 == 1 ) {
p += 4;
}
m += dd;
}
}
public void move() {
switch(d) {
case 1:
d = 4; break;
case 4:
d = 1; break;
case 2:
d = 8; break;
case 8:
d = 2; break;
}
if(d>0) m = 128 - m;
}
public void setN(boolean isN) {
this.isN = isN;
}
public boolean state() {
if (state == 2) return false;
if (state==0) move();
state = 1; yowakic = 480;
return true;
}
public boolean activity() {
if(state == 1) {
state = 2;
return true;
}
return false;
}
public void paint(Graphics g, ImageObserver observer) {
Image img; int yp=0;
switch(state) {
case 1:
if ((yowakic<180)&&( ((yowakic>>4)%2) == 0)) yp = 28;
img = loader.crop(yp, 116, 14, 14);
break;
case 2:
img = loader.crop(14*p+56, 116, 14, 14);
break;
default:
img = loader.crop(14*p, 60, 14, 14);
}
g.drawImage(img,x-3+8,y-3+8,14,14,observer);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -