是否有可能在SpriteKit的任意点周围旋转节点?

有没有办法在一个任意的点周围SpriteKit中的节点旋转? 我现在可以操作节点的anchorPoint ,但是如果我想要使用的旋转点位于节点之外,这还不够。

在这里输入图像说明

在SpriteKit中实现这种旋转的最佳方式是什么?

既然你要求最好的方法,那么一个效果很好(最好是主观的):

创build一个SKNode并将其位置设置为旋转中心。 添加应该围绕该中心旋转的节点作为子节点到中心节点。 将子节点的位置设置为所需的偏移量(即半径,例如x + 100)。 更改中心节点的旋转属性以使子节点围绕中心点旋转。 cocos2d btw同样的作品。

我也想在几个星期前解决这个问题 ,并没有实现定位点解决scheme,因为当我们说对象与另一个节点发生碰撞并且应该离开它的轨道时,我不想担心移除定位点反弹。

相反,我想出了两个解决scheme,如果调整了这两个解决scheme。 第一个花了很长时间才完善,现在还不完善。 它包括计算围绕中心位置偏移一个设定半径的一定数量的点,然后如果某个物体进入中心点的一定距离,它将不断使用物理学将物体沿着“圆周“,计算它的点(见上)。

有两种计算半径点的方法

第一个使用毕达哥拉斯定理,第二个最终使用三angular函数。 在第一个中,你增加一个for循环一定的数量,而它less于361(度),并且对于循环的每一次迭代,使用正弦和余弦计算一个点, 。

第二个使用毕达哥拉斯定理,其代码如下:

计算积分后 ,您应该创build一个计划select器[<object> scheduled selector...]; 或didMoveToView中的计时器,或者使用一个固定的更新方法,除了一个名为int的实例variables,它将保存对象将移动到的下一个位置的索引。 每次调用timer方法时,都会使用自己或下面的代码标记为physicsMovement将对象移动到计算点数组中的下一个点; 你可以玩弄物理值,甚至是不同运动效果的ttimer频率。 只要确保你得到正确的索引。 另外,为了更加逼真,我使用了一种方法来计算计算点到对象的最近点,这个点只有在碰撞开始之后才会被调用。 它也被标记为nearestPointGoTo。 如果您需要更多帮助,请在评论中说明。 继续黑客!

我用了第二个,这里是它的源代码:

代码本身没有通过

第二点计算选项

 +(NSArray *)calculatePoints:(CGPoint)point withRadius:(CGFloat)radius numberOfPoints: (int)numberOfPoints{ //or sprite kit equivalent thereof // [drawNode clear]; NSMutableArray *points = [[NSMutableArray alloc]init]; for (int j = 1; j < 5; j++) { float currentDistance; float myRadius = radius; float xAdd; float yAdd; int xMultiplier; int yMultiplier; CCColor *color = [[CCColor alloc]init]; //Will be used later to draw the position of the node, for debugging only for (int i = 0; i < numberOfPoints; i += 1){ //You also have to change the if (indextogoto == <value>) in the moveGumliMethod; float opposite = sqrtf( powf(myRadius, 2) - powf(currentDistance, 2) ); currentDistance = i; switch (j) { case 1: xMultiplier = 1; yMultiplier = 1; xAdd = currentDistance; yAdd = opposite; color = [CCColor blueColor]; break; case 2: xMultiplier = 1; yMultiplier = -1; xAdd = opposite; yAdd = currentDistance; color = [CCColor orangeColor]; break; case 3: xMultiplier = -1; yMultiplier = -1; xAdd = currentDistance; yAdd = opposite; color = [CCColor redColor]; break; case 4: xMultiplier = -1; yMultiplier = 1; xAdd = opposite; yAdd = currentDistance; color = [CCColor purpleColor]; break; default: break; } int x = (CGFloat)(point.x + xAdd * xMultiplier); //or sprite kit equivalent thereof int y = (CGFloat)(point.y + yAdd * yMultiplier); //or sprite kit equivalent thereof CGPoint newPoint = CGPointMake((CGFloat)x,(CGFloat)y); //or sprite kit equivalent thereof NSValue *pointWrapper = [NSValue valueWithCGPoint:newPoint]; //or sprite kit equivalent thereof NSLog(@"Point is %@",pointWrapper); [points addObject:pointWrapper]; } } return points; } 

计算对象的最近点

 -(CGPoint)calculateNearestGumliPoint:(CGPoint)search point { // MY Character is named Gumli float closestDist = 2000; CGPoint closestPt = ccp(0,0); for (NSValue *point in points) { CGPoint cgPoint = [point CGPointValue]; float dist = sqrt(pow( (cgPoint.x - searchpoint.x), 2) + pow( (cgPoint.y - searchpoint.y), 2)); if (dist < closestDist) { closestDist = dist; closestPt = cgPoint; } } return closestPt; } 

我认为做这个工作的最好方法是通过两个SKNode并将它们与SKPhysicsJointPin (请看下面的示例)

在这里输入图像说明

我试图在门上挂上一个门牌( SKSpriteNode )(`SkScene),并且想要在有人触摸的时候在悬挂点上转动

我所做的是制作一个SKNode质量的1x1 SKNode ,并禁用它的重力效应。

 var doorSignAnchor = SKSpriteNode(color: myUIColor, size: CGSize(width: 1, height: 1)) doorSignAnchor.physicsBody = SKPhysicsBody(rectangleOf: doorSignAnchor.frame.size) doorSignAnchor.physicsBody!.affectedByGravity = false // MAGIC PART doorSignAnchor.physicsBody!.mass = 9999999999 // MAGIC PART var doorSignNode = SKSpriteNode(imageNamed:"doorSign") doorSignNode.physicsBody = SKPhysicsBody(rectangleOf: doorSignNode.frame.size) 

并创build了一个SKPhysicsJointPin来连接它们

 let joint = SKPhysicsJointPin.joint( withBodyA: doorSignAnchor.physicsBody!, bodyB: doorSignNode.physicsBody!, anchor: doorSignAnchor.position) mySkScene.physicsWorld.add(joint) 

所以它会像实际门牌一样移动,围绕任意一点旋转(doorSignAnchor)

参考:

  • 关于物理学的官方文件
  • 如何使用SpriteKit物理联接进行链接