首页>
技术资讯>
详情

怎样在战棋类RPG中实现精灵的移动范围

2016-05-28 来源:CloudBest 阅读量: 374
关键词: 算法设计


  相信玩过这类RPG游戏的玩家都知道,精灵的移动范围是有点象一个“十”的。那么这是怎么样实现的呢?
  下面我就来说说我在我的游戏“宿命传说”中的做法
  我在程序中有这么一段描述:
  其中TilePos为
  class TilePos
  {
  public:
  int Line;//地图块在大地图中的行号
  int Row;//地图块在大地图中的列号
  }
  TilePos * CalculateArea(TilePos pos,int MoveAbility,int &Num)
  {
  //  pos 为中心坐标,也就是以这里作为计算范围的中心
  //  MoveAbility行动范围
  //  Num返回可移动到的坐标的数量
  Num=MoveAbility*(4+(MoveAbility-1)*2)+1;
  int DeltaLine=-MoveAbility;//注意有个负号
  int DeltaRow=0;
  TilePos *tp=new TilePos[Num];
  If(!tp)return NULL;
  for(int i=0;i  {
  tp[i].Line=pos.Line+DeltaLine;
  tp[i].Row=pos.Row+DeltaRow;
  if( (abs(DeltaLine)+abs(DeltaRow)==MoveAbility) && DeltaRow>=0 )
  {
  DeltaLine++;
  DeltaRow=abs(DeltaLine)-MoveAbility;
  }
  else
  {
  DeltaRow++;
  }
  }
  return tp;
  }
  可能大家会问:怎么知道块总数呢?
  我是这样计算的:
  Num= MoveAbility*(4+(MoveAbility-1)*2)+1;
  结果为:
  MoveAbility->Num
  1->5;
  2->13;
  3->25;
  4->41;
  至于为什么会想出这样嘛,我说我是归纳的(不知道哪位大虾有更清楚的算法没有,如果有,请Mail我一份,谢谢)
  大家再看看下面这幅图:
  


  以兰色块为中心,移动力为3的图象就是这样
  设兰色块坐标为x0,y0;
  则0号块为x0-3,y0;
  1号为x0-2,y0-1;
  我们不难发现,与兰色块坐标偏移最大的
  就是移动力(此图为3)!
  如0号块x偏移了-3,y偏移了0
  1号块x偏移了-2,y偏移了-1
  由此发现,在最外圈的图块偏移的绝对值之和都为3
  (3=MoveAbility)
  那么怎么得到所有的图块坐标呢?
  我从最左端开始扫描(也就是0号块)
  当然此时x偏移-3,y偏移0
  然后我在for循环中使用了这一句:
  if( (abs(DeltaLine)+abs(DeltaRow)==MoveAbility) && DeltaRow>=0 )
  {
  DeltaLine++;
  DeltaRow=abs(DeltaLine)-MoveAbility;
  }
  else
  {
  DeltaRow++;
  }
  是什么意思呢?
  If里的东西是指当扫描到下边缘时就继续下一列的扫描
  DeltaRow=abs(DeltaLine)-MoveAbility是什么呢?上边缘!
  Else 里的东西就很好理解了吧?扫描列,直到扫到下边缘为止!
  最后就返回一个指针,里面就是可以移动到的范围!!
  好了!就这么简单!如果您看了还有什么地方不明白的话

热门推荐 查看更多