Kennt sich hier jmd. mit SpriteKit aus?

Critizz

Critizz

Aktives Mitglied
Thread Starter
Dabei seit
28.05.2012
Beiträge
1.136
Reaktionspunkte
22
Hallöchen Community ,

Ich bin gerade dabei, mein erstes 2D-Spiel in SpriteKit zu entwickeln.
Habe mir dazu auch schon mehrere Tutorials durchgelesen über Swift und SpriteKit.
Habe mir noch dazu ein Buch über Swift bestellt, dass ich schon durchgelesen habe :D

Ich möchte, dass sich hinter einen Image eine Flamme bewegt.
Diese Flamme habe ich ganz einfach mit einer Particle File erstellt. und diese Particle File auch in meine GameScene eingebunden :

Code:
func fire(pos: SKSpriteNode) {

    var emitterNode = SKEmitterNode(fileNamed: "MyParticle.sks")
    self.addChild(emitterNode)
}

In meinem Spiel, fliegt eine Rakete von rechts nach links. Das habe ich auch ohne Probleme hinbekommen :)

Während diese Rakete fliegt, möchte ich aber noch dass sich hinter dieser Rakete eine flamme befindet.
Meine Rakete wird in einem SKSpriteNode Image dargestellt.

In meiner "SpawnRakete" Funktion habe ich also folgendes geschrieben:


Code:
let  rocket = SKSpriteNode(imageNamed: "boss_ship")

    rocket.name = "rocket"

    rocket.position = CGPoint(x: frame.size.width, y: frame.size.height * random(min:0, max:1))


    rocket.runAction(SKAction.moveByX(-size.width - rocketsize.width, y: 0.0, duration: NSTimeInterval(random(min:1, max: 2))))

und am ende meiner Funktion habe ich folgendes Eingefügt:

Code:
fire(SKSpriteNode(imageNamed: "boss_ship"))
<-- Dieser Teil ist vermutlich falsch.



Irgendjmd. eine Idee?
 
Was ist "pos:"? Und warum verwendest du es nicht in der Funktion? Wäre sowieso unlogisch.
Du musst ja irgendwie die Flamme mit der Rakete verknüpfen bzw. die Position abgleichen.
 
Was ist "pos:"? Und warum verwendest du es nicht in der Funktion? Wäre sowieso unlogisch.
Du musst ja irgendwie die Flamme mit der Rakete verknüpfen bzw. die Position abgleichen.

wo siehst du denn da pos?
Edit: Achso, da ganz oben.

Mit .pos gebe ich ja den SKSpriteNode als position...
Oder hab ich dass falsch gemacht?
 
Zuerst sei mal gesagt dass ich jetzt kein Profi bin, sondern mir alles selbst beigebracht habe in Swift und SpriteKit.

Du könntest es so machen:
Code:
[FONT=Menlo]func fire(rocketPosition: CGPoint) {    
  var emitterNode = SKEmitterNode(fileNamed: "MyParticle.sks")[/FONT]
[FONT=Menlo]  emitterNode.position = rocketPosition[/FONT]
[FONT=Menlo]}[/FONT]
und bei der Rakete:
Code:
[COLOR=#FFFFFF][FONT=Menlo][COLOR=#000000]fire(rocket.position)[/COLOR][/FONT][/COLOR]

geht aber auch anders:
Code:
[FONT=Menlo]func fire() {    
  var emitterNode = SKEmitterNode(fileNamed: "MyParticle.sks")[/FONT]
[FONT=Menlo] emitterNode.position = childNodeWithName("rocket")!.position[/FONT]
[FONT=Menlo]}[/FONT]
und bei der Rakete:
Code:
[COLOR=#FFFFFF][FONT=Menlo][COLOR=#000000]fire()[/COLOR][/FONT][/COLOR]
musst du dann evtl. die Position noch verfeinern.

Ich weiss jetzt nur nicht ob/wie man die Partikel mit der Rakete koppeln kann. Evtl. so(?): (zumindest gibts im playground keine Fehlermeldung)
Code:
[COLOR=#000000]
[/COLOR][COLOR=#FFFFFF][FONT=Menlo][COLOR=#000000]func fire() {[/COLOR][/FONT][/COLOR]
[COLOR=#FFFFFF][FONT=Menlo][COLOR=#000000]    var emitterNode = SKEmitterNode(fileNamed: "MyParticle.sks")[/COLOR][/FONT][/COLOR]
[COLOR=#00AFCA][FONT=Menlo][COLOR=#000000]    emitterNode.position = childNodeWithName("rocket")!.position[/COLOR][/FONT][/COLOR]
[COLOR=#FFFFFF][FONT=Menlo][COLOR=#000000]    emitterNode.name = "fire"[/COLOR][/FONT][/COLOR]
[COLOR=#FFFFFF][FONT=Menlo][COLOR=#000000]}[/COLOR][/FONT][/COLOR]
[COLOR=#FFFFFF][FONT=Menlo][COLOR=#000000]
[/COLOR][/FONT][/COLOR]
[COLOR=#FFFFFF][FONT=Menlo][COLOR=#000000]
[/COLOR][/FONT][/COLOR]
[COLOR=#FFFFFF][FONT=Menlo][COLOR=#000000]func rocket() {[/COLOR][/FONT][/COLOR]
[COLOR=#FFFFFF][FONT=Menlo][COLOR=#000000]    let  rocket = SKSpriteNode(imageNamed: "boss_ship")[/COLOR][/FONT][/COLOR]

[COLOR=#FFFFFF][FONT=Menlo][COLOR=#000000]    rocket.name = "rocket"[/COLOR][/FONT][/COLOR]

[COLOR=#00AFCA][FONT=Menlo][COLOR=#000000]    rocket.position = CGPoint(x: frame.size.width, y: frame.size.height * 1)[/COLOR][/FONT][/COLOR]

[COLOR=#FFFFFF][FONT=Menlo][COLOR=#000000]    let flyAction = SKAction.moveByX(-size.width - rocket.size.width, y: 0.0, duration: 1)[/COLOR][/FONT][/COLOR]
[COLOR=#FFFFFF][FONT=Menlo][COLOR=#000000]    rocket.runAction(flyAction)[/COLOR][/FONT][/COLOR]

[COLOR=#FFFFFF][FONT=Menlo][COLOR=#000000]    fire()[/COLOR][/FONT][/COLOR]


[COLOR=#00AFCA][FONT=Menlo][COLOR=#000000]    rocket.addChild(childNodeWithName("fire")!)[/COLOR][/FONT][/COLOR]
[COLOR=#FFFFFF][FONT=Menlo][COLOR=#000000]}[/COLOR][/FONT][/COLOR]
 
Zuletzt bearbeitet:
Zuerst sei mal gesagt dass ich jetzt kein Profi bin, sondern mir alles selbst beigebracht habe in Swift und SpriteKit.

Du könntest es so machen:
Code:
[FONT=Menlo]func fire(rocketPosition: CGPoint) {    
  var emitterNode = SKEmitterNode(fileNamed: "MyParticle.sks")[/FONT]
[FONT=Menlo]  emitterNode.position = rocketPosition[/FONT]
[FONT=Menlo]}[/FONT]
und bei der Rakete:
Code:
[COLOR=#FFFFFF][FONT=Menlo][COLOR=#000000]fire(rocket.position)[/COLOR][/FONT][/COLOR]

Bekomme keinen Fehler im Code, jedoch wird mein Particle nicht angezeigt.

geht aber auch anders:
Code:
[FONT=Menlo]func fire() {    
  var emitterNode = SKEmitterNode(fileNamed: "MyParticle.sks")[/FONT]
[FONT=Menlo] emitterNode.position = childNodeWithName("rocket")!.position[/FONT]
[FONT=Menlo]}[/FONT]
und bei der Rakete:
Code:
[COLOR=#FFFFFF][FONT=Menlo][COLOR=#000000]fire()[/COLOR][/FONT][/COLOR]
musst du dann evtl. die Position noch verfeinern.

Ich weiss jetzt nur nicht ob/wie man die Partikel mit der Rakete koppeln kann. Evtl. so(?): (zumindest gibts im playground keine Fehlermeldung)
Code:
[COLOR=#000000]
[/COLOR][COLOR=#FFFFFF][FONT=Menlo][COLOR=#000000]func fire() {[/COLOR][/FONT][/COLOR]
[COLOR=#FFFFFF][FONT=Menlo][COLOR=#000000]    var emitterNode = SKEmitterNode(fileNamed: "MyParticle.sks")[/COLOR][/FONT][/COLOR]
[COLOR=#00AFCA][FONT=Menlo][COLOR=#000000]    emitterNode.position = childNodeWithName("rocket")!.position[/COLOR][/FONT][/COLOR]
[COLOR=#FFFFFF][FONT=Menlo][COLOR=#000000]    emitterNode.name = "fire"[/COLOR][/FONT][/COLOR]
[COLOR=#FFFFFF][FONT=Menlo][COLOR=#000000]}[/COLOR][/FONT][/COLOR]
[COLOR=#FFFFFF][FONT=Menlo][COLOR=#000000]
[/COLOR][/FONT][/COLOR]
[COLOR=#FFFFFF][FONT=Menlo][COLOR=#000000]
[/COLOR][/FONT][/COLOR]
[COLOR=#FFFFFF][FONT=Menlo][COLOR=#000000]func rocket() {[/COLOR][/FONT][/COLOR]
[COLOR=#FFFFFF][FONT=Menlo][COLOR=#000000]    let  rocket = SKSpriteNode(imageNamed: "boss_ship")[/COLOR][/FONT][/COLOR]

[COLOR=#FFFFFF][FONT=Menlo][COLOR=#000000]    rocket.name = "rocket"[/COLOR][/FONT][/COLOR]

[COLOR=#00AFCA][FONT=Menlo][COLOR=#000000]    rocket.position = CGPoint(x: frame.size.width, y: frame.size.height * 1)[/COLOR][/FONT][/COLOR]

[COLOR=#FFFFFF][FONT=Menlo][COLOR=#000000]    let flyAction = SKAction.moveByX(-size.width - rocket.size.width, y: 0.0, duration: 1)[/COLOR][/FONT][/COLOR]
[COLOR=#FFFFFF][FONT=Menlo][COLOR=#000000]    rocket.runAction(flyAction)[/COLOR][/FONT][/COLOR]

[COLOR=#FFFFFF][FONT=Menlo][COLOR=#000000]    fire()[/COLOR][/FONT][/COLOR]


[COLOR=#00AFCA][FONT=Menlo][COLOR=#000000]    rocket.addChild(childNodeWithName("fire")!)[/COLOR][/FONT][/COLOR]
[COLOR=#FFFFFF][FONT=Menlo][COLOR=#000000]}[/COLOR][/FONT][/COLOR]

Führt dazu, dass die App abstürzt, sobald die Raketen spawnen.
Xcode gibt mir dann auch folgendes aus:
Thread 1: EXC_BAD_INSTRUCTION(code=EXC_I386_INVOP,subcode=0x0)

Hmm..
Trotzdem Danke ! :)
 
Na ein bisschen musst du schon nachdenken, beim ersten sind die Partikel nicht zu sehen weil du sie gar nicht der scene hinzugefügt hast.

Das funktioniert bei mir, du musst halt nur selber deine Positionen etc. anpassen.
Code:
[COLOR=#000000][FONT=Menlo]func[/FONT][FONT=Menlo] spaceShip(location: [/FONT][FONT=Menlo]CGPoint[/FONT][FONT=Menlo]) {[/FONT][/COLOR][COLOR=#FFFFFF][FONT=Menlo][COLOR=#000000]        [/COLOR][/FONT][/COLOR]
[COLOR=#000000][/COLOR][COLOR=#FFFFFF][FONT=Menlo][COLOR=#000000]        let sprite = SKSpriteNode(imageNamed:"Spaceship")[/COLOR][/FONT][/COLOR]
[COLOR=#000000][/COLOR][COLOR=#FFFFFF][FONT=Menlo][COLOR=#000000]        [/COLOR][/FONT][/COLOR]
[COLOR=#000000][/COLOR][COLOR=#FFFFFF][FONT=Menlo][COLOR=#000000]        sprite.position = location[/COLOR][/FONT][/COLOR]
[COLOR=#000000][/COLOR][COLOR=#FFFFFF][FONT=Menlo][COLOR=#000000]        [/COLOR][/FONT][/COLOR]
[COLOR=#000000][/COLOR][COLOR=#FFFFFF][FONT=Menlo][COLOR=#000000]        let action = SKAction.rotateByAngle(CGFloat(M_PI), duration:1)[/COLOR][/FONT][/COLOR]
[COLOR=#000000][/COLOR][COLOR=#FFFFFF][FONT=Menlo][COLOR=#000000]        [/COLOR][/FONT][/COLOR]
[COLOR=#000000][/COLOR][COLOR=#00AFCA][FONT=Menlo][COLOR=#000000]        sprite.runAction(SKAction.repeatActionForever(action))[/COLOR][/FONT][/COLOR]
[COLOR=#000000][/COLOR][COLOR=#FFFFFF][FONT=Menlo][COLOR=#000000]        [/COLOR][/FONT][/COLOR]
[COLOR=#000000][/COLOR][COLOR=#FFFFFF][FONT=Menlo][COLOR=#000000]        self.addChild(sprite)[/COLOR][/FONT][/COLOR]
[COLOR=#000000][/COLOR][COLOR=#FFFFFF][FONT=Menlo][COLOR=#000000]        [/COLOR][/FONT][/COLOR]
[COLOR=#000000][/COLOR][COLOR=#FFFFFF][FONT=Menlo][COLOR=#000000]        var emitterNode = SKEmitterNode(fileNamed: "MyParticle.sks")[/COLOR][/FONT][/COLOR]
[COLOR=#000000][/COLOR][COLOR=#FFFFFF][FONT=Menlo][COLOR=#000000]        emitterNode.position = sprite.position[/COLOR][/FONT][/COLOR]
[COLOR=#000000][/COLOR][COLOR=#FFFFFF][FONT=Menlo][COLOR=#000000]        [/COLOR][/FONT][/COLOR]
[COLOR=#000000][/COLOR][COLOR=#FFFFFF][FONT=Menlo][COLOR=#000000]        sprite.addChild(emitterNode)[/COLOR][/FONT][/COLOR]
[COLOR=#000000][/COLOR][COLOR=#FFFFFF][FONT=Menlo][COLOR=#000000]    }[/COLOR][/FONT][/COLOR]
[COLOR=#000000][/COLOR][COLOR=#FFFFFF][FONT=Menlo][COLOR=#000000]    [/COLOR][/FONT][/COLOR]
[COLOR=#000000][/COLOR][COLOR=#FFFFFF][FONT=Menlo][COLOR=#000000]    [/COLOR][/FONT][/COLOR]
[COLOR=#000000][/COLOR][COLOR=#FFFFFF][FONT=Menlo][COLOR=#000000]    override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {[/COLOR][/FONT][/COLOR]
[COLOR=#000000][/COLOR][COLOR=#4CBF57][FONT=Menlo][COLOR=#000000]        /* Called when a touch begins */[/COLOR][/FONT][/COLOR]
[COLOR=#000000][/COLOR][COLOR=#FFFFFF][FONT=Menlo][COLOR=#000000]        [/COLOR][/FONT][/COLOR]
[COLOR=#000000][/COLOR][COLOR=#FFFFFF][FONT=Menlo][COLOR=#000000]        for touch in (touches as! Set<UITouch>) {[/COLOR][/FONT][/COLOR]
[COLOR=#000000][/COLOR][COLOR=#FFFFFF][FONT=Menlo][COLOR=#000000]            let location = touch.locationInNode(self)[/COLOR][/FONT][/COLOR]
[COLOR=#000000][/COLOR][COLOR=#FFFFFF][FONT=Menlo][COLOR=#000000]            [/COLOR][/FONT][/COLOR]
[COLOR=#000000][/COLOR][COLOR=#FFFFFF][FONT=Menlo][COLOR=#000000]            spaceShip(location)[/COLOR][/FONT][/COLOR]
[COLOR=#000000][/COLOR][COLOR=#FFFFFF][FONT=Menlo][COLOR=#000000]        }[/COLOR][/FONT][/COLOR]
[COLOR=#000000][FONT=Menlo]    }[/FONT][/COLOR]
 
Also so sieht jetzt meine Funktion aus

Code:
 func spawnEnemy() {
        
        
      //  fire(SKSpriteNode(imageNamed: "ship"))
        
        let enemy = SKSpriteNode(imageNamed: "ship")
        
        enemy.name = "enemy"
        
        enemy.position = CGPoint(x: frame.size.width, y: frame.size.height * random(min:0, max:1))
        
        
        
       
        
        enemy.runAction(SKAction.moveByX(-size.width - enemy.size.width, y: 0.0, duration: NSTimeInterval(random(min:1, max: 2))))
        
        
        enemy.physicsBody = SKPhysicsBody(circleOfRadius: enemy.size.width/4)
        
        enemy.physicsBody?.dynamic = false
        
        enemy.physicsBody?.affectedByGravity = false
        
        enemy.physicsBody?.allowsRotation = false
        
        enemy.physicsBody?.categoryBitMask = BodyType.enemy.rawValue
        
        enemy.physicsBody?.contactTestBitMask = BodyType.player.rawValue
        
        enemy.physicsBody?.collisionBitMask = 0
        
        self.addChild(enemy)
        
        var ermitterNode = SKEmitterNode(fileNamed: "fire.sks")
        ermitterNode.position = enemy.position
        enemy.addChild(ermitterNode)
        

    
         addChild(enemy)


Ich müsste doch jetzt alles korrekt gemacht haben oder?
Den Partikel habe ich ja auch in die scene hinzugefügt..

Jedoch stürzt die App immer noch ab...
 
Nimm mal das letzte "addChild(enemy)" raus
 
Ou man, könntest du evtl. mal den ganzen Quellcode posten oder mir zukommen lassen? Dann würde ich das ganze mal hier testen.
 
Werde ich später hochladen..
Wie macht man dass den am besten?
Habe im Moment einpaar Schwierigkeiten mit GitHub ...
 
Keine Ahnung, einfach bei irgendeinem filehoster. dürfe ja nur n paar mb groß sein das Projekt. Deine Partikeldatei sollte auch drin sein.
 
Zurück
Oben Unten