2016-03-19 37 views
1

Ben bir oyunda bir karakter var nereye konumlandırılması ve bir kurşun ateş gerekiyordu değil. Karakter için her şeyi hazırladım ve merminin geçmesi için yolu ayarladım.SKSprite o

//The destination of the bullet 
int x = myCharacter.position.x - 1000 * sin(myCharacter.zRotation); 
int y = myCharacter.position.y + 1000 * cos(myCharacter.zRotation); 


//The line to test the path 
SKShapeNode* beam1 = [SKShapeNode node]; 

//The path 
CGMutablePathRef pathToDraw = CGPathCreateMutable(); 

//The starting position for the path (i.e. the bullet) 
//The NozzleLocation is the location of the nozzle on my character Sprite 
CGPoint nozzleLoc=[self convertPoint:myCharacter.nozzleLocation fromNode:myCharacter]; 
CGPathMoveToPoint(pathToDraw, NULL, nozzleLoc.x, nozzleLoc.y); 
CGPathAddLineToPoint(pathToDraw, NULL, x, y); 

//The bullet 
SKSpriteNode *bullet = [SKSpriteNode spriteNodeWithTexture:bulletTexture size:CGSizeMake(6.f, 6.f)]; 
bullet.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:3 center:bullet.position ]; 
[bullet.physicsBody setAffectedByGravity:NO]; 
[bullet.physicsBody setAllowsRotation:YES]; 
[bullet.physicsBody setDynamic:YES]; 
bullet.physicsBody.categoryBitMask = bulletCategory; 
bullet.physicsBody.contactTestBitMask = boundsCategory; 

//These log the correct locations for the character 
//and the nozzle Location 
NSLog(@"myposition: %@",NSStringFromCGPoint(myCharacter.position)); 
NSLog(@"nozloc: %@",NSStringFromCGPoint(nozzleLoc)); 

bullet.position = [bullet convertPoint:nozzleLoc fromNode:self]; 
[self addChild:bullet]; 
NSLog(@"Bullet Position: %@",NSStringFromCGPoint(bullet.position)); 
[bullet runAction:[SKAction followPath:pathToDraw duration:6.f]]; 

//I'm using this to test the path 
beam1.path = pathToDraw; 
[beam1 setStrokeColor:[UIColor redColor]]; 
[beam1 setName:@"RayBeam"]; 
[self addChild:beam1]; 

Bu yukarıda kullanıyorum ben NSLogs ne olsun edilmektedir: İşte kullanıyorum kodu

myposition: {122,58448028564453, 109,20420074462891}

nozloc: {145,24272155761719 , 77,654090881347656}

Bullet pozisyonu: {145,24272155761719, 77,654090881347656}

Her şey yolunda, değil mi? Ama sahip olduğum konu, mermilerin biraz farklı bir yerden çekilmesidir. Aşağıdaki resimden görebilirsiniz: Ben karakter hizalanmış

enter image description here

, mermi ortada o küçük meydanından başlayıp böylece. Bu şekilde merminin başlayacağı mesafeyi (karakterimin tuttuğu silahın önünde) ve ekranın ortasındaki kareyi görebilirsiniz.

Mermiler düz bir çizgi üzerinde doğru şekilde ilerler ve çizgi açısı yolun meleği ile aynıdır (yol ve çizgi mermi formları, resimde görebileceğiniz gibi paraleldir). Hattımı hareket ettirdiğimde mermiler de aynı şekilde hareket eder. Ben sorunu düğümler arasındaki nokta dönüşüm olduğunu düşünüyorum, ama merminin için tamamen aynı başlangıç ​​noktasında hepsi sonuç, ancak her ikisi de

[self convertPoint:myCharacter.nozzleLocation fromNode:myCharacter] 
[bullet convertPoint:nozzleLoc fromNode: self] 
[self convertPoint:nozzleLoc toNode:bullet] 

denedim. Neden bu sorunu yaşıyorum biliyor musunuz? Bu, setScale'u kullanarak (karakterimi 0.3 değerine ayarlıyorum) karakter kalıbımın küçültülmesinden mi kaynaklanıyor?

Yardımlarınız için teşekkürler şimdiden çok.

cevap

1

Bu sorun teşkil etmez ancak olması gerektiği, böylece nozzleLoc sahnenin koordinat alanında zaten: Bu hesaplanacak olan hızlı bir ikinci dönüşüm kazandıracak

bullet.position = nozzleLoc; 

.

followPath:duration:, asOffset: YES ile followPath:asOffset:orientToPath:duration: ile aynıdır - geçerli konumunuzu yolun kökeni olarak kullanıyor. here belgelerine bakın.

Eğer asOffset NO olmak isteyeceksiniz düzeltmek için (yukarıda tam yöntem çağrısı gerektirir) veya sen olduğu gibi bırakabilirsiniz ve mermi pozisyonunun belirlenmesinde kod satırını alabilir.

+0

Yine harika bir cevap Dion! Pozisyon için kod satırını aldım ve işe yaradı! Çok teşekkürler! – Septronic