2016-05-05 25 views
0

Ziel Wenn Sie Angry Birds oder ein Pool-Spiel gespielt, bevor Sie mit vertraut sein würde, was ich versuche im Grunde zu tun, was ich will, ist:für gerade Linie Zeichnen

1- eine Linie in touchesMoved ziehen, so dass Der Spieler kann wissen, in welche Richtung er zielt.

2- Ich möchte, dass die Linie in die richtige Richtung reflektiert wird, wenn sie auf andere Objekte trifft. Bisher habe ich dies:

Update:

var ref = CGPathCreateMutable() 

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

      for touch in touches { 
       let location = touch.locationInNode(self) 

       let path = CGPathCreateMutable() 
       CGPathMoveToPoint(ref, nil, position.x - 100 , position.y - 100) 
       CGPathAddLineToPoint(ref, nil, -location.x, -location.y) 

       line.removeFromParent() 
       line.path = ref 

       line.strokeColor = UIColor.redColor() 
       line.lineWidth = 20 
       line.antialiased = true 
       line.fillColor = UIColor.blueColor() 
       addChild(line) 
      } 
     } 

Ich fügte hinzu, die - vor Ort, so dass die Linie wird vor dem Knoten gezogen ao es besser Ziel Sinn gibt, aber das lassen Sie mich mit 2 Problemen:

1- Ich möchte, dass die Linie ein Limit hat, in dem es vor dem Knoten kommt, aber gleichzeitig möchte ich, dass sein Ende der aktuelle Berührungsort ist. (Grundsätzlich möchte ich, dass es durch den Knoten geht)

2- Ich weiß immer noch nicht, wie kann ich es in den richtigen Winkel reflektieren, wenn es eine Wand oder etwas trifft, so gibt es eine Vorstellung von dem Knoten würde prallt von dieser Wand ab.

+0

Ich bin kein Sprite-Kit oder sogar Swift-Experte, aber es sieht so aus, als müssten Sie das SKShapeNode-Objekt mutieren, anstatt ein neues zu konstruieren. – dantiston

Antwort

0

Eine Alternative zum Löschen und Hinzufügen eines Linienknotens für jedes Bild, machen Sie einen SKShapeNode von 1 Pixel mal 1 Pixel, skalieren Sie dann auf der x-Achse den Abstand von pt zu pt und drehen Sie ihn dann. Verwenden Sie let angle = arctan2(P2_y - P1_y , P2_x - P1_x) (ich glaube arctan2 behandelt Division durch 0 für Sie), um den Winkel zu erhalten

+0

Dies funktioniert gut, jede Idee über das Treffen einer Wand Reflexion Ding? – Abdou023

+0

Gleiches Konzept, aber Sie fügen einen zweiten Skshapenode hinzu, der am Ende von Zeile 1 beginnt und sich bis zum Ende von Punkt 2 bewegt – Knight0fDragon

0

SpriteKit zeichnet keine API. In SpriteKit fügen Sie der Szene grundsätzlich Elemente hinzu und animieren die Elemente. Was Sie tun müssen, ist die vorherige Zeile zu löschen (falls vorhanden) und dann jeder Szene eine neue Zeile hinzuzufügen. Hier ist die Pseudo-Code, den Sie Idee zu geben, wie es geht:

class ParentNode: SKNode { 

    private var lines = [SKShapeNode]() 

    /// Called before each frame is rendered 
    override func update(currentTime: CFTimeInterval) { 
     self.drawLine() 
    } 

    func drawLine() { 
     let _ = self.lines.map { $0.removeFromParent() } 
     self.lines.removeAll() 

     if let path = self.createDrawingPath() { 
     let lineNode = SKShapeNode() 
     lineNode.path = path 
     lineNode.strokeColor = UIColor.whiteColor() 
     lineNode.lineWidth = 3.0 

     self.addChild(lineNode) 
     self.lines.append(lineNode) 
     } 
    } 
} 

In Ihrem Fall kann nur die ähnliche Sache, die ich benutzt habe Update zu löschen/neue Zeile hinzufügen, aber ich denke, man touchesMoved verwenden können (berührt: withEvent), um es zu tun.

+0

Ich habe jetzt einen Code, der die Zeile am Anfang der touchesMoved-Funktion entfernt und nach Abschluss wieder hinzufügt, überprüfe mein Update. – Abdou023