在x,y坐标中沿路径精确移动单位

时间:2010-01-26 22:10:39

标签: iphone android algorithm

我正在玩一个小队在地图上移动的策略游戏。每次转弯将一定量的移动分配给一个小队,如果小队有一个目的地,则每次转弯都会应用这些点,直到到达目的地。使用实际距离,因此如果小队在x或y方向上移动一个位置则使用一个点,但是对角移动需要大约1.4个点。小队将实际位置保持为浮动状态,然后将其舍入为允许在地图上绘制位置。

通过触摸小队并拖动到最终位置然后抬起笔或手指来描述路径。 (我现在在iPhone上做这个,但是Android / Qt / Windows Mobile也会这样做)当指针移动x时,会记录y个点,以便小队在前往最终目的地的路上获得一个中间目的地列表。我发现目的地的间距不均匀,但可以根据指针移动的速度进一步分开。跟随路径很重要,因为在这个游戏中障碍物或地形很重要。我不是要重拍飞行控制,但这是一个类似的机制。

这是我一直在做的事情,但它似乎太复杂了(伪代码):

getDestination() {
- self.nextDestination = remove_from_array(destinations)
- self.gradient = delta y to destination / delta x to destination
- self.angle = atan(self.gradient)
- self.cosAngle = cos(self.angle)
- self.sinAngle = sin(self.angle)
}

move() {
- get movement allocation for this turn
- if self.nextDestination not valid
- - getNextDestination()
- while(nextDestination valid) && (movement allocation remains) {
- - find xStep and yStep using movement allocation and sinAngle/cosAngle calculated for current self.nextDestination
- - if current position + xStep crosses the destination
- - - find x movement remaining after self.nextDestination reached
- - - calculate remaining direct path movement allocation (xStep remaining / cosAngle)
- - - make self.position equal to self.nextDestination
- - else 
- - - apply xStep and yStep to current position
- }
- round squad's float coordinates to integer screen coordinates
- draw squad image on map
}

当然,这是简化的,需要调整像标志这样的东西,以确保移动方向正确。如果trig是最好的方法,那么可以使用查找表,也可以像过去那样在现代设备上使用。

建议更好的方法吗?

  • 更新 - 如上所述,iPhone在触发和跟踪数十个位置和轨道方面没有问题,无论如何它都会引入浮点数。 Bresenham方法更有效,trig更精确。如果我要使用整数Bresenham,我希望乘以10左右,以保持更高的位置精度,从而有利于碰撞/地形检测。

2 个答案:

答案 0 :(得分:2)

我认为Bresenham's line algorithm就是你所需要的。维基百科的文章是一个很好的起点,你应该能够在某个地方找到更多的示例代码。

这是来自维基百科的伪代码

function line(x0, x1, y0, y1)
 int deltax := x1 - x0
 int deltay := y1 - y0
 real error := 0
 real deltaerr := deltay / deltax    // Assume deltax != 0 (line is not vertical),
       // note that this division needs to be done in a way that preserves the fractional part
 int y := y0
 for x from x0 to x1
     plot(x,y)
     error := error + deltaerr
     if abs(error) ≥ 0.5 then
         y := y + 1
         error := error - 1.0

答案 1 :(得分:1)

使用角度似乎适得其反,将计算保持在X-Y坐标系中会更简单。