相信玩过这类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 里的东西就很好理解了吧?扫描列,直到扫到下边缘为止!
最后就返回一个指针,里面就是可以移动到的范围!!
好了!就这么简单!如果您看了还有什么地方不明白的话