ITPub博客

首页 > 应用开发 > IT综合 > 怎样在战棋类RPG中实现精灵的移动范围(转)

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

原创 IT综合 作者:post0 时间:2007-08-12 20:46:35 0 删除 编辑
怎样在战棋类RPG中实现精灵的移动范围(转)[@more@]

  相信玩过这类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 里的东西就很好理解了吧?扫描列,直到扫到下边缘为止!

  最后就返回一个指针,里面就是可以移动到的范围!!

  好了!就这么简单!如果您看了还有什么地方不明白的

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/8225414/viewspace-952010/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
  • 博文量
    2018
  • 访问量
    8225475