我正在开发一个简单的游戏,其中包含一个能够扔出一根绳子的精灵。为了实现这一点,我希望用户点击屏幕上的一个点,并计算点击的点(目标)和玩家精灵位置(原点)之间的角度。从这里我可以很容易地绘制一个直角三角形,然后我想约束斜边三角形代表"绳索"长度有限。
要做到这一点,我得到原始的三角形角度,将其斜边定义为绳索的长度,然后使用余弦来计算缩短的x长度和正弦以计算出缩短的y高度。
我正在使用SKShapeNodes绘制临时三角形,而我试图解决这个问题:
CGPoint origin = CGPointMake(0, 0);
CGPoint target = newAnchorPoint; //This the the clicked spot
CGPoint diff = CGPointMake(target.x - origin.x, target.y - origin.y);
double angle = atan2(diff.y,diff.x);
double kLength = 400;
double newXLength = cos(angle) * kLength;
double newYLength = sin(angle) * kLength;
CGPoint newTarget = CGPointMake(newXLength, newYLength);
tPath1 = CGPathCreateMutable();
CGPathMoveToPoint(tPath1, NULL, origin.x, origin.y);
CGPathAddLineToPoint(tPath1, NULL, target.x, origin.y);
CGPathAddLineToPoint(tPath1, NULL, target.x, target.y);
CGPathAddLineToPoint(tPath1, NULL, origin.x, origin.y);
tri1.path = tPath1;
tPath2 = CGPathCreateMutable();
CGPathMoveToPoint(tPath2, NULL, origin.x, origin.y);
CGPathAddLineToPoint(tPath2, NULL, newTarget.x, origin.y);
CGPathAddLineToPoint(tPath2, NULL, newTarget.x, newTarget.y);
CGPathAddLineToPoint(tPath2, NULL, origin.x, origin.y);
tri2.path = tPath2;
ang.path = nil;
CGMutablePathRef curve = CGPathCreateMutable();
CGPathAddArc(curve, NULL, origin.x, origin.y, 100, angle, 0, YES);
ang.path = curve;
这个问题是当原点为0,0时,它可以很好地工作。一旦原点从此点移动,第二个受约束的三角形与原始三角形不匹配。我检查并重新检查了我的数学并确保我理解三角学但我无法理解为什么这不符合预期。任何帮助将不胜感激。
答案 0 :(得分:0)
您对newTarget
的计算会产生代表绳索长度的向量。相反,target
是一个位置。
我想你想要:
CGPoint newTarget = CGPointMake(newXLength + origin.x, newYLength + origin.y);