2

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

我目前正在制作一个游戏,其中我有一个“激光环”,如下所示:

一个激光环

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

在此处输入图像描述

这个抓钩在发射时应该与环对齐,以便它们看起来是一个物品。为清楚起见,请参阅下图:

在此处输入图像描述

*请注意,抓钩的宽度几乎每帧都在变化,因此不能假设宽度恒定。

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

所以,我对你们所有人的问题是:我如何才能仅访问抓钩的frame.center.xframe.center.y属性,将其放置在激光环周围,使其看起来从环无缝延伸,如上图所示- 大概是根据任何给定框架的抓钩的角度和宽度计算的?

非常感谢任何帮助。

4

1 回答 1

6

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

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

即基于线长1的线中的矢量变化。

它只是使用简单的毕达哥拉斯......

- (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

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

于 2012-11-19T10:42:10.703 回答