2015-12-06 17 views
5

Próbuję obrócić gracza w dotyku. Korzystając z funkcji przesuwania, ustawiam lokalizację na zmienną. Następnie wzywam funkcję. Działa, ale kąt jest wyłączony. Lokalizacja jest zmienną globalną, a gracz jest ikoną, którą chcę zmienić. Jest wyłączony o około 15 stopni.Obracanie sprite'a do sprite position nie jest dokładne w SpriteKit ze Swiftem

func rotatePlayer(){ 

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

W którym kierunku zmierza gracz, gdy jego 'zRotation' wynosi 0? – 0x141E

+0

To jest domyślny statek kosmiczny, a nos jest skierowany w górę. zRotation to 0. – ParalaxWobat

Odpowiedz

1

Według SpriteKit Best Practices doc

logiczne Wykorzystanie gier i sztuki aktywów pasujących współrzędnych i obrotu konwencje SpriteKit za. Oznacza to orientację grafiki po prawej stronie. Jeśli orientujesz dzieło w innym kierunku, musisz zamienić kąty między konwencjami używanymi przez sztukę i konwencjami używanymi przez SpriteKit.

Ponieważ punkty domyślny statek kosmiczny do góry (gdy zRotation jest 0), trzeba będzie zrównoważyć swój kąt 90 stopni (pi/2 radiany) tak, że statek stoi na prawo kiedy zRotation wynosi zero:

player?.zRotation = angle - CGFloat(M_PI_2) 

Alternatywnie można obrócić statek kosmiczny w prawo. Aby obrócić obraz, kliknij Assets.xcassets, a następnie kliknij na Spaceship. Kliknij prawym przyciskiem myszy obraz Spaceship i wybierz element menu Otwórz w edytorze zewnętrznym. Spowoduje to otwarcie obrazu w aplikacji Podgląd. W Podglądzie wybierz Narzędzia> Obróć w prawo i wyjdź z Podglądu. Obracając kompozycję, kod powinien działać bez żadnych zmian.

+0

To działało. Dzięki. – ParalaxWobat

0

Spróbuj coś takiego

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

Użyj ograniczenie orientacji aby obrócić obiekt w dotyku pozycji:

// 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) 

    } 

} 

Tutorial: http://stefansdevplayground.blogspot.de/2014/11/how-to-implement-space-shooter-with.html

wideo: https://youtu.be/8d8MH_gXt84

+0

Zaktualizowałem przykładowy kod w mojej odpowiedzi za pomocą prostszego rozwiązania. – Stefan

+0

Czy naprawdę potrzebujemy ograniczenia? Czy możemy dokładnie znaleźć kąt i automatycznie ustawić kąt gracza? – ParalaxWobat

+0

Myślę, że to również jest możliwe. Ale nie wiem jak. Miał ten sam problem co Ty i zrezygnował z podejścia obliczeniowego – Stefan

Powiązane problemy