是否可以围绕SpriteKit中的任意点旋转节点?

时间:2013-09-27 07:26:18

标签: ios ios7 sprite-kit

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

enter image description here

在SpriteKit中实现这种轮换的最佳方法是什么?

4 个答案:

答案 0 :(得分:27)

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

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

答案 1 :(得分:0)

几周前我也试图解决这个问题,并没有实现锚点解决方案,因为我不想担心当我们说对象时删除锚点与另一个节点发生碰撞,应离开轨道并反弹。

相反,我提出了两个解决方案,如果进行调整,这两个解决方案都有效。第一次花了很长时间才完美,但仍然不完美。它涉及计算围绕中心位置偏移设定半径的一定数量的点,然后如果某个物体进入中心点的某个距离,它将继续使用物理学将物体沿着&的轨迹路径发送。 #34;圆周"圆圈,它计算的点数(见上文)。

有两种计算半径为

的点的方法

第一个使用毕达哥拉斯定理,第二个最终使用三角法。 在第一个中,你将for循环增加一定量,而它小于361(度),并且对于循环的每次迭代,使用正弦和余弦计算在距离中心点的某个半径处具有该角度的点

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

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

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

答案 2 :(得分:0)

代码本身没有通过

第二点计算选项

+(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;
}

答案 3 :(得分:0)

我认为实现这项工作的最佳方式是通过两个SKNode并与SKPhysicsJointPin联合起来(请参阅下面的 pin 示例)

enter image description here

我试图在我的门(“SkScene”)上挂一个门牌(SKSpriteNode),当有人碰到它时,我想在悬挂点上旋转

我所做的是制作一个具有HUGH质量的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)

并创建了一个SKPhysicsJointPin来连接所有

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

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

参考: