2016-03-19 3 views
1

У меня есть персонаж в игре, и он должен выстрелить в пулю. Я настроил все для персонажа и установил путь прохождения пули. Вот код, я использую:SKSprite не позиционируется там, где он должен

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

Это то, что я получаю от NSLogs Я использую выше:

myposition: {+122,58448028564453, +109,20420074462891}

nozloc: {+145,24272155761719 , 77,654090881347656}

Пуля Позиция: {+145,24272155761719, 77,654090881347656}

Итак, все должно работать, не так ли? Но проблема, с которой я столкнулась, заключается в том, что пули снимаются из немного другого места. Вы можете видеть на картинке ниже:

enter image description here

Я выровнен характер, так что пули начинаются с этой маленькой площади в центре. Таким образом, вы можете увидеть расстояние от пули, которое должно начинаться (перед пистолетом, который мой персонаж держит), и квадрат посередине экрана.

Пули перемещаются правильно по прямой, а угол линии такой же, как у ангела пути (путь и форма пули параллельны, как вы можете видеть на картинке). Когда я перемещаю свою линию, пули тоже движутся одинаково. Я думаю, что проблема является преобразование точки между узлами, но я пытался как

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

Однако, все они результат в том же отправную точку для пули. Вы знаете, почему у меня такая проблема? Это потому, что я уменьшаю свой характер спрайт, используя setScale (я устанавливаю его в 0.3)?

Большое спасибо за вашу помощь.

ответ

1

Это не ваша проблема, но nozzleLoc уже в пространстве координат сцены, так и должно быть:

bullet.position = nozzleLoc; 

Это позволит сохранить быструю вторую конверсию от того, чтобы быть вычислено.

followPath:duration: такой же, как followPath:asOffset:orientToPath:duration: с asOffset: YES - он использует ваше текущее положение как источник пути. См. Документацию here.

Чтобы исправить это, вы будете хотеть asOffset быть NO (требует полного вызова метода выше) или вы можете оставить его как есть и вынимают линию настройки положения пули кода.

+0

Еще один отличный ответ Дион! Я закончил тем, что взял строку кода для позиции, и это сработало! Большое спасибо! – Septronic

Смежные вопросы