2015-07-26 5 views
2

Я пытаюсь создать механизм Sling shot, где я вращаю узел с объектом, прикрепленным в конце. Рогатка начинается с касания и удерживания взаимодействия для поворота объекта и при отпускании, запускает объект, прикрепленный в конце. - Аналогичный эффект наблюдается. hereКак создать механизм рогатки в Swift, SpriteKit

Это мой код для вращения, которое сработало. Не знаете, как начать сращивание и сборку.

вар touchingScreen = ложь

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) { 
    super.touchesBegan(touches, withEvent: event) 
    touchingScreen = true 
    println("Screen Touched") 
} 

override func touchesCancelled(touches: Set<NSObject>!, withEvent event: UIEvent!) { 
    super.touchesCancelled(touches, withEvent: event) 
    touchingScreen = false 
    println("Screen Not Touched") 
} 

override func touchesEnded(touches: Set<NSObject>, withEvent event: UIEvent) { 
    super.touchesEnded(touches, withEvent: event) 
    touchingScreen = false 
    println("Screen Not Touched") 
} 

override func update(currentTime: CFTimeInterval) { 

    if touchingScreen { 

     var RotatingAngle = CGFloat(M_PI) 
     var rotationDuration = 20.0 
     var rotateCanon = SKAction.rotateByAngle(CGFloat(RotatingAngle), duration: rotationDuration) 
     canon.runAction(rotateCanon) 

    } else if !touchingScreen { 


     var RotatingAngleTwo = CGFloat(0) 
     var rotationDurationTwo = 0.0 
     var rotateCanon = SKAction.rotateByAngle(CGFloat(RotatingAngleTwo), duration: rotationDurationTwo) 
     canon.runAction(rotateCanon) 
    } 

} 

Спасибо за помощь.

+0

ли вы решить эту проблему? У меня может быть решение. – 0x141E

+0

@ 0x141E Пока нет. Поделись, пожалуйста. ;) – Gugulethu

ответ

1

Некоторые мысли ...

  1. Это довольно просто реализовать рогатки, как показано на видео, если разбить его на более мелкие шаги
  2. Если вы представляете положение шара по окружности с полярными координатами , вы можете вращать шар, просто увеличивая угол с течением времени, а затем переходя от полярных координат к декартовым координатам.
  3. При запуске траектория шара должна касаться положения шара по кругу и его скорость должна быть такой же, как и ее угловой скорость.

и некоторый код ...

enum State { 
    case Stopped 
    case Rotating 
    case Launched 
} 

let two_pi = CGFloat(M_PI*2.0) 
let pi = CGFloat(M_PI) 

// These are useful vector/point operators 
func * (left:CGPoint, right:CGFloat) -> CGPoint { 
    return CGPointMake(left.x*right, left.y*right) 
} 

func += (inout left:CGPoint, right:CGPoint) { 
    left = CGPointMake(left.x+right.x, left.y+right.y) 
} 

func * (left:CGVector, right:CGFloat) -> CGVector { 
    return CGVectorMake(left.dx*right, left.dy*right) 
} 

func/(left:CGVector, right:CGFloat) -> CGVector { 
    return CGVectorMake(left.dx/right, left.dy/right) 
} 

class GameScene: SKScene { 
    let shape = SKShapeNode(circleOfRadius: 7) 
    let radius:CGFloat = 30 
    var center = CGPointZero 
    var currentAngle = -pi/2 
    let angleIncr = two_pi/60.0 
    var state:State = .Stopped 

    override func didMoveToView(view: SKView) { 
     scaleMode = .ResizeFill 
     // Set the center of the sling 
     center = CGPointMake (CGRectGetMidX(view.frame),CGRectGetMidY(view.frame)) 
     addBall() 
     let circle = SKShapeNode(circleOfRadius: radius) 
     circle.position = CGPointMake (CGRectGetMidX(view.frame),CGRectGetMidY(view.frame)) 
     addChild(circle) 
    } 

    // Adds a circle shape node at the bottom of the sling 
    func addBall() { 
     currentAngle = -pi/2 
     shape.fillColor = SKColor.blueColor() 
     shape.position = CGPointMake (center.x, center.y-radius) 
     shape.physicsBody = SKPhysicsBody(circleOfRadius: 7) 
     shape.physicsBody?.affectedByGravity = false 
     shape.physicsBody?.mass = 0.5 
     shape.zPosition = 1 
     addChild(shape) 
    } 

    override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) { 
     if let touch = touches.first as? UITouch { 
      let location = touch.locationInNode(self) 
      if (state == .Stopped) { 
       // Start rotating the ball around the sling 
       state = .Rotating 
      } 
     } 
    } 

    override func touchesEnded(touches: Set<NSObject>, withEvent event: UIEvent) { 
     if (state == .Rotating) { 
      // Launch the ball on a vector tangent to its current position on the circle 
      state = .Launched 
      // Normal vector 
      var normal = CGVectorMake(shape.position.x-center.x, shape.position.y-center.y) 
      normal = normal/magnitude(normal) 
      // Tangent vector 
      let vector = CGVectorMake(normal.dy, -normal.dx) 
      // Convert angular to linear speed 
      let speed = angleIncr * 60.0 * radius 
      shape.physicsBody?.velocity = vector*speed 

      runAction(SKAction.waitForDuration(1.0)) { 
       self.shape.removeFromParent() 
       self.state = .Stopped 
       self.addBall() 
      } 
     } 
    } 

    override func update(currentTime: CFTimeInterval) { 
     switch (state) { 
     case .Rotating: 
      var point = angleToPoint(currentAngle) * radius 
      point += center 
      shape.position = point 
      currentAngle -= angleIncr 
      // Wrap at 2 pi 
      currentAngle %= two_pi 
     default: 
      break 
     } 
    } 

    func angleToPoint(angle:CGFloat) -> CGPoint { 
     return CGPointMake(cos(angle), sin(angle)) 
    } 

    func magnitude(v1:CGVector) -> CGFloat { 
     return sqrt(v1.dx*v1.dx+v1.dy*v1.dy) 
    } 
} 

и видео ...

enter image description here

+0

Работал как шарм. Я думаю, что я решал проблему с неправильного угла и не рассматривал полярные координаты. ;) – Gugulethu