2015-02-05 9 views
7

Im ziemlich neu in Objective-C und Sprite-Kit, aber ich habe Spiele-Entwicklung für eine Weile getan. Ich arbeite gerade an einem 2D-Spiel und ich habe feindliche Schiffe, die sich auf dem Bildschirm von rechts nach links bewegen. Ich habe Tutorials für verschiedene Teile meines Spiels verfolgt und dann hinzugefügt, wo nötig. Ich fand ein Tutorial, in dem die in Spiel Feind einem Bézier-Pfad folgen, und ich habe es geschaffen, dies aber in meinem Spiel zu implementieren, wie ich bin neu Kurven Bezier ich sie nicht vollständig verstehen, und der Algorithmus macht mein Sprites von oben nach unten bewegen aber ich brauche sie von links nach rechts zu gehen.wie Sprite machen folgen Bezierkurve

Ich habe den Code-Schnipsel enthält, die ich verwendet habe die Bezierkurve meine Sprites irgendwelche Vorschläge, hinzufügen, wie ich kann sie von rechts nach links statt von oben nach unten bewegen.

CGMutablePathRef cgpath = CGPathCreateMutable(); 

     float xStart = [self getRandomNumberBetween:0+asteroid.size.width to:self.frame.size.width-asteroid.size.width]; 
     float xEnd = [self getRandomNumberBetween:0+asteroid.size.width to:self.frame.size.width-asteroid.size.width]; 
     float cp1X =[self getRandomNumberBetween:0+asteroid.size.width to:self.frame.size.width-asteroid.size.width]; 
     float cp1y = [self getRandomNumberBetween:0+asteroid.size.width to:self.frame.size.width-asteroid.size.height]; 
     float cp2x = [self getRandomNumberBetween:0+asteroid.size.width to:self.frame.size.width-asteroid.size.width]; 
     float cp2Y = [self getRandomNumberBetween:0 to:cp1y]; 

     CGPoint s = CGPointMake(xStart, 1024.0); 
     CGPoint e = CGPointMake(xEnd, -100); 
     CGPoint cp1 = CGPointMake(cp1X, cp1y); 
     CGPoint cp2 = CGPointMake(cp2x, cp2Y); 
     CGPathMoveToPoint(cgpath, NULL, s.x, s.y); 
     CGPathAddCurveToPoint(cgpath, NULL, cp1.x, cp1.y, cp2.x, cp2.y, e.x, e.y); 

     SKAction *enemyCurve = [SKAction followPath:cgpath asOffset:NO orientToPath:YES duration:5]; 

    CGPoint location = CGPointMake(-self.frame.size.width-asteroid.size.width, randY); 

     SKAction *moveAction = [SKAction moveTo:location duration:randDuration]; 
     SKAction *doneAction = [SKAction runBlock:(dispatch_block_t)^(){ 

      asteroid.hidden = YES; 
     }]; 

     SKAction *moveAsteroidActionWithDone = [SKAction sequence:@[enemyCurve,moveAction, doneAction]]; 

Vielen Dank für jede Hilfe und Anregungen.

Antwort

7

Bezier-Kurven werden verwendet, um eine glatte Kurve zwischen zwei Punkten zu erzeugen. Um den Pfad von links nach rechts zu verschieben, wählen Sie einen Startpunkt auf der linken Seite und einen Endpunkt auf der rechten Seite. Die beiden Kontrollpunkte bestimmen die Form des Weges von links nach rechts. die startpoint und endpoint im folgenden Code Wechselnde steuert, wo die Bezier-Kurve beginnt und wo es endet. Variieren Sie die control points variieren Sie die Form der Kurve. Sie können das mit dem angehängten GIF sehen.

CGMutablePathRef cgpath = CGPathCreateMutable(); 

CGPoint startingPoint = CGPointMake(50, 100); 

CGPoint controlPoint1 = CGPointMake(160, 250); 
CGPoint controlPoint2 = CGPointMake(200, 140); 

CGPoint endingPoint = CGPointMake(303, 100); 


CGPathMoveToPoint(cgpath, NULL, startingPoint.x, startingPoint.y); 
CGPathAddCurveToPoint(cgpath, NULL, controlPoint1.x, controlPoint1.y, 
         controlPoint2.x, controlPoint2.y, 
         endingPoint.x, endingPoint.y); 


SKAction *enemyCurve = [SKAction followPath:cgpath asOffset:NO orientToPath:YES duration:5]; 

[enemy runAction:[SKAction sequence:@[[SKAction waitForDuration:1],enemyCurve]]]; 

enter image description here

P0 und P3 sind die Start- und Endpunkte und P1 und P2 die Kontrollpunkte sind.

Aktivieren Sie diese Seite mehr mit Bezier-Kurven zu spielen. http://www.jasondavies.com/animated-bezier/

+1

Das war, was ich suchte, danke für eine gute Erklärung, die ich geschafft habe, dies in mein Spiel zu implementieren, und es funktioniert. –

+0

Irgendwie wissen Sie, wie ich das Sprite in die Richtung bewegen würde, in der es sich bewegt, ich setze 'orientToPath: YES', aber es zeigt nur den letzten Punkt in der Kurve, irgendwelche Vorschläge, wie ich es in den Punkt bringen kann Richtung seiner Reise? Danke nochmal –