游戏编程困难的数学问题

时间:2012-11-19 10:27:34

标签: iphone objective-c math positioning

我要问的问题可能有些挑战。我会努力使这一点尽可能清晰和有凝聚力。

我正在制作一款游戏,其中我有一个“激光戒指”,如下所示:

A laser ring

这个激光环在出现提示时会发出一个“抓钩”,这只是下图所示的图像。调整此图像的frame.width属性以使其触发(延长)和缩回(缩短)。它从宽度0开始,随着帧的进展,它会延长直到达到所需的点。

enter image description here

这种擒抱钩在击发时应与戒指对齐,使它们看起来像是一个项目。为清晰起见,请参阅下图:

enter image description here

*请注意,抓钩的宽度几乎每帧都会改变,所以不能假设一个恒定的宽度。

需要注意的是,由于难以解释的原因,我只能访问抓取钩子的frame.center属性,而不能访问frame.origin属性。

所以,我向你提出的问题是:我怎么能只访问擒抱钩的frame.center.xframe.center.y属性,将它放在激光环周围,使其出现如上图所示,从环上无缝延伸 - 可能是根据任何给定帧的抓钩的角度和宽度计算的?

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:6)

好的,我在自己的应用程序中完成了同样的事情。

我做的更容易的技巧是有一个函数来计算线的“unitVector”。

即。向量根据行长度1变化。

它只使用简单的pythagorus ......

- (CGSize)unitVectorFromPoint:(CGPoint)start toPoint:(CGPoint)end
{
    //distance between start an end
    float dX = end.x - start.x;
    float dY = end.y - start.y;
    float distance = sqrtf(dX * dX + dY * dY);  // simple pythagorus

    //unit vector is just the difference divided by the distance
    CGSize unitVector = CGSizeMake(dX/distance, dY/distance);

    return unitVector;
}

注意......开始和结束的方向并不重要,因为数字只会给出正值。

现在你可以使用这个向量来到两个点之间的任意点(圆心和目标的中心)。

因此,该行的开头是......

CGPoint center = // center of circle
CGPoint target = // target
float radius = //radius of circle

float dX = center.x - target.x;
float dY = center.y - target.y;

float distance = sqrtf(dX * dX + dY * dY);

CGSize unitVector = [self unitVectorFromPoint:center toPoint:target];

CGPoint startOfLaser = CGPointMake(center.x + unitVector.x * radius, center.y + unitVector.y * radius).

CGPoint midPointOfLaser = CGPointMake(center.x + unitVecotr.x * distance * 0.5, center.y + unitVector.y * distance * 0.5);

这只是将单位矢量乘以你想去的距离(半径)到达该距离线上的点。

希望这会有所帮助:D

如果您想要两点之间的中点,那么您只需要将“半径”更改为您想要计算的距离,它将为您提供中点。 (依此类推)。