2015-02-05 14 views
7

Objektif c ve sprite kitleri için oldukça yeni bir ürün ancak bir süredir oyunlar geliştirdim. Şu anda 2d'lik bir oyun üzerinde çalışıyorum ve sağdan sola doğru hareket eden düşman gemilerim var. Oyunumun farklı bölümleri için dersleri takip ettim ve ardından gerektiğinde ekledim. Oyundaki düşmanların bir bezier yolunu takip ettiği ve bunu oyunumda uygulayabildiğim bir öğretici buldum. Ancak bezier eğrileri için yeni olduğum için onları tamamen anlamadım ve algoritma benim sprite'ları yukarıdan aşağıya taşıyor ama onlara sağdan sola gitmeliyim.Sprite, bezier eğrisini nasıl izler?

Bezier eğrisini eklemek için kullandığım kod snippet'ini sprite'a ekledim, üste doğru değil de sağdan sola nasıl taşıyabileceğime dair önerilerim var.

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]]; 

Yardımlarınız ve önerileriniz için teşekkür ederiz.

cevap

7

Bezier eğrileri iki nokta arasında düzgün bir eğri oluşturmak için kullanılır. Yolu soldan sağa hareket ettirmek için, soldan bir başlangıç ​​noktası seçin ve sağ tarafta bir bitiş noktası seçin. İki kontrol noktası, soldan sağa doğru giden yolun şeklini belirler. Aşağıdaki kodda startpoint ve endpoint'un değiştirilmesi, bezier eğrisinin nerede başladığını ve nerede bittiğini kontrol edecektir. control points'un değiştirilmesi, eğrinin şeklini değiştirir. Bunu ekli GIF ile görebilirsiniz.

enter image description here

P0 ve P3

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]]]; 

başlangıç ​​ve bitiş noktaları ve P1 ve P2 kontrol noktaları vardır.

Bezier eğrileriyle daha fazla oynatmak için bu sayfaya bakın.http://www.jasondavies.com/animated-bezier/

+1

Aradığım şey buydu, iyi bir açıklama için bunu uygulamaya geçirmeyi başardım ve işe yarıyor. –

+0

Herhangi bir olasılıkla hareketli grafiğin nasıl hareket ettiğine baktığımı biliyorsunuz, ben orientToPath: YES'i ayarlıyorum ama sadece eğrinin son noktasını gösteriyor. yönünü gezmek? Tekrar teşekkürler –