【问题标题】:SKNode position not working, always going to default 0,0SKNode 位置不工作,总是默认 0,0
【发布时间】:2014-01-26 23:20:38
【问题描述】:

我正在开发相当完善的 SpriteKit 游戏,添加了一些代码以将新的 SKSpriteNode 添加到场景中,(与我在代码中的其他几十个地方所做的相同,但出于某种原因,这次是只是忽略了我为节点设置的位置,我已经通过显式尝试了 .position = CGPointMake(x,y) 并尝试了 [node setPosition:CGPointMake(x,y)]

都不工作...节点确实被添加到场景中,但总是在 0,0,无论我做什么,都检查了 x 和 y 以确保它们有效并且在场景范围内, 并尝试使用显式浮点数等,不管我做什么,这个节点总是显示在 0,0,这绝对没有意义。在玩游戏的过程中,我所做的一切都与我对其他几十个节点所做的一样,但无论我做什么,这个节点都不会出现在任何地方,除了 0,0:

int width = 64;
SKSpriteNode *node = [[SKSpriteNode alloc] initWithColor:[SKColor grayColor] size:CGSizeMake(width,25)];
node.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:node.size];
node.physicsBody.dynamic = NO;
node.physicsBody.categoryBitMask=nodeCategory;
node.name=@"node";
node.position = CGPointMake(200,250);
//Have also tried [node setPosition:CGPointMake(200,250);
[self addChild:node];

我在这里完全不知所措,我尝试将 .0 添加到 CGPointMake 的输入中,以确保它们被处理为浮点数...无论我对这个节点做什么,当它被添加到场景它总是默认为 0,0 位置,我很沮丧,我添加了各种节点而没有发生任何事件,只是添加了一些关于这个节点的东西,它只是不工作,无法弄清楚有什么不同或为什么。

【问题讨论】:

  • 尝试:在分配身体/创建精灵子类之前没有物理身体/设置位置并覆盖 setPosition 并设置断点以验证没有其他代码正在设置位置
  • 取出行“node.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:node.size];”似乎缓解了这个问题,但我不明白为什么......我正在创建一个大小与我创建的每个节点一样大的物理体,并且没有任何问题......我不明白为什么在这种情况下会导致它忽略位置...非常非常奇怪。
  • 它可能被其他物体挤压,因此被接触解析器移动,或者它可能因为 dynamic=no 而不允许改变位置,你可以尝试使用边缘循环/链体,因为它们是真正的静态身体
  • 我添加的位置没有与任何东西接触屏幕上的任何东西,因为物理引擎认为它没有大小的身体......所以虽然它解决了位置问题,但它现在给我留下了一个没有任何东西可以交互的对象。
  • 所以,我注释掉了物理体,让节点出现在我想要的位置,然后在添加到父节点之后我添加了一个:[node setPhysicsBody: [SKPhysicsBody bodyWithRectangleOfSize:node.size] ];这似乎可行,但天哪,这是一个来自地狱的杂物,我正在处理一个操作命令来使这项工作......这对我来说没有意义。

标签: ios position sprite-kit sknode


【解决方案1】:

我也遇到了同样的问题。我有一个 SKSpriteNode 的子类,我的大多数游戏内节点都将其用作超类。我添加了这个方法,每当我遇到定位问题时都会使用它:

- (void)refreshPhysicsBodyAndSetPosition:(CGPoint)position {

    /*
     * Weird thing here: if I just set the position of these nodes, they
     * end up at position (0,0). However, if I remove the physics body, set
     * the position, and then re-add the physics body, the nodes are
     * placed correctly.
     */

    SKPhysicsBody *tempPhysicsBody = self.physicsBody;
    self.physicsBody = nil;

    // Position and re-add physics body
    self.position = position;
    self.physicsBody = tempPhysicsBody;
}

显然,这不是问题的真正答案,但它是一种可能对你们中的一些人有所帮助的解决方法。我在 Apple 开发者论坛上提出了一个问题,您可以在此处查看:

https://devforums.apple.com/thread/222332

希望我能尽快收到回复。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-28
    • 2023-03-15
    • 2018-01-29
    • 1970-01-01
    相关资源
    最近更新 更多