怎样在战棋类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/
,如需转载,请注明出处,否则将追究法律责任。