【问题标题】:Change direction not velocity in SpriteKit (swift)在 SpriteKit 中改变方向而不是速度(快速)
【发布时间】:2015-03-04 14:12:41
【问题描述】:

在我的游戏中,我有 2 个精灵,一个球和一个桨。我试图限制反射的角度,这样它就不会撞击并水平移动。我正在使用此代码检查接触角:

            var impactX = contact.contactNormal.dx
            var impactY = contact.contactNormal.dy

            var radiansCon: Double = Double(atan((contact.contactNormal.dy / contact.contactNormal.dx)))
            var angleCon = Double(radiansCon * 180) / M_PI
            //println("Bounce Angle:\(angleCon)")

            if(angleCon < 60 && angleCon > 0) {
                println("Adjust angle Positive")
            } else if (angleCon > -60 && angleCon < 0) {
                println("Adjust angle Negative")
            }

如何在不改变速度的情况下改变球反弹时的角度?

(我是 sprite kit 的新手,所以如果我遗漏任何细节,请告诉我)

【问题讨论】:

    标签: iphone swift sprite-kit skphysicsbody skphysicscontact


    【解决方案1】:

    可能不是最好的方法,但现在可以:

                var impactX = contact.contactNormal.dx
                var impactY = contact.contactNormal.dy
    
                var radiansCon: Double = Double(atan((contact.contactNormal.dy / contact.contactNormal.dx)))
                var angleCon = Double(radiansCon * 180) / M_PI
                if(angleCon < 60 && angleCon > 0) {
                    var newX = CGFloat(0.5)
                    var newY = CGFloat(0.85)
                    self.ball.body.applyImpulse(CGVectorMake(newX, newY))
                } else if (angleCon > -60 && angleCon < 0) {
                    var newX = CGFloat(-0.5)
                    var newY = CGFloat(0.85)
                    self.ball.body.applyImpulse(CGVectorMake(newX, newY))
                }
    

    【讨论】:

      【解决方案2】:

      Ray Wenderlich 的 Breakout 教程提供了一些有用的想法。首先,意识到如果球太水平,dx 速度已经改变了——它太低了。在这种情况下,在 x 方向轻推它。如果 dy 速度太低,情况也是如此——现在它从一边弹到另一边,没有到达任何地方,所以在 y 方向轻推它。最后,检查球的整体速度——如果太高,就放慢速度。这个例子是在 didBegin 方法中调整球从桨上反弹的:

      // Get the absolute value of dx and dy
      let dxSpeed = fabs(CGFloat((ball.physicsBody?.velocity.dx)!))
      let dySpeed = fabs(CGFloat((ball.physicsBody?.velocity.dy)!))
      
      let speed = sqrt(dxSpeed + dySpeed)
      
      if dxSpeed <= 250.0 {
          ball.physicsBody?.applyImpulse(CGVector(dx: -20.0, dy: 0.0))
      }
      
      if dySpeed <= 250.0 {
          ball.physicsBody?.applyImpulse(CGVector(dx: 0.0, dy: 20.0))
      }
      
      if speed > maxSpeed {
          ball.physicsBody?.linearDamping = 0.1
      } else {
          ball.physicsBody?.linearDamping = 0.0   
      }
      

      当然,数字必须根据您的球的特性进行调整。

      【讨论】:

        【解决方案3】:

        您可以使用精灵的zRotation 属性并设置新的角度:

        yourBody.zRotation = yournewAngle
        

        【讨论】:

        • 由于某种原因导致我的游戏中断,我不太清楚为什么,但我正在调查。有没有办法使用 applyImpulse 或类似的东西?
        • 更新,无论角度如何,zRotation 始终为 0.0
        猜你喜欢
        • 1970-01-01
        • 2021-10-03
        • 1970-01-01
        • 2015-05-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多