ios – Swift Physics:碰撞时的角度计算错误

前端之家收集整理的这篇文章主要介绍了ios – Swift Physics:碰撞时的角度计算错误前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个简单的SpriteKit应用程序,带有墙壁和球.两者都设置了SKPhysicsBody.

当我向一个方向施加力时,我希望球在碰撞时以相同的角度在墙壁上反射,但方向相反.

但有时我看到角度很奇怪.我使用了所有的physicsBody属性,但是无法修复它.有时第一次反射看起来很好,但是第三次​​或第六次反射,有时第一次反射是错误的角度.

我从不同的帖子中读到,人们有点自我计算的“正确方向”.但我无法想象SpriteKits的物理引擎无法做到这一点.

检查我的附图,了解我的意思.有人可以帮忙吗?我不想开始使用Box2d for Swift,因为看起来我很难融入Swift.

这是我的GameScene.swift文件中的physicsWorld init,其中所有元素都添加到:

  1. self.physicsWorld.gravity = CGVectorMake(0,0)

添加我的所有代码太多了,所以我添加了重要的部分.希望它足以分析.所有元素,如球,墙都是SKSpriteNode

这是球的physicsBody代码

  1. self.physicsBody = SKPhysicsBody(circleOfRadius: Constants.Config.playersize+self.node.lineWidth)
  2. self.physicsBody?.restitution = 1
  3. self.physicsBody?.friction = 0
  4. self.physicsBody?.linearDamping = 1
  5. self.physicsBody?.allowsRotation = false
  6. self.physicsBody?.categoryBitMask = Constants.Config.PhysicsCategory.Player
  7. self.physicsBody?.collisionBitMask = Constants.Config.PhysicsCategory.Wall | Constants.Config.PhysicsCategory.Enemy
  8. self.physicsBody?.contactTestBitMask = Constants.Config.PhysicsCategory.Wall | Constants.Config.PhysicsCategory.Enemy

这是墙的物理体:

  1. el = SKSpriteNode(color: UIColor.blueColor(),size: CGSize(width: Constants.Config.wallsize,height: Constants.Config.wallsize))
  2. el.physicsBody = SKPhysicsBody(rectangleOfSize: CGSize(width: Constants.Config.wallsize,height: Constants.Config.wallsize))
  3. el.physicsBody?.dynamic = false
  4. el.physicsBody?.categoryBitMask = Constants.Config.PhysicsCategory.Wall
  5. el.physicsBody?.collisionBitMask = Constants.Config.PhysicsCategory.Player
  6. el.physicsBody?.contactTestBitMask = Constants.Config.PhysicsCategory.Player

最后,我只是在球物理实体上调用applyImpulse函数,使其在物理模拟中移动.

另请检查我附加的第二张图片/ gif.它使用简单的skphysics应用程序显示边缘碰撞问题,没有任何特殊参数化.只是一个带有球的矩形,一个矢量用作冲动.

使用appzYourLife的解决方案继承我完整的非工作代码.

  1. class GameScene: SKScene {
  2. private var ball:SKShapeNode!
  3. override func didMoveToView(view: SKView) {
  4. let screen = UIScreen.mainScreen().bounds
  5. let p = UIBezierPath()
  6. p.moveToPoint(CGPointMake(0,0))
  7. p.addLineToPoint(CGPointMake(screen.width,screen.height))
  8. p.addLineToPoint(CGPointMake(0,screen.height))
  9. p.closePath()
  10. let shape = SKShapeNode(path: p.CGPath)
  11. shape.physicsBody = SKPhysicsBody(edgeLoopFromPath: p.CGPath)
  12. shape.physicsBody?.affectedByGravity = false
  13. shape.physicsBody?.dynamic = false
  14. shape.strokeColor = UIColor.blackColor()
  15.  
  16. self.addChild(shape)
  17.  
  18. ball = SKShapeNode(circleOfRadius: 17)
  19. ball.name = "player"
  20. ball.position = CGPoint(x: 20,y: 20)
  21. ball.fillColor = UIColor.yellowColor()
  22. ball.physicsBody = SKPhysicsBody(circleOfRadius: 17)
  23. ball.physicsBody?.angularDamping = 0
  24. ball.physicsBody?.linearDamping = 0
  25. ball.physicsBody?.restitution = 1
  26. ball.physicsBody?.friction = 0
  27. ball.physicsBody?.allowsRotation = false
  28.  
  29. self.addChild(ball)
  30. self.ball.physicsBody?.applyImpulse(CGVector(dx: 2.4,dy: 9.7))
  31. }

我刚刚意识到我的球精灵的质量和密度是零.为什么?即使设置它也保持为零.

解决方法

  1. Since i cannot imagine this is some unknown bug in SpriteKits physics engine,i very hope someone can help me here as this is a full stopper for me.

它是SpriteKits物理引擎中的(已知)错误.但有时只是玩这些值会使这个错误消失 – 例如,每当它撞到墙壁时,尝试改变球的速度(即使是小值).

此处列出了另一种解决方
SpriteKit physics in Swift – Ball slides against wall instead of reflecting

(与你的问题相同,已经从2014年开始,仍未解决..)

猜你在找的iOS相关文章