使用物理 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 的动作