2016-03-30 9 views
2

Also experimentiere ich mit Sprite-Kit, um einen kreisförmigen Weg zu bauen, wo der Hauptcharakter folgen und Münzen sammeln kann. Ich habe meinen Charakter erfolgreich positioniert und ihn dazu gebracht, meinem kreisförmigen Weg zu folgen.Sprite-Kit: Wie man Sprites auf einer Kreisbahn positioniert

Was ich versuche ist folgendes zu erreichen:

  • rote Kugel ist die Hauptfigur [done]
  • weiß Polygone sind die Münzen

schema

// Adding the big circle 
let runway = SKSpriteNode(imageNamed: "runway") 
runway.position = CGPointMake(CGRectGetMidX(frame), CGRectGetMidY(frame)) 
addChild(runway) 
// Adding the player 
player = SKSpriteNode(imageNamed: "player") 
player.position = CGPointMake(CGRectGetMidX(frame) , (CGRectGetMidY(frame) + runway.size.width/2)) 
// Calculating the initial position of the player and creating a circular path around it 
let dx = player.position.x - frame.width/2 
let dy = player.position.y - frame.height/2 

let radian = atan2(dy, dx) 
let playerPath = UIBezierPath(
    arcCenter: CGPoint(x: CGRectGetMidX(frame), y: CGRectGetMidY(frame)), 
    radius: (runway.frame.size.width/2) - 20, 
    startAngle: radian, 
    endAngle: radian + CGFloat(M_PI * 4.0), 
    clockwise: true) 

let follow = SKAction.followPath(playerPath.CGPath, asOffset: false, orientToPath: true, speed: 200) 
player.runAction(SKAction.repeatActionForever(follow)) 

Mein Problem ist jetzt, wie man meine Münzen auf dem gleichen Weg positionieren kann? Gibt es eine Möglichkeit, ihre Positionen mit dem gleichen Pfad zu generieren, oder sollte ich für jede Münze einen bestimmten Pfad erstellen und den Pfad currentPoint jedes Mal extrahieren ??

Gibt es eine einfachere Möglichkeit, mein Problem zu lösen?

Dank

+0

Der Link zum Bild ist unterbrochen ... Sie können hinzufügen, wie und wo Sie den Pfad erstellen, um eine bessere Antwort zu erhalten. Aber im Allgemeinen müssen Sie wissen, wo sich die Mitte Ihrer kreisförmigen Bahn befindet und welchen Radius sie hat. Auf dieser Grundlage können Sie problemlos Punkte auf dem Umfang berechnen (was der tatsächliche Pfad ist, über den Sie sprechen). – Whirlwind

+0

Ich habe meinen ersten Post mit Code aktualisiert, in der Hoffnung, dass er anderen helfen könnte, mein Problem zu verstehen. Ich kann das Bild sehen und es ist nicht für mich gebrochen. Seltsam ?! –

+0

Ja, seltsam. Ich kann es weder vom Gerät noch vom Computer aus öffnen. Link in die Kommentare einfügen (wenn Sie möchten) ... Aktualisierter Code ist jedoch genug. – Whirlwind

Antwort

1

Wie ich schon sagte, müssen Sie wissen, wo das Zentrum des Pfades ist (in Ihrem Fall, dass CGPoint(x: frame.midX, y:frame.midY) ist die „Mitte“ des Bildschirms), und Sie haben den Radius zu kennen (Sie haben es berechnet bereits, wenn Sie den Pfad war die Schaffung), und Sie müssen einen Winkel, dass der Strahl von der Mitte (frame.midX,frame.midY) bis zu dem Punkt an dem Umfang macht (coinX,coinY) mit positiven x-Achse:

import SpriteKit 

class GameScene: SKScene { 

    let player = SKSpriteNode(color: .purpleColor(), size: CGSize(width: 30, height: 30)) 

    override func didMoveToView(view: SKView) { 
     /* Setup your scene here */ 

     // Adding the big circle 
     let runway = SKSpriteNode(color: .orangeColor(), size: CGSize(width: 150, height: 150)) 
     runway.position = CGPointMake(CGRectGetMidX(frame), CGRectGetMidY(frame)) 
     addChild(runway) 
     // Adding the player 

     player.position = CGPointMake(CGRectGetMidX(frame) , (CGRectGetMidY(frame) + runway.size.width/2)) 
     addChild(player) 
     // Calculating the initial position of the player and creating a circular path around it 
     let dx = player.position.x - frame.width/2 
     let dy = player.position.y - frame.height/2 

     let radius = (runway.frame.size.width/2) - 20.0 

     let radian = atan2(dy, dx) 
     let playerPath = UIBezierPath(
      arcCenter: CGPoint(x: CGRectGetMidX(frame), y: CGRectGetMidY(frame)), 
      radius: radius, 
      startAngle: radian, 
      endAngle: radian + CGFloat(M_PI * 4.0), 
      clockwise: true) 

     let follow = SKAction.followPath(playerPath.CGPath, asOffset: false, orientToPath: true, speed: 200) 
     player.runAction(SKAction.repeatActionForever(follow)) 

     let numberOfCoins = 8 
     for i in 0...numberOfCoins { 

      let coin = SKSpriteNode(color: .yellowColor(), size: CGSize(width: 10, height: 10)) 

      let angle = 2 * M_PI/Double(numberOfCoins) * Double(i) 

      let coinX = radius * cos(CGFloat(angle)) 
      let coinY = radius * sin(CGFloat(angle)) 

      coin.position = CGPoint(x:coinX + frame.midX, y:coinY + frame.midY) 
      addChild(coin) 
     } 
    } 
} 

Nur eine Bemerkung am Rande: In Sprite-Kit der Winkel von 0 Radianten gibt die positive x-Achse an. Und der positive Winkel ist im Gegenuhrzeigersinn. Die Quelle - Building Your Scene.

+0

Danke Mann. Ich schätze es wirklich. –

+0

Der Link zu "Building Your Scene" ist jetzt defekt. Vielen Dank! – nbloqs

+1

@nbloqs Ah okay. Danke für das Zeigen und für die Verbesserung! Ich habe den Link repariert. – Whirlwind

Verwandte Themen