关于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]); //加入结果
}
}
下载 (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]); //加入结果
}
}
相关文章推荐
- Silverlight游戏研发手记:(二)四叉树遍历与人工智能A*算法在SLG移动路径范围测算中的应用
- 一个关于农历的算法----js实现【转】
- 游戏人物跟随鼠标移动的实现
- 实现在SurfaceView上移动游戏人物
- 关于Js实现贪吃蛇的移动的一些感想
- js+ajax实现的A*游戏路径算法整理第1/2页
- Silverlight.XNA(C#)跨平台3D游戏研发手记:(二)四叉树遍历与人工智能A*算法在SLG移动路径范围测算中的应用
- unity战棋类游戏移动范围搜索算法设计(未优化)
- 关于Unity中ARPG游戏人物移动(专题十一)
- Silverlight.XNA(C#)跨平台3D游戏研发手记:(二)四叉树遍历与人工智能A*算法在SLG移动路径范围测算中的应用
- 关于unity3D人物鼠标移动(初步实现)
- 关于《四元数插值算法实现游戏角色平滑旋转》中的算法一些问题
- js+ajax实现的A*游戏路径算法整理第1/2页
- 即时战略游戏中寻径(Path-finding)算法的原理及实现技术
- 关于游戏中移动的坐标算法(复习初中的三角函数知识)
- 九格游戏最少移动步数算法实现
- Android 简单游戏实现笑脸的移动与人物移动
- 一个关于农历的算法----js实现
- 关于游戏中拦截算法的实现
- 用JS实现移动的窗口 - 流星絮语 JAVA学习笔记 - CSDNBlog