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创建墙/障碍
Swift:使用 StoryBoards 和 UIViewControllers 在 GameScene 中满足条件后返回主菜单?