首页 文章

SpriteKit 中的坐标系

提问于
浏览
2

我对 spritekit 坐标系很困惑。我需要澄清两个案例。

情况 1:

将精灵节点作为子节点添加到场景时:

SKSpriteNode * blueBall = [SKSpriteNode spriteNodeWithImageNamed:@"hRedBall.png"];
blueBall.name=@"blueball";
blueBall.size=CGSizeMake(75, 75);
blueBall.position=point; //I am varying this point
[self addChild:blueBall];

我已经在不同的点添加了节点,每个 time.These 是我添加节点的点:(100x100)(200x200)(300x300)(400x400)(900,600)

在我的 iphone 5 设备中,它们看起来像这样:

在此输入图像描述

在此输入图像描述

在此输入图像描述

在此输入图像描述

在此输入图像描述

在此输入图像描述

如果你查看 100x100,当我在点(100,100)处添加精灵时,在设备上,当我记录节点位置时,它显示我(99.9,138.17),这与点(100,100)相比是巨大的差异。

即使其他点也有变化,我忽略了它们,因为差异对于其他点来说太小了。

-(void)didMoveToView:(SKView *)view {
    /* Setup your scene here */
      [self bounceTheBlueBallAtPoint:CGPointMake(100, 100)];

}

    -(void)bounceTheBlueBallAtPoint:(CGPoint)point{

    SKSpriteNode * blueBall = [SKSpriteNode spriteNodeWithImageNamed:@"hRedBall.png"];
    blueBall.name=@"blueball";
    blueBall.size=CGSizeMake(75, 75);

    blueBall.physicsBody=[SKPhysicsBody bodyWithCircleOfRadius:blueBall.frame.size.width/2];

    blueBall.physicsBody.categoryBitMask=blueBallHitCategory;
    blueBall.physicsBody.collisionBitMask=blueBallHitCategory|pinkBallHitCategory|wallHitCategory;
    blueBall.physicsBody.contactTestBitMask=blueBallHitCategory|pinkBallHitCategory|wallHitCategory;

    blueBall.physicsBody.dynamic=YES;
    blueBall.physicsBody.affectedByGravity=NO;
    blueBall.physicsBody.restitution=1.0;
    blueBall.physicsBody.friction=0.0;
    blueBall.physicsBody.linearDamping=0.0;
    blueBall.physicsBody.angularDamping=0.0;

    blueBall.position=point;

    [self addChild:blueBall];

    //applying impulse to bounce off
//    CGVector impulse = CGVectorMake(30.0,60.0);
//    [blueBall.physicsBody applyImpulse:impulse];
//    

}

我正在用这种方法检查球的位置:

-(void)update:(CFTimeInterval)currentTime {
    /* Called before each frame is rendered */

    [self checkSpriteMovement];

   }

    -(void)checkSpriteMovement{

    [self enumerateChildNodesWithName:@"blueball" usingBlock:^(SKNode * _Nonnull node, BOOL * _Nonnull stop) {

        SKSpriteNode *ball=(SKSpriteNode *)node;

        if (ball.physicsBody.resting) {

            NSLog(@"The ball position is %@",NSStringFromCGPoint(ball.position));
        }

    }];

}

案例 2:

假设我有一个背景精灵节点,我将球节点添加到此背景节点,而不是将球节点添加到场景中。

_background = [SKSpriteNode spriteNodeWithImageNamed:@"parkImage.jpg"];
_background.size = self.frame.size; //frame size is (1024x768)
_background.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame));
[self addChild:_background];

然后我将球节点添加到此背景:

[_background addChild:blueBall];

这是添加的后台节点:

在此输入图像描述

现在我尝试将球添加到添加的背景中:

在 point:(100,100):

在此输入图像描述

在 point:(-280,-150)

在此输入图像描述

我还想讨论第三种情况:

案例 3:

我想要另一个节点 sprite backgorund 叫做 ring。后来我想把球添加到后台。所以会有 2 个子节点。

_ringNode=[SKSpriteNode spriteNodeWithImageNamed:@"hue_ring.png"];
_ringNode.size=CGSizeMake(80, 80);
_ringNode.position=CGPointMake(0, 0);  //center point of background in this case
_ringNode.anchorPoint=CGPointMake(0.5,0.5);
_ringNode.name=kRingNodeName;
[_background addChild:_ringNode];

所以戒指将在这里:

在此输入图像描述

现在我想将球节点添加到后台节点:

我使用相同的代码在点(-280,-150)添加球:

在此输入图像描述

为什么场景和精灵节点的坐标系有变化?

我面临的另一个问题是:

虽然场景已启动,但节点不会添加到场景 properly.Even,节点对用户不可见,但我可以看到节点计数表明 screen.I 上有节点需要再次运行代码才能正确添加节点到了现场。这种情况每 4 次发生一次。我只需要停止代码然后再次运行它以查看 scree 上的球,否则我只看到没有任何球的背景,但我将它们添加到背景中。

为什么会这样?

我在didMoveToView添加所有节点

2 回答

  • 4

    好的,所以回答这个问题很难,因为它不像你有一个问题,但我会尽力解释为什么事情正在以他们的方式发生。

    首先要考虑的是。你的场景是 1024 x 768(猜测是因为你的一条评论和你的问题)现在这会引起一些问题。首先,你的手机不是那个宽高比,第二个你的手机不是那么大。如果您查看 ViewController,您可能会看到设置了一些 AspectFill 或 AspectFit。这会缩小你的场景。当涉及到您所看到的内容以及您在代码中执行的操作时,事情不再是 1:1。

    让我们走得更远。场景的原点位于左下方,根据您的场景大小和缩放,它可能在屏幕外。这是 0,0 的地方。因此,您添加的每个孩子都将从那里开始,并根据位置正确地工作。 SKSpriteNode 的起源位于中心。例如,您的背景将在中心有一个起源。注意如何将位置设置为帧宽度和高度的一半。它的原点位于中间,你将它向右移动并向左移动正确的距离。现在,当您向该节点添加子节点时,它将从其父节点的原点开始。在这个例子中心。因此,当您将球添加到背景时,必须给它负值以降低到左下角。

    至于节点没有出现。如果你查看 ViewController,你可能会看到 ignoresSibling 命令或者那种性质的东西。这意味着您必须设置节点的 zPosition。较低的 zPosition 首先被渲染,因此背景通常为 0,并且显示在背景之上的所有节点都获得 1 或更高的 zPosition。

    希望这会有所帮助。虽然您的问题都有详细记录,但很难在一个答案中回答您的所有问题。在将来我会建议在第一个问题得到解答后提出问题并提出新问题,因为在你有机会提问之前你可能会得到答案=)

  • 2

    案例 1:不知道为什么它会被 38-odd 指出;我需要看到添加节点的代码。

    情况 2 和 3:场景和精灵节点具有不同的锚点。对于SKScene它是(0.0,0.0)而对于SKSpriteNode它是(0.5,0.5)。

相关问题