SpriteKit PhysicsWorld坐标系,奇怪的运行时关节锚

时间:2014-11-29 05:28:38

标签: ios sprite-kit

这里有两个相关的事情:

1)我可以使用self,self.scene和myWorld从我的SKScene impelmentation文件中绘制一个框并添加到子项中,但不能使用SKSprite节点的场景属性。

SKSpriteNode *bla = [SKSpriteNode spriteNodeWithColor:[UIColor redColor] size:CGSizeMake(100, 100)];
[self.scene addChild:bla]; // If I use bla.scene, it doesn't work. self, self.scene, myworld all do work though.
bla.position = CGPointMake(0, 0);
bla.zPosition = 999;

2)我已经看到了相关问题herehere,但我试图在游戏过程中添加一个关节(抓住一根绳子)。在`didBeginContact:

中进行一些排序后调用此方法
-(void)monkey:(SKPhysicsBody *)monkeyPhysicsBody didCollideWithRope:(SKPhysicsBody *)ropePhysicsBody atPoint:(CGPoint)contactPoint
{
    if (monkeyPhysicsBody.joints.count == 0) {
        // Create a new joint between the player and the rope segment
        CGPoint convertedRopePosition = [self.scene convertPoint:ropePhysicsBody.node.position fromNode:ropePhysicsBody.node.parent];
        SKPhysicsJointPin *jointPin = [SKPhysicsJointPin jointWithBodyA:playerPhysicsBody bodyB:ropePhysicsBody anchor:convertedRopePosition];
        jointPin.upperAngleLimit = M_PI/4;
        jointPin.shouldEnableLimits = YES;
        [self.scene.physicsWorld addJoint:jointPin];
    }
}

我在场景中启用showPhyiscs,所以我可以看到关节最终在一个完全古怪的地方。不幸的是,我不知道如何应用链接的解决方案,因为我没有在此方法中添加SKSpriteNodes,它们已经存在,所以我不能只翻转position和{的顺序{1}}。

我已经尝试了两种physicsBody方法的所有排列方式。没有任何效果。我最好的猜测是convertPoint正在使用一些古怪的坐标系。

3 个答案:

答案 0 :(得分:2)

与位置( CGPoint )或框架( CGRect )相关的 SKPhysicsWorld 的方法成员将位于场景坐标中。场景坐标引用点{0,0}作为左下角,并且在 SpriteKit 中保持一致。

bla时,名为 bla 的对象的场景属性 nil 首先创建 ,并在添加到场景时由场景设置。

[bla.scene addChild:bla]; // this won't do anything as scene will be nil when first created

看起来 convertedRopePosition 被分配了一个不正确的值,因为您要传入的第二个成员, - (CGPoint)convertPoint:(CGPoint)指向来自节点:(SKNode *)节点,是应该是与此节点相同的节点树中的另一个节点的场景。其中此节点是调用者(在本例中为 SKScene 子类)。

尝试更换行 -

CGPoint convertedRopePosition = [self.scene convertPoint:ropePhysicsBody.node.position fromNode:ropePhysicsBody.node.parent];

与 -

CGPoint convertedRopePosition = [self convertPoint:ropePhysicsBody.node.position fromNode:ropePhysicsBody.node];

答案 1 :(得分:0)

我想出了一个针对这个问题的艰苦工作。事实证明,physicsWorld的坐标系偏移可能是由于锚点差异造成的。更改每个相关事物的锚点没有任何区别,你不能直接更改physicsWorld的锚点,所以我最终将场景宽度的一半和场景高度的一半添加到我的关节的锚点位置。这使它显示在正确的地方,并表现正常。

答案 2 :(得分:0)

一旦考虑了侧滚动,这个问题就会持续存在。我已经发布了其他问题here同样的问题,但我会包括

我在GameScene.m中添加了以下便捷方法。它基本上取代了看似无用的convertTo内置方法。

-(CGPoint)convertSceneToFrameCoordinates:(CGPoint)scenePoint
{
    CGFloat xDiff = myWorld.position.x - self.position.x;
    CGFloat yDiff = myWorld.position.y - self.position.y;
    return CGPointMake(scenePoint.x + self.frame.size.width/2 + xDiff, scenePoint.y + self.frame.size.height/2 + yDiff);
}

我使用此方法添加关节。它处理需要处理的所有坐标系转换,导致此问题中出现的问题。例如,我添加关节的方式

    CGPoint convertedRopePosition = [self convertSceneToFrameCoordinates:ropePhysicsBody.node.position];
    SKPhysicsJointPin *jointPin = [SKPhysicsJointPin jointWithBodyA:monkeyPhysicsBody bodyB:ropePhysicsBody anchor:convertedRopePosition];
    jointPin.upperAngleLimit = M_PI/4;
    jointPin.shouldEnableLimits = YES;
    [self.scene.physicsWorld addJoint:jointPin];