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

📄 sc.htm

📁 js 做的一个星际争霸。可用于教学使用
💻 HTM
字号:
<script src=fw.js></script>
<html xmlns:v>
<head>
<title>星际争霸 (不完全脚本版)</title>
</head>
<style>
v\:*{behavior:url(#default#VML)}
body{font:12;cursor:url(cur/sc.cur);overflow:hidden;margin:0;border:none}
table,font{font:12}
.unit_air{filter:progid:DXImageTransform.Microsoft.dropshadow(OffX=5, OffY=30, Color='#88000000', Positive='true')}
.unit_ground{

}
.hpbar{font:0;height:5;border:1px solid black;background:#585858}
.bd{border:1px solid red}
div,img,hr,span,table{position:absolute}

</style>
<body oncontextmenu="return false" onmousemove=try{main_mousemove()}catch(e){} onresize=bdy_resize() id=bdy bgcolor =black onload ="bdy_load()" onselectstart  ="return false" ondragstart="return false">
<div id=map_data>size,64,64;1,mine,3,1;2,mine,2,2;3,mine,3,2;4,mine,1,2;5,mine,1,4;6,mine,1,5;7,mine,1,6;8,mine,1,7;9,mine,1,8;10,mine,2,4;11,mine,4,1;12,mine,5,1;13,mine,5,2;14,mine,4,2;15,mine,2,3;16,mine,3,3;17,mine,2,5;18,mine,2,6;19,mine,1,9;20,mine,2,9;21,mine,1,10;22,ves,7,2;23,0_hq,7,6,red;24,0_scv,6,5,red;25,0_scv,7,9,red;26,0_scv,5,10,red;27,0_scv,8,11,red</div>
<!--主画布-->
<div id="divMain" onmouseup="main_mouseup()" oncontextmenu=main_rclick(event.x,event.y) onmousedown=main_mousedown() onmouseout="divMain.mx =100;divMain.my=100" style      ="OVERFLOW: hidden; WIDTH: 100%; POSITION: absolute; HEIGHT: 100%">
<!--背景地图-->
<div id=divSize name="main" style="BACKGROUND: url(bg/bg1.gif); WIDTH: 100%; POSITION: absolute; HEIGHT: 100%">
</div>
<!--建造建筑物时用来选择建造地的半透明物件-->
<div id=divModel style="DISPLAY: none; Z-INDEX: 255; BACKGROUND: #088008; FILTER: alpha(opacity=75); OVERFLOW: hidden">
<IMG style="FILTER: alpha(opacity=75)" src="build/0_supply_red.gif" >
</div>
</div>
<!--按下左键进行选择时的选择框-->
<v:rect id=selRect onmouseup="main_mouseup()" style="DISPLAY: none; Z-INDEX:  255; POSITION:  absolute" coordsize = "21600,21600" strokecolor = "#10fc18"><v:fill opacity = "0" ></v:fill></v:rect>
<!--显示系统提示信息的地方-->
<div id=divSysInfo style="WIDTH: 100%; COLOR: white; TOP: 10px; TEXT-ALIGN: center">
</div>
<!--左上角的数据信息-->
<div id=divRes style="LEFT: 10px; COLOR: #10fc18; TOP: 10px">
	<img align=absMiddle src="panel/mine.gif" style="POSITION: relative"> <font id=res_mine style="WIDTH: 30px"></font>
	<img align=absMiddle src="panel/ves.gif" style="POSITION: relative"> <font id=res_ves style="WIDTH: 30px"></font>
	<img align=absMiddle src="panel/man.gif" style="POSITION: relative"> <font id=res_supply style="WIDTH: 30px"></font>
</div>
<!--右上角操作面板-->
<div id=divPanel style="DISPLAY: none; Z-INDEX: 256; BACKGROUND: url(panel/main.gif); WIDTH: 148px; TOP: 0px; HEIGHT: 264px">
	<!--小地图-->
	<div id=mini_map onmouseup=mini_mouseup() style="LEFT: 10px; WIDTH: 128px; TOP: 20px; HEIGHT: 128px">
		<span id=mini_range style="BORDER-RIGHT: white 1px solid; BORDER-TOP: white 1px solid; LEFT: 0px; BORDER-LEFT: white 1px solid; BORDER-BOTTOM: white 1px solid; TOP: 0px"></span>
	</div>
	<!--造建筑物用-->
	<div id=menu_build style="DISPLAY: none; LEFT: 10px; TOP: 155px">
		<div onclick=buildUnit(event.srcElement) style="LEFT: 4px; TOP: 4px">
		</div>
		<div style="DISPLAY: none; BACKGROUND: url(panel/build.gif); LEFT: 1px; WIDTH: 122px; TOP: 42px; HEIGHT: 41px">
			<IMG style="BORDER-RIGHT: #0c48cc 1px solid; BORDER-TOP: #0c48cc 1px solid; LEFT: 2px; BORDER-LEFT: #0c48cc 1px solid; BORDER-BOTTOM: #0c48cc 1px solid; TOP: 3px" onclick=cancelBuild(this) src="ico/0_scv.gif" >
			<hr color=black size=3 style="LEFT: 48px; WIDTH: 71px; TOP: 29px">
		</div>
	</div>
	<!--工程兵建造对象列表-->
	<div id=menu_work style="DISPLAY: none; LEFT: 10px; TOP: 155px">
		<div onclick='showModel(event.srcElement)' style="LEFT: 4px; TOP: 4px">
			<IMG style="BORDER-RIGHT: #0c48cc 1px solid; BORDER-TOP: #0c48cc 1px solid; BORDER-LEFT: #0c48cc 1px solid; BORDER-BOTTOM: #0c48cc 1px solid" src="ico/0_supply.gif" name=0_supply >
			<IMG style="BORDER-RIGHT: #0c48cc 1px solid; BORDER-TOP: #0c48cc 1px solid; LEFT: 40px; BORDER-LEFT: #0c48cc 1px solid; BORDER-BOTTOM: #0c48cc 1px solid" src="ico/0_refinery.gif" name=0_refinery>
			<IMG style="BORDER-RIGHT: #0c48cc 1px solid; BORDER-TOP: #0c48cc 1px solid; LEFT:80px; BORDER-LEFT: #0c48cc 1px solid; BORDER-BOTTOM: #0c48cc 1px solid" src="ico/0_barrack.gif" name=0_barrack>
			<IMG style="filter:gray;BORDER-RIGHT: #0c48cc 1px solid; BORDER-TOP: #0c48cc 1px solid; top:40px; BORDER-LEFT: #0c48cc 1px solid; BORDER-BOTTOM: #0c48cc 1px solid" src="ico/0_academy.gif" name=0_academy>
		</div>
	</div>
</div>
<!--奇怪,这个好像没有用-->
<IE:DOWNLOAD ID=oload style="BEHAVIOR: url(#default#download)">
</body>
</html>
<script>
//主函数,加载完成后自动运行
function bdy_load(){
	//初始化某方地图
	fw1.iniMap(map_data.innerText)
	//显示小地图
	divPanel.style.display=""
	//刷新资源
	refVal()
	//位置调整
	bdy_resize()
	//不断循环调用
	timer_main()
}
//窗口大小对各布局的位置调整
function bdy_resize(){
	//缩略地图
	divPanel.style.left=bdy.clientWidth-148
	//缩略地图的选择框
	mini_range.style.width=bdy.clientWidth*128/2560+5
	mini_range.style.height=bdy.clientHeight*128/1920+5
	//系统提示信息
	divSysInfo.style.top=bdy.clientHeight-100
}
//某方的矿、资源、人数状态刷新
function refVal(){
	res_mine.innerText=race[cRace].mine
	res_ves.innerText=race[cRace].ves
	res_supply.innerText=race[cRace].man+"/"+race[cRace].supply
}
//显示系统提示信息
function showSysInfo(k){
	divSysInfo.innerHTML=k
	showObj("divSysInfo")
	//3秒后关闭提示
	window.setTimeout("showObj(';divSysInfo')",3000)
}
//造工程兵等单元
function buildUnit(ee){
	if(ee.tagName!="IMG")
		return
	//u:进行建造的建筑 uu:被建造的单元的信息
	var u=eval(menu_build.name),uu=udf[ee.name]
	//n:减去建造单元后的剩余矿产资源
	var n=race[cRace].mine-uu.mine
	//如果负责建造的主体没有其他建造任务才可继续
	if(u.mn==-1){
		//超过人员负载
		if(race[cRace].man>=race[cRace].supply){
			showSysInfo("Not enough supply...build more supply.")
			return
		}
		//矿产资源不足
		if(n<0){
			showSysInfo("Not enough minerals...mine more minerals.")
			return
		}
		//记录建造所用资源
		menu_build.mine=uu.mine
		//刷新某方矿产资源
		race[cRace].mine-=uu.mine
		refVal()
		//完成度为0
		u.mn=0
		//正在建造的单元类型
		u.bType=ee.name
		//显示正在建造的单元
		menu_build.children(1).children(0).src="ico/"+ee.name+".gif"
		menu_build.children(1).style.display=""
	}
}
//取消工程兵等单元的建造
function cancelBuild(ee){
	//返还建造的矿产资源
	race[cRace].mine+=parseInt(menu_build.mine)
	refVal()
	//取消建造主体的任务
	eval(menu_build.name).mn=-1
	//隐藏建造图形
	menu_build.children(1).style.display="none"
}
//建造建筑物
function showModel(ee){
	if(ee.tagName!="IMG")
		return
	//灰度的,不能被建造
	if(ee.style.filter=="gray"){
		return
	}
	//uu:被建造的建筑物信息
	var uu=udf[ee.name],a_wh
	//矿产不够
	if(race[cRace].mine-uu.mine<0){
		showSysInfo("Not enough minerals...mine more minerals.")
		return
	}
	//构造选择建筑地时的模型
	divModel.children(0).src="build/"+ee.name+"_"+cRace+".gif"
	divModel.name=ee.name
	a_wh=uu.wh.split(",")
	divModel.style.posWidth=a_wh[0]
	divModel.style.posHeight=a_wh[1]
	divModel.size=uu.size
	divModel.movepos=uu.movepos
	showObj("divModel")
}
//按下鼠标
function main_mousedown(){
	if(event.button==2)
		return	//右键
	//当不是在选择建筑物的建造地时,描绘选择框
	if(divModel.style.display=="none")
		showObj("selRect")
	selRect.style.posLeft=event.x
	selRect.style.posTop=event.y
	selRect.style.posWidth=selRect.style.posHeight=0
}
//移动鼠标
function main_mousemove(){
	//设置mx,my是为了使用鼠标来移动操作界面的移动
	divMain.mx=event.x
	divMain.my=event.y
	if(typeof(selRect)=="undefined")
		return
	//选择建筑物的建造地址
	if(divModel.style.display==""){
		var sp=new pt(parseInt((event.x+divMain.scrollLeft)/40),parseInt((event.y+divMain.scrollTop)/30))
		var a_sz=divModel.size.split(","),a_mv=divModel.movepos.split(","),c="#088008"
		//u:负责建造的工程兵
		var u=eval(fw1.selUnit)
		fw1.setUBlock()
		fw1.bList[2]+=u.px+","+u.py+";"
		divModel.style.posLeft=sp.x*40+parseInt(a_mv[0])
		divModel.style.posTop=sp.y*30+parseInt(a_mv[1])
		divModel.pos=sp.v
		//判断是否可以在该地进行建造
		if(divModel.name!="0_refinery"){
			for(var i=0;i<a_sz[0];i++){
				for(var j=0;j<a_sz[1];j++){
					if(fw1.inBlock(new pt(sp.x+i,sp.y+j))){
						c="#C81818"
						break
					}
				}
			}
		}
		else{		//采气场只能在气矿上建造
			if((";"+sys.vesPos+";").indexOf(";"+sp.v+";")==-1){
				c="#C81818"
			}
			else{	//检测是否已经有气场了
				var spu=fw1.uInPos(sp),spu_name=spu==null ? "" : spu.name
				if(spu_name!="ves")
					c="#C81818"
			}
		}
		divModel.style.background=c
	}
	//选择区域框
	if(selRect.style.display==""){
		selRect.style.posWidth=event.x-selRect.style.posLeft
		selRect.style.posHeight=event.y-selRect.style.posTop
	}
}
//鼠标抬起
function main_mouseup(){
	if(event.button==2)
		return
	//建造建筑物
	if(divModel.style.display==""){
		//不能建造
		if(divModel.style.background=="#c81818"){
			showSysInfo(divModel.name=="0_refinery" ? "Could not build there,find a Vespene to build on." : "You can't build there.")
			return
		}
		race[cRace].mine-=udf[divModel.name].mine
		refVal()
		fw1.iniMap(fw1.maxID+","+divModel.name+","+divModel.pos+","+cRace+",0")
		showObj(";divModel")
		//模拟鼠标右键
		main_rclick(event.x,event.y)
		return
	}
	//选择框的起始点和结束点
	var sp=new pt(parseInt((selRect.style.posLeft+divMain.scrollLeft)/40),parseInt((selRect.style.posTop+divMain.scrollTop)/30))
	var ep=new pt(parseInt((selRect.style.posLeft+divMain.scrollLeft+selRect.style.posWidth)/40),parseInt((selRect.style.posTop+divMain.scrollTop+selRect.style.posHeight)/30))
	//对象选择
	fw1.selRange(sp,ep)
	//隐藏选择框、建造列表、建造对象、可移动的建造模型
	showObj(";selRect,menu_build,menu_work,divModel")
	//只有一个对象被选择时
	if(fw1.selUnit!=""&&fw1.selUnit.indexOf(",")==-1){
		var u=eval(fw1.selUnit),uu=udf[u.name],l="",a,i
		//选择的是建筑物并且已被建造完成
		if(u.uType=="build"&&u.bn==-1){
			showObj("menu_build")
			menu_build.name=u.id
			//可生产列表
			if(uu.madelist!=null){
				a=uu.madelist.split(",")
				for(i in a){
					l+="<img name='"+a[i]+"' src='ico/"+a[i]+".gif' style='border:1px solid #0c48cc'>"
				}
			}
			menu_build.children(0).innerHTML=l
			//判断是否有生产任务
			showObj((u.mn==-1 ? ";" : "")+"menu_build.children(1)")
		}
		//工程兵
		if(u.name=="0_scv"){
			showObj("menu_work")
		}
	}
	return
}
//鼠标右键
function main_rclick(ex,ey){
	var u,o,ep=new pt(parseInt((ex+divMain.scrollLeft)/40),parseInt((ey+divMain.scrollTop)/30))
	//当选择对象只有一个时必须选择的是unit类型
	if(fw1.selUnit!=""&&fw1.selUnit.indexOf(",")==-1){
		u=eval(fw1.selUnit)
		if(u.uType!="unit")
			return
	}
	//取消建筑物地址选择
	if(divModel.style.display==""){
		showObj(";divModel")
			return
	}
	fw1.go(ep)
	//指定工程兵的目标和任务
	if(fw1.selUnit!=""&&fw1.selUnit.indexOf(",")==-1){
		u=eval(fw1.selUnit)
		if(u.name=="0_scv"){
			o=fw1.uInPos(ep)
			if(o!=null){
				if(o.bn>-1){
					u.task="build"
					u.aimu=o.id
				}
			}
		}
	}
	return
}
//缩略图的鼠标抬起
function mini_mouseup(){
	var p=new pt(event.x-divPanel.style.posLeft-10,event.y-20)
	//左键转换操作视界
	if(event.button==1){
		divMain.scrollLeft=p.x*20-bdy.clientWidth/2
		divMain.scrollTop=p.y*15-bdy.clientHeight/2
	}
	//右键指引对象的移动
	if(event.button==2){
		p.setv(parseInt(p.x)/2,parseInt(p.y/2))
		fw1.go(p)
	}
}
//循环调用的主函数
function timer_main(){
	//移动操作区域
	if(divMain.mx<10)
		divMain.scrollLeft-=12
	if(divMain.mx>divMain.clientWidth-10)
		divMain.scrollLeft+=12
	if(divMain.my<10)
		divMain.scrollTop-=12
	if(divMain.my>divMain.clientHeight-10)
		divMain.scrollTop+=12
	//缩略图的当前视界标识框
	mini_range.style.posLeft=divMain.scrollLeft*120/divSize.style.posWidth
	mini_range.style.posTop=divMain.scrollTop*120/divSize.style.posHeight
	var ol=fw1.uList[2].split(","),u,o,rv,i,sp=new pt()
	//遍历工程兵等的制造
	for(i=0;i<ol.length;i++){
		u=eval(ol[i])
		if(u.mn>-1){	//未建完
			u.mn++
			if(menu_build.name==u.id&&menu_build.style.display==""){
				//制造进度条
				o=menu_build.children(1).children(1)
				o.style.posLeft=48+u.mn/4
				o.style.posWidth=119-o.style.posLeft
			}
		}
		if(u.mn>=300){	//建造完成
			u.mn=-1	//设置完成标记
			sp.setv(parseInt(u.px)+parseInt(u.pw/2),parseInt(u.py)+parseInt(u.ph/2))
			fw1.cEndPos=0
			fw1.setUBlock()
			rv=fw1.getEndPos(sp)
			sp.setv(rv[0])
			//将新造unit添加到地图
			fw1.iniMap(fw1.maxID+","+u.bType+","+sp.v+","+cRace)
			race[cRace].man++
			refVal()
			//隐藏面板的建造进度条
			if(menu_build.style.display=="")
				menu_build.children(1).style.display="none"
		}
	}
	//遍历(冒泡、行走、建造、采矿、采气)等动作
	var ol=fw1.uList[3].split(",")
	for(i=0;i<ol.length;i++){
		u=eval(ol[i])
		fw1.move(u)
	}
	window.setTimeout("timer_main()",40)
}

//方向键控制操作视界
function document.onkeydown(){
	switch (event.keyCode){
		case 38:divMain.my = 9;break;
		case 40:divMain.my = divMain.clientHeight - 9;break;
		case 37:divMain.mx = 9;break;
		case 39:divMain.mx = divMain.clientWidth - 9;break;
	}
}
//方向键控制操作视界
function document.onkeyup(){
	switch (event.keyCode){
		case 38:
		case 40:divMain.my = 10;break;
		case 37:
		case 39:divMain.mx = 10;break;
	}
}
</script>

⌨️ 快捷键说明

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