2015-12-06 10 views
5

Я пытаюсь повернуть игрока на ощупь. Используя функцию перемещения касаний, я устанавливаю местоположение в переменную. Затем я вызываю функцию. Он работает, но угол выключен. Расположение - глобальная переменная, а игрок - это спрайт, который я хочу повернуть. Он выключен примерно на 15 градусов.Поворот спрайта в положение спрайта не точно в SpriteKit с Swift

func rotatePlayer(){ 

    let angle = atan2(location!.y - player!.position.y , location!.x - player!.position.x) 
    player?.zRotation = angle 
} 
+1

В каком направлении находится ваш плеер, когда его zRotation составляет 0? – 0x141E

+0

Это космический корабль по умолчанию, а нос - вверх. zRotation равно 0. – ParalaxWobat

ответ

1

Согласно SpriteKit Best Practices документу

Использование игровой логики и художественные активы, которые соответствуют SpriteKit по координации и ротации конвенций. Это означает ориентацию рисунка вправо. Если вы ориентируете произведение искусства в каком-то другом направлении, вам нужно преобразовать углы между соглашениями, используемыми в технике, и соглашениями, используемыми SpriteKit.

С точек звездолет по умолчанию вверх (при zRotation 0), вам нужно будет компенсировать свой угол на 90 градусов (пи/2 радиан), так что корабль обращен вправо, когда zRotation равен нулю:

player?.zRotation = angle - CGFloat(M_PI_2) 

В качестве альтернативы, вы можете повернуть космический корабль вправо. Чтобы повернуть изображение, нажмите «Assets.xcassets», а затем щелкните «Космический корабль». Щелкните правой кнопкой мыши на изображении «Космический корабль» и выберите пункт «Открыть в внешнем редакторе». Это откроет изображение в приложении «Просмотр». В окне предварительного просмотра выберите «Инструменты»> «Повернуть вправо» и «Прерывание». Вращая произведение, ваш код должен работать без каких-либо изменений.

+0

Это сработало. Благодарю. – ParalaxWobat

0

Попробуйте что-то вроде этого

//set sprite to image 



Person = SKSpriteNode(imageNamed: "Person") 




    //set size 
    Person.size = CGSize(width: 40, height: 7) 



    //set position 
    Person.position = CGPoint(x: self.frame.width/2, y: self.frame.height/2 + 120) 





    //rotate node 3.14/2 = to 90 degree angle 
    Person.zRotation = 3.14/2 



    Person.zPosition = 2.0 
0

Используйте ориентацию ограничения, чтобы повернуть объект на ощупь положение:

// Create two global Sprite properties: 

var heroSprite = SKSpriteNode(imageNamed:"Spaceship") 
var invisibleControllerSprite = SKSpriteNode() 

override func didMoveToView(view: SKView) {   

    // Create the hero sprite and place it in the middle of the screen 
    heroSprite.xScale = 0.15 
    heroSprite.yScale = 0.15 
    heroSprite.position = CGPointMake(self.frame.width/2, self.frame.height/2) 
    self.addChild(heroSprite) 

    // Define invisible sprite for rotating and steering behavior without trigonometry 
    invisibleControllerSprite.size = CGSizeMake(0, 0) 
    self.addChild(invisibleControllerSprite) 

    // Define a constraint for the orientation behavior 
    let rangeForOrientation = SKRange(constantValue: CGFloat(M_2_PI*7)) 

    heroSprite.constraints = [SKConstraint.orientToNode(invisibleControllerSprite, offset: rangeForOrientation)] 

} 

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) { 
    /* Called when a touch begins */   
    for touch: AnyObject in touches { 

     // Determine the new position for the invisible sprite: 
     // The calculation is needed to ensure the positions of both sprites 
     // are nearly the same, but different. Otherwise the hero sprite rotates 
     // back to it's original orientation after reaching the location of 
     // the invisible sprite 
     var xOffset:CGFloat = 1.0 
     var yOffset:CGFloat = 1.0 
     var location = touch.locationInNode(self) 
     if location.x>heroSprite.position.x { 
      xOffset = -1.0 
     } 
     if location.y>heroSprite.position.y { 
      yOffset = -1.0 
     } 

     // Create an action to move the invisibleControllerSprite. 
     // This will cause automatic orientation changes for the hero sprite 
     let actionMoveInvisibleNode = SKAction.moveTo(CGPointMake(location.x - xOffset, location.y - yOffset), duration: 0.2) 
     invisibleControllerSprite.runAction(actionMoveInvisibleNode) 

     // Optional: Create an action to move the hero sprite to the touch location 
     let actionMove = SKAction.moveTo(location, duration: 1) 
     heroSprite.runAction(actionMove) 

    } 

} 

Учебник: http://stefansdevplayground.blogspot.de/2014/11/how-to-implement-space-shooter-with.html

Видео: https://youtu.be/8d8MH_gXt84

+0

Я обновил образец кода в своем ответе с помощью более простого решения – Stefan

+0

Нужно ли нам использовать ограничение? Можем ли мы точно найти угол и автоматически установить угол игрока? – ParalaxWobat

+0

Я думаю, что это возможно. Но я не знаю, как это сделать. Имел ту же проблему, что и вы, и отказался от подхода вычисления – Stefan

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