ios - SpriteKit 接触检测有轻微延迟
问题描述
我正在创建一个小游戏,球需要在上、左和右墙上反弹,而它应该在触地时立即停止。
我已经有一个有效的接触检测代码和委托,它在正确的情况下和正确的时间被调用。在找到的碰撞点中创建一个小圆圈func didBegin(_ contact: SKPhysicsContact)
会在正确的位置创建节点。
在我调用的相同方法ball.physicsBody?.velocity = .zero
中ball.position = contact.contactPoint
,球正确地停止了。问题是,有时球已经从地板上弹起后,太晚才停下来。
球的恢复值为 1,因为我希望它在不减速的情况下反弹,除非在触地时。
我已经尝试将位置设置为零,速度设置为零,其isDynamic
属性设置为 false。这些尝试中的每一个都做了它应该做的事情,但有时它发生得太晚了。球和地板的usesPreciseCollisionDetection
属性都设置为true
。
如果我尝试添加一些人为延迟,则会再次调用联系方法(破坏部分游戏玩法)。
这是我的球节点的代码:
class Ball: SKSpriteNode {
convenience init() {
self.init(imageNamed: "earth")
physicsBody = SKPhysicsBody(circleOfRadius: 12.5)
physicsBody?.usesPreciseCollisionDetection = true
physicsBody?.categoryBitMask = Masks.ball
physicsBody?.contactTestBitMask = Masks.floor
physicsBody?.allowsRotation = false
physicsBody?.restitution = 1
physicsBody?.friction = 0
physicsBody?.angularDamping = 0
physicsBody?.linearDamping = 0
}
}
这是我的didBegin
方法的代码:
func didBegin(_ contact: SKPhysicsContact) {
ball.physicsBody?.velocity = .zero
ball.position = contact.contactPoint
}
我希望球在仍然接触地板时停止,而不是在它已经反弹后的一帧。
解决方案
推荐阅读
- php - ldap_add symfony : 服务器不愿意执行
- javascript - 类型错误:_dataProvider_server_rest__WEBPACK_IMPORTED_MODULE_3 react-admin,strapi
- javascript - 反应原生的pots API [object object]
- python - Python:使用检查制作函数签名
- igraph - 将 iGraph 转换为 gexf 对象时出现数据框错误
- ruby-on-rails - Ruby MVC 和 text_field
- laravel - 如何解决 Laravel 中未定义的索引?
- python - 汇总 Pandas DataFrame 中因子水平的差异?
- reactjs - 在具有快速后端的反应应用程序上使用 Nginx 中的反向代理
- json - 在 mongoDb 中使用聚合、graphLookup 和管道进行查询