您的位置:首页 > Web前端 > JavaScript

关于SLG战略游戏中,人物移动范围的算法(js实现)

2014-07-01 09:07 459 查看
关于SLG战略游戏中,人物移动范围的算法 战略游戏里作战单位都是有移动力的, 显示移动选区的时候会出现围绕单位的一个菱形选区,里面包含了对障碍物的计算.   例: 假设目前有一单位坐标为   5,5 移动力为 2格时,出现的选区坐标!



下载 (10.38 KB) 2009-2-15 17:09 js函数实现 function ScopeFinder()

{

this.sx=0; //中心点

this.sy=0;

this.step=5; //移动力

this.maxX=10; //地图边界

this.maxY=10;

this.hinder={"6,5":true,"5,5":true}; //障碍点

this.sp={}; //记录每个格子的移动力

this.wp=[]; //等待处理的节点

this.path=[]; //包含了结果

this.opened={}; //包含了已经处理的点

this.find=function()

{

this.path=[]; //清空

this.opened={};

this.wp=[];

this.sp={};

this.sp[this.sx+","+this.sy]=this.step; //将初始点的移动力设置为最高移动力

this.wp.push([this.sx,this.sy]); //放进待处理队列

this.opened[this.sx+","+this.sy]=true; //把起点放进已处理的点中

while(this.wp.length)

{

this.getNode();

}

return this.path; //返回结果集合

}

//获取一个待拓展节点

this.getNode=function()

{

var tmpNode=this.wp.pop();

var x=tmpNode[0];

var y=tmpNode[1];

this.findNode(x,y,x+1,y); //右

this.findNode(x,y,x-1,y); //左

this.findNode(x,y,x,y+1); //下

this.findNode(x,y,x,y-1); //上

}

//检查节点

this.findNode=function(fx,fy,tx,ty)

{

if(tx<0 || ty<0 || tx>=this.maxX || ty>=this.maxY) { return; } //如果超出边界

if(this.hinder[tx+","+ty]){return;} //如果是障碍

if(this.opened[tx+","+ty]){return;} //如果是处理过的

if(this.sp[fx+","+fy]-1<0){return;}; //如果已经没有移动力了

//如果都不是,则代表是个可以拓展的节点

this.sp[tx+","+ty]=this.sp[fx+","+fy]-1; //把新的节点的移动力继承并减1

this.wp.push([tx,ty]); //加入等待队列

this.opened[tx+","+ty]=true; //设置为已经处理的

this.path.push([tx,ty]); //加入结果

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: