2016-12-19 12 views
4

Ich möchte mein SpriteKit-Spiel in einer geordneteren und klareren Weise einrichten, also entschied ich mich, Klassen für jede Art von Sprite-Knoten zu verwenden.Physik auf eine benutzerdefinierte SKSpriteNode-Klasse anwenden

In meinem Fall habe ich eine separate Klasse Spieler in swift, die wie dieser

import SpriteKit 

class Player: SKSpriteNode { 

func initializePlayer() {   
    self.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: self.size.width, height: self.size.height)) 
    self.physicsBody?.affectedByGravity = true 
} 


func moveLeft() { 
    print("left") 
} 

func moveRight() { 
    print("right") 
} 
} 

ich diesen Sprite Knoten richtig in der Szene EDITOR'S Kundenspezifische Klasse Inspektor Referenz aussieht und ich kann die Klassenmethoden ohne auslösen Problem - so funktioniert das gut.

ich verweisen auf die Spielerklasse in meinem GameScene wie folgt aus:

class GameplayScene: SKScene { 
var player: Player = Player() 
let myNode = SKSpriteNode(imageNamed: "player") 
override func didMove(to view: SKView) {  
    player.initializePlayer()   
} 
} 

Aber die Physik Körper nicht angewendet wird, und ich kann nicht herausfinden, warum dies der Fall ist.

Nachdem ich den Physikkörper zum Sprite-Knoten hinzugefügt habe, würde ich erwarten, dass der Knoten vom Bildschirm fällt. Aber das passiert nicht und ich kann nicht verstehen warum.

Hat jemand eine Ahnung, wie ich einen Physikkörper aus der Klasse anwenden kann?

+0

was meinst du mit _der Physik Körper wird nicht angewendet_? – Mina

+0

Nachdem ich den Physikkörper zum Sprite-Knoten hinzugefügt habe, würde ich erwarten, dass der Knoten vom Bildschirm fällt. Aber das passiert nicht und ich kann nicht verstehen warum. – boehmatron

+0

Ich kann nicht sehen, dass auf dem geposteten Code, Sie nur Physik Körper zu sich selbst hinzugefügt. sei genauer und poste einige weitere Codes. – Mina

Antwort

2

kann ich Ihre Funktion mit anderen Namen nennt als initializePlayer, etwas mehr im Zusammenhang mit dem Code, implementiert:

func setPhysics() {   
    self.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: self.size.width, height: self.size.height)) 
    self.physicsBody?.affectedByGravity = true 
} 

Danach, wenn Sie Ihre Sprite aus Scene Editor abrufen möchten könnten Sie verwenden:

if let node = self.childNode(withName:"//mySpriteNodeName") as? Player { 
      // Set up your sprite here 
      node.setPhysics() 
} 

PS: Ich habe auch // hinzugefügt: Dies gibt an, dass die Suche am Stammknoten beginnen und rekursiv über die gesamte Knotenstruktur ausgeführt werden soll. Andernfalls führt es eine rekursive Suche von seiner aktuellen Position aus.

+0

Vielen Dank für Ihre Unterstützung.Ich versuchte Ihren Ansatz, aber immer noch bekomme ich den gleichen Fehler von der erforderlichen init-Methode .. Die Lösung, die @Mina re gab mir etwas, das ich nicht verstehe und ich weiß nicht, wie ich diese Probleme lösen soll. Denkst du, du kannst noch einen Blick darauf werfen? – boehmatron

+0

Im ersten Teil des Mina-Codes erklärt sie Ihnen, wie Sie Ihre Player-Klasse als SKSpriteNode-Unterklasse erstellen können, aber Sie können auch entscheiden, die Init-Methoden nicht zu überschreiben und andere benutzerdefinierte Funktionen zu erstellen. –

1

Das Problem ist, dass Sie Ihren Player-Knoten in SKSpriteNode nicht initialisiert haben, die in der init-Funktion eingebaut sind.

verwenden Sie folgenden Code:

init() { 
    let texture = SKTexture(imageNamed: "Spaceship") 
    super.init(texture: texture, color: UIColor.blue, size: texture.size()) 
    self.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: self.size.width, height: self.size.height)) 
    self.physicsBody?.affectedByGravity = true 
} 

required init(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 
    fatalError("init(coder:) has not been implemented") 
} 

statt:

func initializePlayer() {   
    self.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: self.size.width, height: self.size.height)) 
    self.physicsBody?.affectedByGravity = true 
} 

wird es Ihr Problem lösen und die Physik Körper richtig anzuwenden.

+1

Das funktioniert in meinem Fall nicht. Der Compiler löscht einen Fehler: "fataler Fehler: init (coder :) wurde nicht implementiert: file/Player.swift Weiter brauche ich nicht und möchte die Textur beim Initiieren der Instanz angeben. Vielmehr würde ich die Textur aus dem SceneEditor. – boehmatron

+0

Ich habe es getestet und es muss kein Fehler machen. aber Sie können diese [thread] (http://stackoverflow.com/a/24036440/1724845) verwenden, um den Fehler zu beheben. – Mina

+0

@ Mina Ihr Code ist korrekt, aber OP erlebt diesen Fehler, da initWIthCoder: aufgerufen wird.Das passiert, weil er Player aus einer .sks-Datei lädt – Whirlwind

Verwandte Themen