2016-06-09 16 views
0

Ich beginne gerade im Sprite-Kit und habe eine Straßensperre getroffen. Ich versuche, die alten Atari-Spiel-Asteroiden nachzustellen. Ich versuche gerade herauszufinden, wie man den Knoten "Schiff" von einer Seite des Bildschirms bewegt und die gegenüberliegende Seite herauskommt. Ein Beispiel hierfür wäre Pacman, der von der rechten Seite des Bildschirms auf die linke Seite des Bildschirms geht. Hilfe wird sehr geschätzt. Vielen Dank im Voraus, JaredWie mache ich einen Knoten von einer Seite des Bildschirms zum anderen gehen?

 import SpriteKit 

     class GameScene: SKScene, SKPhysicsContactDelegate{ 

     let base = SKSpriteNode(imageNamed: "Base") 
     let ball = SKSpriteNode(imageNamed: "Ball") 
     let ship = SKSpriteNode(imageNamed: "Ship") 
     let shoot = SKSpriteNode(imageNamed: "shootButton") 

     override func didMoveToView(view: SKView){ 

    //  var DynamicView=UIView(frame: CGRectMake(100, 200, 100, 100)) 
    //  DynamicView.backgroundColor=UIColor.greenColor() 
    //  DynamicView.layer.cornerRadius=2 
    //  DynamicView.layer.borderWidth=2 
    //  self.view!.addSubview(DynamicView) 

     self.anchorPoint = CGPointMake(0.5, 0.5) 

     self.physicsWorld.contactDelegate = self 
     self.physicsWorld.gravity = CGVectorMake(0.0, 0.0) 

     self.addChild(base) 
     base.position = CGPointMake(-350, -200) 

     self.addChild(shoot) 
     shoot.position = CGPointMake(350, -200) 

     self.addChild(ball) 
     ball.position = base.position 

     self.addChild(ship) 
     ship.position = CGPointMake(20, 47) 
     ship.xScale = 0.7 
     ship.yScale = 0.7 

     ship.physicsBody?.dynamic = true 
     ship.physicsBody?.allowsRotation = true 
     ship.physicsBody?.affectedByGravity = true 
     ship.physicsBody = SKPhysicsBody(texture: SKTexture(imageNamed: "Ship"), size: ship.size) 


     self.physicsBody = SKPhysicsBody(edgeLoopFromRect: self.frame) 



     ball.alpha = 0.4 
     base.alpha = 0.4 


    } 





// func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) { 
//  /* Called when a touch begins */ 
//   
//  for touch in (touches as! Set<UITouch>) { 
//   let location = touch.locationInNode(self) 
//    
//    
//     } 
// } 



    override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) { 
     for touch in (touches) { 
      let location = touch.locationInNode(self) 

      let v = CGVector(dx: location.x - base.position.x, dy: location.y - base.position.y) 
      let angle = atan2(v.dy, v.dx) 

      let deg = angle * CGFloat(180/M_PI) 


//   print(deg + 180) 


      let length:CGFloat = base.frame.size.height/2 

      let xDist:CGFloat = sin(angle - 1.57079633) * length 
      let yDist:CGFloat = cos(angle - 1.57079633) * length 

      ball.position = CGPointMake(base.position.x - xDist, base.position.y + yDist) 

      if CGRectContainsPoint(base.frame, location) { 
       ball.position = location 
       } 
       else{ 
       ball.position = CGPointMake(base.position.x - xDist, base.position.y + yDist) 
       } 
     ship.zRotation = angle - 1.57079633 

      ship.physicsBody?.mass = 2 




      var shipRotation : CGFloat = ship.zRotation 
      var calcRotation : Float = Float(angle - 1.57079633) + Float(M_PI_2); 

      let intensity : CGFloat = 2000.0 // put your value 
      let xVelocity = intensity * CGFloat(cosf(calcRotation)) 
      let yVelocity = intensity * CGFloat(sinf(calcRotation)) 
      let vector : CGVector = CGVectorMake(xVelocity, yVelocity) 

      //Apply force to spaceship 
      ship.physicsBody?.applyForce(vector) 


     } 

    } 

    override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) { 


     let move:SKAction = SKAction.moveTo(base.position, duration: 0.2) 
     move.timingMode = .EaseOut 
     ball.runAction(move) 


    } 
} 

// overridefunc update(currentTime: CFTimeInterval) { 
//  /* Called before each frame is rendered */ 
//  
//} 
+1

Was fragen Sie genau? Bitte fügen Sie weitere Details hinzu. – Laurel

Antwort

0

Es sieht aus wie Sie Physik verwenden, das Schiff zu bewegen (im Gegensatz seine Position in der update() Methode um einen bestimmten Betrag der Aktualisierung)

Was könnten Sie Do ist, die didiSimulatePhysics() Methode zu überschreiben (die aufgerufen wird, nachdem die SpriteKit-Spiel-Engine alle Physik-Berechnungen durchgeführt und alle Knoten verschoben hat) und wenn Ihr Schiff außerhalb des Bildschirms ist (was Sie tun könnten, indem Sie sehen, ob seine Position außerhalb der x-Position des Screns liegt) & y Grenzen oder durch Verwendung der recturesRect-Methode, um zu sehen, ob. Der Rahmen des Schiffs überlappt nicht mehr mit t er Bildschirmrahmen) und wenn es ist, wickeln Sie es einfach auf die andere Seite des Bildschirms.

0

In func update(currentTime) prüfen, ob ship.position.x < 0 oder ship.position.x > scene.width. Wenn true, setzen Sie ship.position.x auf die gegenüberliegende Seite.

+0

Vielen Dank für Ihren Rat. Ich werde es ausprobieren. Sehr geschätzt, –