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

📄 fw.js

📁 尚学堂JavaScript视频教程源码,可以配合视频使用,其中一些有用的例子也可以在自己的网站中嵌入使用
💻 JS
📖 第 1 页 / 共 2 页
字号:
/*
fw1:作战方的一个实例
sys:存放地图资源信息(矿、气)
race:存放的对战双方的对象数组,red/blue
cRace:当前操作者
udf:存放一些资源、建筑、单位等标准信息数组供调用时使用
	block:
		mine 矿
		ves  气
	build:
		0_hq	基地
		0_supply	房子
		0_refinery	采气厂
		0_barrack		兵工厂
		0_academy		升级用的
		0_gun_tower	无图
		0_missile		无图
	unit:
		0_scv		工程兵的普通、采矿、采气3种状态5个方向的图片
		0_marine
		0_tank
		0_valture
		0_wraith
*/
var fw1=new fw(),sys=new Array(),udf=new Array(),race=new Array(),cRace="red"
fw_ini()
function fw_ini(){
	sys.minePos=""
	sys.vesPos=""

	race["red"]=createClass("mine:5000;ves:0;man:4;supply:8;hq:")
	race["blue"]=createClass("mine:50;ves:0;man:4;supply:8;hq:")

	udf["mine"]=createClass("type:block;size:1,1;movepos:-1,-16;selpos:-4,16,48,30")
	udf["ves"]=createClass("type:block;size:3,2;movepos:2,3;selpos:-6,0,124,60")

	udf["0_hq"]=createClass("type:build;wh:127,101;size:3,3;movepos:0,-14;selpos:-8,22,140,80;hppos:5,86,130;btime:3;madelist:0_scv")
	udf["0_supply"]=createClass("type:build;wh:87,70;size:2,2;movepos:-2,-9;selpos:-5,18,95,56;hppos:2,62,94;btime:2;mine:100")
	udf["0_refinery"]=createClass("type:build;wh:125,95;size:3,2;movepos:-2,-32;selpos:-8,22,140,80;hppos:5,86,130;btime:2;mine:100")
	udf["0_barrack"]=createClass("type:build;wh:125,110;size:3,3;movepos:-2,-18;selpos:-8,34,140,80;hppos:5,86,130;btime:3;mine:150;madelist:0_marine")
	udf["0_academy"]=createClass("type:build;wh:95,95;size:2,2;movepos:-10,-32;selpos:-2,38,100,60;hppos:2,66,100;btime:3;mine:150")
	udf["0_gun_tower"]=createClass("type:build;wh:95,58;size:2,2;movepos:-8,2;selpos:-8,22,140,80")
	udf["0_missile"]=createClass("type:build;wh:41,50;size:1,1;movepos:0,-20;selpos:-8,22,140,80")

	udf["0_scv"]=createClass("type:unit;kind:ground;mvstyle:shift;speed:4;wh:48;selpos:5,12,36,24;hppos:1,33,35;mine:50")
	udf["0_marine"]=createClass("type:unit;kind:ground;mvstyle:walk;speed:2;wh:32;selpos:5,15,20,16;hppos:1,20,24;mine:50")
	udf["0_tank"]=createClass("type:unit;kind:ground;speed:1;wh:72;selpos:10,16,50,40")
	udf["0_valture"]=createClass("type:unit;kind:ground;speed:1;wh:64;selpos:12,20,36,27")
	udf["0_wraith"]=createClass("type:unit;kind:air;speed:1;wh:48;selpos:12,16,27,20")
}

/*
返回一个数组
参数字符: a:1;b:2
返回数组:
	[a][1]
	[b][2]
如是数字,则转换为数字型
*/
function createClass(k){
	var ao=new Array(),ak=k.split(";")
	for(var i in ak){
		ak[i]=ak[i].split(":")
		if(!isNaN(ak[i][1]))
			ak[i][1]=parseInt(ak[i][1])
		ao[ak[i][0]]=ak[i][1]
	}
	return ao
}
//控制对象显示或隐藏 ol格式使用;分隔,;之前的显示,;之后的隐藏,然后使用,进行分隔
function showObj(ol){
	var a=ol.split(";"),i,j
	for(i in a){
		a[i]=a[i].split(",")
		for(j in a[i]){
			if(i==0&&a[i][j]!="")
				eval(a[i][j]).style.display=""
			if(i==1&&a[i][j]!="")
				eval(a[i][j]).style.display="none"
		}
	}
}
//用来创建操作方实体的类
function fw(){
	//uList定义:[0]-block;[1]-mine;[2]-build;[3]-unit
	this.uList=new Array("","","","")
	//bList定义:[0]-mine;[1]-block and build;[2]-hold unit
	this.bList=new Array("","","")

	this.cEndPos=0
	//用来对新加入的成员进行唯一标识的变量,每增加一个,maxID便加一
	this.maxID=0
	//被选中的对象,使用逗号进行分隔
	this.selUnit=""
	this.adp="1,0;1,1;0,1;-1,1;-1,0;-1,-1;0,-1;1,-1;1,0;1,1;0,1;-1,1;-1,0;-1,-1;0,-1;1,-1".split(";")
	for(var i=0;i<16;i++){
		this.adp[i]=this.adp[i].split(",")
		this.adp[i][0]=parseInt(this.adp[i][0])
		this.adp[i][1]=parseInt(this.adp[i][1])
	}

	//地图初始化,k的格式 size,64,64;1,mine,3,1   ....
	this.iniMap=function(k){
		var l="",lm="",xi,yi,i,j,n
		var a=k.split(";"),uu,a_sz,a_mv,a_sl,a_hp,a_wh
		//遍历每个元素
		for(i in a){
			a[i]=a[i].split(",")
			if(a[i][0]=="size"){
				//地图背景的尺寸
				divSize.style.width =a[i][1]*40
				divSize.style.height =a[i][2]*30
			}
			else{
				xi=parseInt(a[i][2])
				yi=parseInt(a[i][3])
				uu=udf[a[i][1]]
				a_sl=uu.selpos.split(",")
				if(uu.type=="block"||uu.type=="build"){	//资源、建筑
					a_sz=uu.size.split(",")
					a_mv=uu.movepos.split(",")
					//将资源和建筑的覆盖点存到字符列表中
					for(j=0;j<a_sz[0];j++){
						for(n=0;n<a_sz[1];n++){
							if(uu.type=="block")
								this.bList[0]+=";"+(xi+j)+","+(yi+n)
							if(uu.type=="build")
								this.bList[1]+=";"+(xi+j)+","+(yi+n)
							//this.paint(new pt(xi+j,yi+n),"black")
						}
					}
				}
				if(a[i][1]=="mine")
					sys.minePos+=";"+xi+","+yi	//把矿资源记录到地图中
				if(a[i][1]=="ves")
					sys.vesPos+=";"+xi+","+yi	//把气资源记录到地图中
				//下面分别是3种物件的创建
				//l存放大地图的内容,lm存放缩略图的内容
				if(uu.type=="block"){
					this.uList[1]+=",unit_"+a[i][0]
					l+="<span id=unit_"+a[i][0]+" name="+a[i][1]+" uType=block px="+xi+" py="+yi+" pw="+a_sz[0]+" ph="+a_sz[1]+" style='left:"+(xi*40+parseInt(a_mv[0]))+";top:"+(yi*30+parseInt(a_mv[1]))+";z-index:"+yi+"'>"
					l+="<v:oval coordsize='21600,21600' strokecolor=#F2F230 style='visibility:hidden;position:absolute;left:"+a_sl[0]+";top:"+a_sl[1]+";width:"+a_sl[2]+";height:"+a_sl[3]+"'><v:fill opacity =0></v:fill></v:oval>"
					l+="<img src=block/"+a[i][1]+".gif>"
					l+="</span>"
					lm+="<hr id=unit_"+a[i][0]+"_mini color=#00E4FC style=left:"+(xi*2)+";top:"+(yi*2)+";width:"+(a_sz[0]*2)+";height:"+(a_sz[1]*2)+">"
				}
				if(uu.type=="build"){
					a_hp=uu.hppos.split(",")
					a_wh=uu.wh.split(",")
					var s_m=""
					//如果是采气场且已经建成则加入冒气场景
					if(a[i][5]!=0&&a[i][1]=="0_refinery")
						s_m="<img src='block/ves_gas.gif' style=left:55;top:-20>"
					this.uList[2]+=",unit_"+a[i][0]
					l+="<span id=unit_"+a[i][0]+" name="+a[i][1]+" uType=build bType='' chp="+(a[i][5]==0 ? 0 : "100")+" bn="+(a[i][5]==0 ? 0 : -1)+"  mn=-1 sx="+a_sz[0]+" sy="+a_sz[1]+" px="+xi+" py="+yi+" pw="+a_sz[0]+" ph="+a_sz[1]+" aimu='' race='"+a[i][4]+"' style='left:"+(xi*40+parseInt(a_mv[0]))+";top:"+(yi*30+parseInt(a_mv[1]))+";z-index:"+yi+"'>"
					l+="<v:oval coordsize='21600,21600' strokecolor=#10FC18 style='visibility:hidden;position:absolute;left:"+a_sl[0]+";top:"+a_sl[1]+";width:"+a_sl[2]+";height:"+a_sl[3]+"'><v:fill opacity =0></v:fill><span class=hpbar style='left:"+a_hp[0]+";top:"+a_hp[1]+";width:"+a_hp[2]+"'><hr size=3 color=#249824 style=width:"+(a[i][5]==0 ? 0 : "100%")+"></span></v:oval>"
					l+="<span style=width:"+a_wh[0]+";height:"+a_wh[1]+";overflow:hidden><img src=build/"+a[i][1]+"_"+a[i][4]+".gif style=left:"+(a[i][5]==0 ? -2*a_wh[0] : 0)+"></span>"
					l+="<span>"+s_m+"</span>"
					l+="</span>"
					lm+="<hr id=unit_"+a[i][0]+"_mini color='"+a[i][4]+"' style=left:"+(xi*2)+";top:"+(yi*2)+";width:"+(a_sz[0]*2)+";height:"+(a_sz[1]*2)+">"
					//标记大本营位置,工程兵采矿、气时会用到
					if(a[i][1]=="0_hq"){
						race[a[i][4]].hq=(xi+1)+","+(yi+1)
					}
				}
				if(uu.type=="unit"){
					a_hp=uu.hppos.split(",")
					this.uList[3]+=",unit_"+a[i][0]
					l+="<span id=unit_"+a[i][0]+" name="+a[i][1]+" uType=unit mvstyle='"+uu.mvstyle+"' px="+xi+" py="+yi+" cw="+uu.wh+" race='"+a[i][4]+"' class='unit_"+uu.kind+"' speed='"+uu.speed+"' path='' aimPos='' aimn=0 aimu='' face='' pose=0 tmMove=0 tmDir=0 style='left:"+(xi*40+(40-uu.wh)/2)+";top:"+(yi*30+(30-uu.wh)/2)+";z-index:"+yi+"'>"
					l+="<v:oval coordsize='21600,21600' strokecolor=#10FC18 style='visibility:hidden;position:absolute;left:"+a_sl[0]+";top:"+a_sl[1]+";width:"+a_sl[2]+";height:"+a_sl[3]+"'><v:fill opacity =0></v:fill><span class=hpbar style='left:"+a_hp[0]+";top:"+a_hp[1]+";width:"+a_hp[2]+"'><hr size=3 color=#249824 style=width:100%></span></v:oval>"
					l+="<span style=width:"+uu.wh+";height:"+uu.wh+";overflow:hidden><img src=unit/"+a[i][1]+"_"+a[i][4]+".gif style=top:"+(-parseInt(5*Math.random())*uu.wh)+"></span>"
					l+="<span></span></span>"
					lm+="<hr id=unit_"+a[i][0]+"_mini color='"+a[i][4]+"' style=left:"+(xi*2)+";top:"+(yi*2)+";width:2;height:2>"
				}
			}
		}
		this.maxID=parseInt(a[i][0])+1
		//对存贮的各类信息的格式进行整理
		if(sys.minePos.slice(0,1)==";")
			sys.minePos=sys.minePos.slice(1)
		if(sys.vesPos.slice(0,1)==";")
			sys.vesPos=sys.vesPos.slice(1)
		if(this.bList[0].slice(0,1)==";")
			this.bList[0]=this.bList[0].slice(1)
		if(this.bList[1].slice(0,1)==";")
			this.bList[1]=this.bList[1].slice(1)
		if(this.uList[0].slice(0,1)==",")
			this.uList[0]=this.uList[0].slice(1)
		if(this.uList[1].slice(0,1)==",")
			this.uList[1]=this.uList[1].slice(1)
		if(this.uList[2].slice(0,1)==",")
			this.uList[2]=this.uList[2].slice(1)
		if(this.uList[3].slice(0,1)==",")
			this.uList[3]=this.uList[3].slice(1)
		//加入实体
		divMain.insertAdjacentHTML("beforeend",l)
		//小地图
		mini_map.insertAdjacentHTML("afterbegin",lm)
	}
	//返回指定点的build,unit
	this.uInPos=function(p){
		var u,o,a=(this.uList[1]+","+this.uList[2]).split(",")
		for(var i in a){
			o=eval(a[i])
			if(p.x-o.px<o.pw&&p.x-o.px>=0&&p.y-o.py<o.ph&&p.y-o.py>=0){
				u=o
				if(u.name!="ves")
					break
			}
		}
		return u
	}
	//选中操作对象
	this.selRange=function(sp,ep){
		var l="",u,a,i
		//先取消选择
		if(fw1.selUnit!=""){
			a=fw1.selUnit.split(",")
			for(i in a){
				u=eval(a[i])
				u.children(0).style.visibility="hidden"
			}
		}
		//选择框进行选择(不能对建筑物进行选择)
		a=this.uList[3].split(",")
		for(i=0;i<a.length;i++){
			u=eval(a[i])
			if(((u.px>=sp.x&&ep.x>=u.px)||(u.px<=sp.x&&ep.x<=u.px))&&((u.py>=sp.y&&ep.y>=u.py)||(u.py<=sp.y&&ep.y<=u.py))){
				u.children(0).style.visibility=""
				l+=u.id+","
			}
		}
		l=l.slice(0,-1)
		//点击选中,都可以进行选择
		if(sp.v==ep.v&&l==""){
			u=this.uInPos(sp)
			if(u!=null){
				u.children(0).style.visibility=""
				l=u.id
			}
		}
		fw1.selUnit=l
	}
	this.setUBlock=function(){
		var u
		this.bList[2]=""
		al=this.uList[3].split(",")
		for(i in al){
			u=eval(al[i])
			if(u.path==""&&(","+this.selUnit+",").indexOf(","+u.id+",")==-1)
				this.bList[2]+=u.px+","+u.py+";"
		}
		this.bList[2]=";"+this.bList[2]
	}
	//鼠标指挥unit的移动(不实际移动,而是改变目的地或指定任务)
	this.go=function(ep0){
		if(this.selUnit=="")
			return
		var sp=new pt(),ep=new pt()
		var al,a,i,s,rv,epu,epuName,u
		this.setUBlock()
		this.cEndPos=0
		al=fw1.selUnit.split(",")
		//遍历所有选中的对象
		for(i in al){
			u=eval(al[i])
			epu=this.uInPos(ep0)
			epuName=epu==null ? "" : epu.name
			sp.setv(u.px,u.py)
			this.bList[2]=fw1.bList[2].replace(";"+sp.v+";",";")
			s=""
			if(u.className=="airUnit")
				s="airUnit"
			//采矿
			if(u.name=="0_scv"&&epuName=="mine")
				s="mining"
			//根据情况确定最后的目标地
			rv=this.getEndPos(ep0,s)
			if(rv[0]=="")
				return
			if(rv[1]!="")
				u.aimu=rv[1]
			ep.setv(rv[0])
			if(u.className=="airUnit")
				u.path=ep.v
			else{
				//点集重合,无法到达
				if(this.inBlock(ep))
					return
				l=this.getPath(sp,ep)
				u.path=l
				if(u.name=="0_scv"){
					u.children(2).innerHTML=""
					u.aimPos=""
					u.task=""
					//随机确定工程兵的基地投放地点
					a="2,0;2,1;1,2;0,2;-1,2;-2,1;-2,0;-2,-1;-1,-2;0,-2;1,-2;2,-1".split(";")
					var n=parseInt(12*Math.random())
					a[n]=a[n].split(",")
					sp.setv(race[u.race].hq)
					sp.setv(sp.x+parseInt(a[n][0]),sp.y+parseInt(a[n][1]))
					//采矿 aimPos逗号后面的数字是每次采的上限
					if(epuName=="mine"){
						u.aimPos=u.aimu+",200;"+sp.v+";"+ep.v
						u.task="mining"
					}
					//采气
					if(epuName=="0_refinery"){
						if(epu.bn==-1){
							u.aimPos=epu.id+",100;"+sp.v+";"+ep.v
							u.task="gasing"
						}
					}
				}
			}
		}
	}
	//建造时的火花闪烁
	this.setSpark=function(u){
		var s="left:-10;top:0"
		if(u.face==0)
			s="left:5;top:-10"
		if(u.face=="1f")
			s="left:-5;top:-10"
		if(u.face==1)
			s="left:18;top:-10"
		if(u.face==2)
			s="left:18;top:0"
		if(u.face==3)
			s="left:18;top:15"
		if(u.face=="3f")
			s="left:-5;top:15"
		if(u.face==4)
			s="left:0;top:15"
		u.children(2).innerHTML="<img src=unit/0_scv_spark.gif style="+s+">"
	}
	//某方的unit的行为函数(行走、建造等)
	this.move=function(u){
		var dp=new pt(),sp=new pt(),ep=new pt()
		if(u.path==""){
			sp.setv(u.px,u.py)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -