SKSpriteKit - 在调用 didBeginContact 时重新定位移动对象

Posted

技术标签:

【中文标题】SKSpriteKit - 在调用 didBeginContact 时重新定位移动对象【英文标题】:SKSpriteKit - repositioning a moving object when didBeginContact is called 【发布时间】:2014-09-30 17:43:22 【问题描述】:

目前,我有一个盒子(iPhone 大小,里面有一个弹跳的球。当它碰到墙的边界时,它会按预期反弹。

现在我想做的是当球向左移动并撞到左墙时,我希望它出现在右侧并继续向左移动。此外,如果球向右移动并撞到右侧的墙壁,那么它应该出现在左侧,仍然向右移动。 (就像旧的小行星游戏一样)

我认为我可以使用 didBeginContact 并简单地更改位置。问题是使用 setPosition: 改变位置实际上并没有改变它。如果我使用 moveTOx:,它确实有效,那么问题是球不能移动到右边缘,因为调用右侧的 didBeginContact 被调用并且它被移回左侧。

球应该从一个边缘平稳地移动到下一个边缘。也许 didBeginContact 不是这样做的正确位置。

有什么建议吗?我无法想象这是一个独特的问题......

【问题讨论】:

【参考方案1】:

我找到了解决方案 (https://github.com/macshome/RockBuster/tree/master),它是:

// Create a method to be called from the update:
-(void)update:(NSTimeInterval)currentTime 
    /* Called before each frame is rendered */
    [self updateSpritePositions];


// In your method, iterate through your objects and set the position:
- (void)updateSpritePositions 
    [self enumerateChildNodesWithName:@"ball" usingBlock:^(SKNode *node, BOOL *stop) 

        //  Get the current position
        CGPoint nodePosition = CGPointMake(node.position.x, node.position.y);

        //  If we've gone beyond the edge warp to the other side.
        if (nodePosition.x > (CGRectGetMaxX(self.frame) + 20)) 
            node.position = CGPointMake((CGRectGetMinX(self.frame) - 10), nodePosition.y);
        

        if (nodePosition.x < (CGRectGetMinX(self.frame) - 20)) 
            node.position = CGPointMake((CGRectGetMaxX(self.frame) + 10), nodePosition.y);
        

        if (nodePosition.y > (CGRectGetMaxY(self.frame) + 20)) 
            node.position = CGPointMake(nodePosition.x, (CGRectGetMinY(self.frame) - 10));
        

        if (nodePosition.y < (CGRectGetMinY(self.frame) - 20)) 
            node.position = CGPointMake(nodePosition.x, (CGRectGetMaxY(self.frame) + 10));
        

    ];


【讨论】:

您可以通过使用节点的大小属性而不是硬编码值来概括代码。 当然,感谢您的建议。一旦我让这个工作完美,我就会这样做。

以上是关于SKSpriteKit - 在调用 didBeginContact 时重新定位移动对象的主要内容,如果未能解决你的问题,请参考以下文章

使用SKSpriteNode physicsBody创建墙/障碍

加入后奇怪的 SKPhysicsWorld 行为

Swift:使用 StoryBoards 和 UIViewControllers 在 GameScene 中满足条件后返回主菜单?

XCode Spritekit,与 png 的不透明部分发生碰撞

在节点的右边缘而不是在中心旋转 SKSpriteNode

是否可以在使用 SpriteKit 的应用程序上使用 Xcode UI 测试?