我正在使用Swift和Sprite Kit在XCode Beta 6上开发游戏。为了检测所有节点是否都在休眠,我检查了它们的physicsBody.resting属性。在更新方法中,我打印出结果。
import SpriteKit class GameScene: SKScene, SKPhysicsContactDelegate { var hero:SKSpriteNode! override func didMoveToView(view: SKView) { self.physicsWorld.gravity = CGVectorMake(0, 0) self.physicsWorld.contactDelegate = self self.physicsBody = SKPhysicsBody(edgeLoopFromRect:self.frame) hero = SKSpriteNode(imageNamed: "Spaceship") hero.position = CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame)) hero.zPosition = 10.0 hero.physicsBody = SKPhysicsBody(circleOfRadius: hero.size.width/2) hero.physicsBody.allowsRotation = false hero.physicsBody.linearDamping = 0.5 self.addChild(hero) } override func update(currentTime: CFTimeInterval) { if hero.physicsBody.resting { println("resting") } else { println("moving") } } }
令我惊讶的是,结果是:
动静(n次相同)动静
那英雄为什么要动弹,尽管我什么也没做。节点移动N次并休息一下(休息),然后继续移动。
谁能解释这种行为?那是一个错误还是我错过了什么?提前致谢。
如果您检查一个物理物体的速度,您会发现它确实在运动,但是其速度是不可察觉的。这就是为什么未设置静止属性的原因。检查SKPhysicsBody是否静止的一种更可靠的方法是测试其线速度和角速度是否接近零。这是有关此操作的示例:
func speed(velocity:CGVector) -> Float { let dx = Float(velocity.dx); let dy = Float(velocity.dy); return sqrtf(dx*dx+dy*dy) } func angularSpeed(velocity:CGFloat) -> Float { return abs(Float(velocity)) } // This is a more reliable test for a physicsBody at "rest" func nearlyAtRest(node:SKNode) -> Bool { return (self.speed(node.physicsBody.velocity)<self.verySmallValue && self.angularSpeed(node.physicsBody.angularVelocity) < self.verySmallValue) } override func update(_ currentTime: TimeInterval) { /* Enumerate over child nodes with names starting with "circle" */ enumerateChildNodesWithName("circle*") { node, stop in if (node.physicsBody.resting) { println("\(node.name) is resting") } if (self.nearlyAtRest(node)) { println("\(node.name) is nearly resting") } } }