2016-03-19 15 views
1

Ich habe einen Charakter in einem Spiel, und es soll eine Kugel schießen. Ich habe alles für den Charakter vorbereitet und den Weg für die Kugel festgelegt. Hier ist der Code Ich verwende:SKSprite nicht positionieren, wo es sollte

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

Das ist das, was ich von den NSLogs bekommen verwende ich oben:

MyPosition: {122,58448028564453, 109,20420074462891}

nozloc: {145,24272155761719 , 77,654090881347656}

Einschuss Position: {145,24272155761719, 77,654090881347656}

Also sollte alles funktionieren, oder? Aber das Problem, das ich habe, ist, dass die Kugeln von einem etwas anderen Ort aus gedreht werden. Sie können unten aus dem Bild sehen:

enter image description here

ich den Charakter ausgerichtet, so dass die Kugeln aus dem kleinen Platz in der Mitte beginnen. Auf diese Weise können Sie die Entfernung sehen, von der aus die Kugel starten soll (vor der Waffe, die mein Charakter hält), und das Quadrat in der Mitte des Bildschirms.

Die Kugeln bewegen sich korrekt auf einer geraden Linie, und der Winkel der Linie ist derselbe wie der Winkel des Pfades (der Pfad und die Linienaufzählungsform sind parallel, wie Sie aus dem Bild sehen können). Wenn ich meine Linie bewege, bewegen sich auch die Kugeln auf die gleiche Weise. Ich denke, die Frage der Punkt Konvertierung zwischen dem Knoten ist, aber ich habe versucht, beide

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

Doch sie alle Ergebnis in dem exakt gleichen Ausgangspunkt für die Kugel. Weißt du, warum ich dieses Problem habe? Liegt es daran, dass ich mein Zeichen-Sprite unter Verwendung von setScale verkleinere (ich setze es auf 0,3)?

Vielen Dank im Voraus für Ihre Hilfe.

Antwort

1

Dies ist nicht Ihr Problem, aber nozzleLoc ist bereits in dem Raum des Szene zu koordinieren, damit es sein sollte:

bullet.position = nozzleLoc; 

Das aus mit spart berechnet werden, um eine schnelle zweite Konvertierung.

followPath:duration: ist die gleiche wie followPath:asOffset:orientToPath:duration: mit asOffset: YES - es Ihre aktuelle Position als Ursprung des Pfades ist verwenden. Siehe Dokumentation here.

es beheben Sie die asOffset wollen NO sein (erfordert den vollen über Methodenaufruf) oder Sie können es lassen wie es ist und die Codezeile, nehmen die Position der Kugel einstellen.

+0

Noch eine große Antwort Dion! Ich habe die Codezeile für die Position genommen und es hat funktioniert! Danke vielmals! – Septronic