当前位置: 首页 > 面试题库 >

Sprite Kit Physics身体休息行为

傅毅然
2023-03-14
问题内容

我正在使用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")
        }
    }
}


 类似资料:
  • 本文向大家介绍common-lisp 休息参数,包括了common-lisp 休息参数的使用技巧和注意事项,需要的朋友参考一下 示例 可以&REST在所需参数之后的关键字中给定一个单个剩余参数。如果存在这样的参数,则该函数可以使用多个参数,这些参数将被分组到其余参数的列表中。请注意,该变量CALL-ARGUMENTS-LIMIT确定可在函数调用中使用的最大参数数目,因此,参数数目限制为特定于实现的

  • 某些函数需要采用可变数量的参数。 例如,我们使用的format函数需要两个必需的参数,即流和控制字符串。 但是,在字符串之后,它需要可变数量的参数,具体取决于要在字符串中显示的值的数量。 类似地,+函数或*函数也可以采用可变数量的参数。 您可以使用符号&rest.提供此类可变数量的参数&rest. 以下示例说明了这一概念 - 例子 (Example) 创建一个名为main.lisp的新源代码文件,

  • 问题内容: 有谁知道Hibernate如何知道在调用时是要插入还是要更新数据库中的值? 到目前为止,我仅确定它不依赖于高速缓存中的信息,并且数据库中实体的存在由主键确定。 问题答案: 当您使用Hibernate时,将检查对象是否为瞬态对象(它没有标识符属性),如果是这样,它将通过生成标识符并将其分配给会话来使其持久化。如果对象已经具有标识符,它将执行。 从文档中: saveOrUpdate()执行

  • 问题内容: 我使用Hibernate 4和Spring 3。 我有两个实体。 图书实体 和作者实体 和JSON取决于pom.xml 我的根上下文在这里- … servlet-context.xml 控制器。 在我的DAO中找到findAll: 在调试中,我看到该方法返回2条记录,但是Spring无法将结果转换为JSON并返回406 HTTP错误。怎么了? 我附上我在调试中看到的图像。- http:

  • 这个神奇的暂停可以给读者一个休息的机会, 可能读者到了这里也会会心一笑吧. Linux同志们, 向你们致敬! 你正在阅读的这些东西, 将会给你们带来好运. 把这份文档发给你的10个朋友. 在拷贝这份文档之前, 在信的结尾写上一个100行的Bash脚本发送给列表上的第一个人. 然后在信的底部删除它们的名字并添加你自己的名字. 不要打断这个链条! 并且在48小时之内完成它. Brooklyn的Wilf

  • 问题内容: 我们知道有机管局非常好的功能SaveOrUpdate当我们通过任何物体这种方法,知道数据是或新的记录将在数据库中添加。这是功能同时有或在我的代码,我来处理呢? 问题答案: jOOQ也是一样。如果更改记录的主键,则它将使用,否则将使用。 实际上,当您从数据库中读取记录时,调用将触发您所期望的。如果创建新记录,则将对其进行编辑。 在2.6中,克隆记录然后要求jOOQ对其进行更新有些困难(因