2015-12-06 7 views
5

Ich versuche, einen Spieler zu berühren. Mit der Berührungsfunktion verschiebe ich den Ort auf eine Variable. Ich rufe dann eine Funktion an. Es funktioniert, aber der Winkel ist ausgeschaltet. Location ist die globale Variable und Player ist das Sprite, das ich drehen möchte. Es ist um etwa 15 Grad.Drehen Sie ein Sprite Sprite Position nicht genau in SpriteKit mit Swift

func rotatePlayer(){ 

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

In welche Richtung sieht Ihr Player, wenn seine 'zRotation' 0 ist? – 0x141E

+0

Es ist das Standardraumschiff und die Nase zeigt nach oben. zRotation ist 0. – ParalaxWobat

Antwort

1

Nach dem SpriteKit Best Practices doc

Verwenden Spiellogik und Kunst Vermögenswerte, die SpriteKit des koordinieren und Rotation Konventionen entsprechen. Dies bedeutet, dass das Kunstwerk nach rechts ausgerichtet wird. Wenn Sie das Bildmaterial in eine andere Richtung ausrichten, müssen Sie Winkel zwischen den Konventionen, die von der Grafik verwendet werden, und den Konventionen, die von SpriteKit verwendet werden, konvertieren.

Da die Standard-Raumschiff nach oben zeigt (wenn zRotation 0), müssen Sie Ihre Winkel von 90 Grad (pi/2 Radiant), so dass das Schiff nach rechts Flächen kompensieren, wenn zRotation Null ist:

player?.zRotation = angle - CGFloat(M_PI_2) 

Alternativ können Sie das Raumschiff nach rechts drehen. Um das Bild zu drehen, klicken Sie auf Assets.xcassets und dann auf Raumschiff. Klicken Sie mit der rechten Maustaste auf das Raumschiff-Bild und wählen Sie den Menüpunkt Im externen Editor öffnen. Dadurch wird das Bild in der Vorschau App geöffnet. Wählen Sie in der Vorschau Extras> Nach rechts drehen und beenden Sie die Vorschau. Wenn Sie das Bild drehen, sollte Ihr Code ohne Änderungen funktionieren.

+0

Das hat funktioniert. Vielen Dank. – ParalaxWobat

0

Probieren Sie etwas wie dieses

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

eine Orientierungsrestriktion Verwenden Sie Ihre Objekt in die Berührungsposition zu drehen:

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

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

+0

Ich habe den Beispielcode in meiner Antwort mit einer einfacheren Lösung aktualisiert – Stefan

+0

Müssen wir wirklich eine Einschränkung verwenden? Können wir den Winkel genau finden und den Winkel des Spielers automatisch einstellen? – ParalaxWobat

+0

Ich denke, das ist auch möglich. Aber ich weiß nicht wie. Hatte das gleiche Problem wie Sie und gab den Berechnungsansatz – Stefan

Verwandte Themen