SpriteKit - 在半圆拱中移动物体
SpriteKit - Moving object in a semi circle arch
我对 sprite 工具包比较陌生。我想达到的目标;
- 我有一个物体放在屏幕中间
- 当点击屏幕左侧时,我希望对象以拱形方式向左弯曲。如果您想象物体位于钟面上的 12 点,按下左键将使它动画到 9 点。
- 当向右轻敲时,我希望对象移动到 3 点。
- 但是,如果对象已拱形到 9 到 12(10 或 11)之间的位置,并且我按向右,则它需要移动穿过路径。
- 总而言之,我想要一条跨越 9 点到 3 点之间的路径。当用户向左或向右点击时,对象将沿着路径移动,直到用户松开按钮(屏幕的左侧或右侧)
如果我可以提供任何其他信息来帮助更清楚地说明这一点,请告诉我。
一如既往,非常感谢任何回复:)
好的,所以有一个很酷的小 SKAction
(我相信你很熟悉 class)它允许 SKSpriteNode
遵循一条路径:
SKAction *move = [SKAction followPath:/*aPath*/ duration:1];
[myNode runAction:action];
// There's also a followPath:withSpeed: method which may be more suitable for you
为此你只需要路径本身,为此你可以使用 UIBezierPath
。 UIBezierPath
是 objective-c class 允许您定义路径然后可以在 drawRect:
方法中绘制在视图上。它们也可以转换为 CGPathRef
s,然后可以跟一个节点。
所有的圆弧都是圆的一部分,有一个UIBezierPath
的方法来定义圆弧:arcWithCenter:radius:startAngle:endAngle:clockwise:
.
所以...让我们假设您的节点位于 200,200 的矩形中的点 100,200 )(即正好在 x 的中心但在 y 的顶部)。您希望此节点沿着指向 0,100:
的弧线
本质上,您在这里所做的是将节点移动四分之一的圆,如下所示:
在这种情况下,圆的半径为 100,并且 0 度位于 3 点钟位置。另外值得注意的是,对于 UIBezierPath
,角度是以弧度而不是度数来衡量的。要将度数转换为弧度,您可以使用这个简单的公式:float radian = degree * M_PI / 180.0f;
其中 M_PI
是圆周率。
因此,要创建从点 100,200 到 0,100 的路径并将其应用于 SKAction
,您可以这样做:
UIBezierPath *path = [UIBezierPath pathWithArcCenter:CGPointMake(100,100), radius:100 startAngle:90.0f * M_PI / 180.0f endAngle:180.0f * M_PI / 180.0f clockwise:NO];
SKAction *moveInArc = [SKAction followPath:path.CGPath duration:1];
关于移动到弧中段的不同位置,您可以将 SKAction
与 NSDictionary
等键相关联,然后在它们完成之前将其移除,从而终止操作。
对于点击时的电弧,您需要覆盖 touchesBegan:withEvent:
。
希望这能让您走上正确的道路。 (双关语...)
编辑:
好的,上面的代码定义了一个路径,它像圆的一部分一样绘制,就像饼图的一部分,但是,您可以使用 UIBezierPath
方法
- (void)addCurveToPoint:(CGPoint)endPoint
controlPoint1:(CGPoint)controlPoint1
controlPoint2:(CGPoint)controlPoint2
或
- (void)addQuadCurveToPoint:(CGPoint)endPoint
controlPoint:(CGPoint)controlPoint
后者可能最适合您。 Here is a link to the docs.
您的代码将如下所示:
UIBezierPath *path = [UIBezierPath bezierPath];
[path moveToPoint:node.positon];
[path addQuadCurveToPoint:destination controlPoint:control];
SKAction *move = [SKAction followPath:path.CGPath duration:1];
[node runAction:move];
要计算控制点,您可以尝试直到获得所需的效果(也许是一个直角三角形,其中从节点到目的地的线是斜边,控制点是直角的点), 或者 here 是对二次曲线的简单解释。
我对 sprite 工具包比较陌生。我想达到的目标;
- 我有一个物体放在屏幕中间
- 当点击屏幕左侧时,我希望对象以拱形方式向左弯曲。如果您想象物体位于钟面上的 12 点,按下左键将使它动画到 9 点。
- 当向右轻敲时,我希望对象移动到 3 点。
- 但是,如果对象已拱形到 9 到 12(10 或 11)之间的位置,并且我按向右,则它需要移动穿过路径。
- 总而言之,我想要一条跨越 9 点到 3 点之间的路径。当用户向左或向右点击时,对象将沿着路径移动,直到用户松开按钮(屏幕的左侧或右侧)
如果我可以提供任何其他信息来帮助更清楚地说明这一点,请告诉我。
一如既往,非常感谢任何回复:)
好的,所以有一个很酷的小 SKAction
(我相信你很熟悉 class)它允许 SKSpriteNode
遵循一条路径:
SKAction *move = [SKAction followPath:/*aPath*/ duration:1];
[myNode runAction:action];
// There's also a followPath:withSpeed: method which may be more suitable for you
为此你只需要路径本身,为此你可以使用 UIBezierPath
。 UIBezierPath
是 objective-c class 允许您定义路径然后可以在 drawRect:
方法中绘制在视图上。它们也可以转换为 CGPathRef
s,然后可以跟一个节点。
所有的圆弧都是圆的一部分,有一个UIBezierPath
的方法来定义圆弧:arcWithCenter:radius:startAngle:endAngle:clockwise:
.
所以...让我们假设您的节点位于 200,200 的矩形中的点 100,200 )(即正好在 x 的中心但在 y 的顶部)。您希望此节点沿着指向 0,100:
的弧线本质上,您在这里所做的是将节点移动四分之一的圆,如下所示:
在这种情况下,圆的半径为 100,并且 0 度位于 3 点钟位置。另外值得注意的是,对于 UIBezierPath
,角度是以弧度而不是度数来衡量的。要将度数转换为弧度,您可以使用这个简单的公式:float radian = degree * M_PI / 180.0f;
其中 M_PI
是圆周率。
因此,要创建从点 100,200 到 0,100 的路径并将其应用于 SKAction
,您可以这样做:
UIBezierPath *path = [UIBezierPath pathWithArcCenter:CGPointMake(100,100), radius:100 startAngle:90.0f * M_PI / 180.0f endAngle:180.0f * M_PI / 180.0f clockwise:NO];
SKAction *moveInArc = [SKAction followPath:path.CGPath duration:1];
关于移动到弧中段的不同位置,您可以将 SKAction
与 NSDictionary
等键相关联,然后在它们完成之前将其移除,从而终止操作。
对于点击时的电弧,您需要覆盖 touchesBegan:withEvent:
。
希望这能让您走上正确的道路。 (双关语...)
编辑:
好的,上面的代码定义了一个路径,它像圆的一部分一样绘制,就像饼图的一部分,但是,您可以使用 UIBezierPath
方法
- (void)addCurveToPoint:(CGPoint)endPoint
controlPoint1:(CGPoint)controlPoint1
controlPoint2:(CGPoint)controlPoint2
或
- (void)addQuadCurveToPoint:(CGPoint)endPoint
controlPoint:(CGPoint)controlPoint
后者可能最适合您。 Here is a link to the docs.
您的代码将如下所示:
UIBezierPath *path = [UIBezierPath bezierPath];
[path moveToPoint:node.positon];
[path addQuadCurveToPoint:destination controlPoint:control];
SKAction *move = [SKAction followPath:path.CGPath duration:1];
[node runAction:move];
要计算控制点,您可以尝试直到获得所需的效果(也许是一个直角三角形,其中从节点到目的地的线是斜边,控制点是直角的点), 或者 here 是对二次曲线的简单解释。