⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 monstersprite.java

📁 Java吃豆子游戏
💻 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 + -