2016-11-20 9 views
0

Ich habe Spritekit gelernt, aber ich habe einige Schwierigkeiten mit super.init. Ich komme von einem Hintergrund von Java und fragte mich, warum ich den Fehler empfing: "Super.Init mehrfach in Initialisierung aufgerufen"Super.Init mehrmals im Initialisierer aufgerufen

Was ich versuche zu erreichen, ist ein Konstruktor, der die richtige ruhende Textur ordnet zu dem Zeichen, während auch das Textur-Array eingerichtet wird, so dass ich es aufrufen kann, ohne sich darum kümmern zu müssen, Werte zu übergeben.

Ich habe in der Dokumentation nachgeschaut, aber ich denke, mein Kaffeevolumen ist erschöpft, da ich wirklich keinen Sinn mehr daraus machen konnte, warum super.init sich selbst nennen könnte. Jede Hilfe, die Sie zur Verfügung stellen können, wäre sehr willkommen. Ich habe nach ähnlichen Fragen gesucht, konnte aber keine finden. Wenn ich mich irrte, um dies zu posten, würde ein Link zu der Antwort gleichermaßen geschätzt werden.

class CharClass : SKSpriteNode 
{ 

var textureAtlas = SKTextureAtlas() 
var textureArray = [SKTexture]() 

init() { 
    textureAtlas = SKTextureAtlas(named:"Org") 
    //likely should be a passed variable instead 
    for i in 1 ... textureAtlas.textureNames.count{ 
     var Name = String(); 
     if(i<10) 
     { 
      Name = "cWalk000\(i).png" 
     } 
     else 
     { 
      Name = "cWalk00\(i).png" 
     } 
     textureArray.append(SKTexture(imageNamed: Name)); 

     let texture = SKTexture(imageNamed: textureAtlas.textureNames[0]); 
     super.init(texture:texture, color: UIColor.clear, size:texture.size()) 

     self.size = CGSize(width:71 , height: 131); 

     self.position = CGPoint(x: -282.52, y:-141.5); 
     self.run(SKAction.repeatForever(SKAction.animate(with: textureArray, timePerFrame: accelSpeed))) 

    } 




} 
+2

Das Problem ist, dass Sie 'super.init' innerhalb einer Schleife aufrufen. Tu das nicht. Ruf 'super.init' nur einmal an. – rmaddy

+0

Danke! Ich werde etwas schlafen sehen, da ich vergessen habe, meine Schleife zu schließen – Blundabus

Antwort

1

rmaddy's Antwort ist korrekt. Schließen Sie Ihre for Schleife, wie Sie nur super.init nennen einmal können:

for i in 1 ... textureAtlas.textureNames.count { 
    let name: String 
    if(i < 10) { 
     name = "cWalk000\(i).png" 
    } else { 
     name = "cWalk00\(i).png" 
    } 
    textureArray.append(SKTexture(imageNamed: name)) 
} 

let texture = SKTexture(imageNamed: textureAtlas.textureNames[0]) 
super.init(texture: texture, 
      color: UIColor.clear, 
      size: texture.size()) 

Auch Willkommen zu schnellen :) Vergessen Sie nicht, dass ; völlig optional ist/ThumbsUp

Auch ist es gut zu nicht initialize etwas vor dem Versuch, es zu benutzen. Ich weiß, dass Java Sie dazu zwingt, aber ich habe var name in let name geändert, da es dort eigentlich nicht initialisiert werden muss, noch muss es tatsächlich mutieren. Man könnte eigentlich nur tun:

i < 10 ? (textureArray.append(SKTexture(imageNamed: "cwalk000\(i).png"))) : 
     (textureArray.append(SKTexture(imageNamed: "cwalk00\(i).png"))) 

Diese Regel Code beschleunigen wird und spart 8 Zeilen von Ihrem ursprünglichen;) Nur einen Tipp für einen neuen schneller!

Verwandte Themen