为了检测所有节点是否正在休眠,我检查他们的physicsBody.resting属性.
在更新方法中,我打印出结果.
import SpriteKitclass 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") } }}总结
以上是内存溢出为你收集整理的swift – Sprite Kit physicsBody.resting行为全部内容,希望文章能够帮你解决swift – Sprite Kit physicsBody.resting行为所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)