2015-03-04 10 views
1

Dans mon jeu j'ai 2 sprites, une balle et une pagaie. J'essaie de restreindre l'angle de réflexion de manière à ce qu'il ne frappe pas et ne soit pas horizontal. J'utilise ce code pour vérifier l'angle de contact:Changer la direction et non la vitesse dans SpriteKit (swift)

  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") 
      } 

Comment puis-je changer l'angle lorsque la balle rebondit sans changer la vitesse?

(Je suis nouveau kit de sprite alors laissez-moi savoir si je suis absent des détails)

Répondre

0

Vous pouvez utiliser la propriété zRotation de l'image-objet et définir un nouvel angle:

yourBody.zRotation = yournewAngle 
+0

Pour une raison qui jette mon jeu, je ne sais pas trop pourquoi, mais je suis en train de regarder. Existe-t-il un moyen d'utiliser applyImpulse ou quelque chose de similaire? – inVINCEable

+0

Mise à jour sur cela, zRotation est toujours 0.0 peu importe quel est l'angle – inVINCEable

1

Probablement pas la meilleure façon de le faire, mais cela fonctionne pour l'instant:

  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)) 
      } 
1

Le tutoriel de Break Wenderlich Breakout a quelques idées utiles. D'abord, réalisez que si la balle est trop horizontale, la vélocité dx a déjà changé - c'est trop bas. Dans ce cas, donnez-lui un coup de pouce dans la direction x. La même chose est vraie si la vitesse de dy est trop basse - maintenant il rebondit d'un côté à l'autre et n'obtient nulle part alors donnez-lui un coup de pouce dans la direction y. Enfin, vérifiez la vitesse globale de la balle - si elle est trop élevée, ralentissez-la. Cet exemple est dans la méthode didBegin pour ajuster la balle comme elle rebondit sur la palette:

// 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 
} 

Bien sûr, les chiffres devront être ajustés en fonction des caractéristiques de votre balle.