使用物理 SKSpriteNode 子级暂停 SpriteKit 游戏

Posted

技术标签:

【中文标题】使用物理 SKSpriteNode 子级暂停 SpriteKit 游戏【英文标题】:Pause SpriteKit game with Physics SKSpriteNode child 【发布时间】:2014-03-09 12:11:05 【问题描述】:

我在SKNode *_fgLayer 上有一个带有动态物理体的 SKSpriteNode。

现在,当我暂停或取消暂停游戏时,我希望 SKSpriteNode 保持在原位,而不是旋转或掉落。如果我只是使用_fgLayer.paused = YES;,SKSpriteNode 不会停留在原地,而是会旋转并掉落。如果我在暂停时设置physicsBody.dynamic = NO;,在取消暂停时设置physicsBody.dynamic = YES;,它可以工作。

但是,经过几次尝试后,我总是遇到以下崩溃:

"Assertion failed: (typeA == b2_dynamicBody || typeB == b2_dynamicBody), function SolveTOI, file /SourceCache/PhysicsKit/PhysicsKit-4.6/PhysicsKit/Box2D/Dynamics/b2World.cpp, line 670."

所以,我猜设置 physicsBody.dynamic = NO; 并返回是行不通的。

有没有人知道如何在游戏暂停时暂停动态物理实体以保持原位?

【问题讨论】:

我认为你应该在这里使用 sprite.speed = 0.0。 或者尝试设置scene.physicsWorld.speed = 0.0 (developer.apple.com/Library/ios/documentation/SpriteKit/…) 更新:一种解决方法是使影响 phsyicsBody 节点的所有方面保持稳定。我使用以下代码暂停和取消暂停类似的代码:_fish.physicsBody.affectedByGravity = NO; _fish.physicsBody.allowsRotation = 否; _fish.physicsBody.velocity = CGVectorMake(0, 0); _fish.physicsBody.angularVelocity = 0; scene.physicsWorld.speed = 0.0 做得很好!谢谢! 【参考方案1】:

尝试将physicsWorld.speed 设置为0.0:

scene.physicsWorld.speed = 0.0

Apple SKPhysicsWorld Ref.

【讨论】:

以后怎么恢复?当你想恢复时,你重置到什么速度? 我的错,我刚刚阅读了苹果的文档。可以设置 scene.physicsWorld.speed = 1.0 来恢复。 1表示正常速度,2表示正常速度的两倍。【参考方案2】:

设置 scene.view.paused = YES 对我有用 - 特别是在子节点上运行操作时。

self.scene.view setPaused:YES

【讨论】:

以上是关于使用物理 SKSpriteNode 子级暂停 SpriteKit 游戏的主要内容,如果未能解决你的问题,请参考以下文章

将 SKShapeNode 作为子级添加到 SKSpriteNode

在 SKScene 暂停时为 SKSpriteNode 的 alpha 设置动画

Spritekit 通过 touchesBegan 暂停和恢复 SKSpriteNode 的动作

在SKScene暂停时动画SKSpriteNode的alpha

未检测到 SKSpriteNode 触摸

SKSpriteNode 失去了它的物理体属性