2016-04-15 18 views
2

Ich habe es geschafft, eine Linie mit Array meiner zufälligen CGPoints zu zeichnen.Linie mit SpriteKit zeichnen und Kollision erkennen

-(void)drawLine 
    { 
    SKShapeNode *mainLine = [SKShapeNode node]; 
    CGMutablePathRef pathToDraw = CGPathCreateMutable(); 
    CGPathMoveToPoint(pathToDraw, NULL, 0, 0); 

    for(int i;i<pointsInMyView.count;i++) 
    { 
     CGPoint myPoint = [pointsInMyView[i] CGPointValue]; 
     CGPathAddLineToPoint(pathToDraw, NULL, myPoint.x, myPoint.y); 
     mainLine.path = pathToDraw; 
    } 
    [mainLine setLineWidth:40]; 
    [mainLine setStrokeColor:[SKColor whiteColor]]; 
    mainLine.name = @"mainLine"; 
    [self addChild:mainLine]; 


} 

Wie Sie sehen können, zeichne ich einen SKShapeNode. Mein Ziel ist es, die Kollision meines SKSpriteNode mit meiner Linie zu überprüfen. Aber natürlich erzeugt dieser Formknoten einen Rahmen, der alle Punkte meiner Linie enthält, und in diesem Fall ist mein ShapeNode überall in meiner Ansicht. Mein SpriteNode erkennt die Kollision mit diesem ShapeNode ständig. Ich sollte mehrere verschiedene ShapeNodes zeichnen, denke ich, also würde jeder Knoten seinen eigenen Rahmen haben. Aber wenn ich es so mache, ist meine Leitung nicht verbunden. Gibt es eine Lösung, um diesen Knoten für Knoten zu zeichnen und immer noch nette Linie zu bekommen.

+0

Wenn Ihr SKShapeNode aus zufälligen Punkten besteht, wird es sich über den gesamten Bildschirm verteilen (ich habe es gerade ausprobiert). Ich denke, dass Sie einen Algorithmus entwickeln müssen, um sicherzustellen, dass die Linie sich nicht überkreuzt, und eine relativ einfache Linie bildet. Können Sie Ihren Code posten, der '[pointsInMyView]' generiert? –

+0

Ich weiß, dass mein Shape-Knoten nur mein Bildschirm ist. Der Punkt ist, dass ich diese zufälligen Punkte brauche. Meine Linie ist nur ein großer Formknoten mit Vektorlinien von einem Punkt zum anderen. Das ist in Ordnung. Aber jetzt arbeite ich daran, Kollisionen mit meinem Touch-Standort und der Linie, die ich gezeichnet habe, zu erkennen. Problem ist, dass Kollision die ganze Zeit erkannt wird, wenn ich innerhalb des Knotenrahmens bin. Ich möchte, dass meine Berührung nicht auf leere Pixel meines Formknotens reagiert, nur auf Pixel, wo meine Linie gezeichnet wird. Irgendeine Idee? – user3215624

+0

Versuchen Sie, eine Berührung in der Leitung oder einen anderen Sprite zu erkennen, der die Leitungen kontaktiert? –

Antwort

3

Leider können Knoten in SpriteKit nicht konkav sein (http://mathworld.wolfram.com/ConcavePolygon.html), mit Linien, die sich überkreuzen.

Sie müssen separate Knoten für jede Linie zwischen benachbarten Punkten erstellen und sie dann möglicherweise zusammenfügen. Sie können dies tun, indem Sie entweder:

  • Erstellen Sie das erste Segment und dann nachfolgende Segmente als Kinder dieses ersten Segments hinzufügen.
  • Erstellen Sie einen nicht sichtbaren Knoten für die gesamte Zeile und fügen Sie wll die Zeile Segmente als untergeordnete Elemente dieses Knotens hinzu.
  • Erstellen Sie Physikkörper für jedes Segment und verbinden Sie sie mit SKPhysicsJointFixed.
  • +0

    Ich erinnerte mich plötzlich daran, nachdem ich in einem Testprojekt damit herumgespielt hatte und seltsames Verhalten bekommen hatte, also löschte ich meine vorherige Antwort. –

    +0

    Dies sind sichere Optionen, um mein Problem zu lösen..Ich habe auch ein paar Beiträge darüber gelesen, wie man eine Textur von ShapeNode bekommt und dann einen neuen SpriteNode präsentiert, mit Physik und dann Kollision erkennen. Dies ist definitiv eine gute Option, aber meine Textur, die ich erstelle, ist wie folgt: SKTexture * texture = [self.view textureFromNode: mainLine]; ist immer NUL, und mein neuer SpriteNode ist leer, wenn ich ihn der Szene hinzufüge. Ich muss herausfinden, was hier falsch ist. Danke für deine Antwort. – user3215624

    +0

    Sie erwähnen Kollisionen, aber dann sagen Sie, dass Sie nur Berührungen in der Linie erkennen wollen (die Grenze des Knotens). Aber Sie haben die gleichen Probleme, wenn Ihre Form durch eine zufällige Menge von Punkten definiert wird, es sei denn, Sie können garantieren, dass die Form, die sie machen, konkav ist. –

    Verwandte Themen