2016-04-18 1 views
1

Ich erstelle ein Spiel und bin dabei, eine erfolgreiche Physikkontaktmethode zu erstellen.So rufen Sie eine Methode mit mehreren Eingabeparametern in einer anderen Methode auf

func bulletCollisionWithEnemy1(enemy1: SKSpriteNode, bullet1: SKSpriteNode){ // my enemy1 and bullet are defined in my game scene 

    score += 1 
    scoreLabel.text = "\(score)" 
    bullet1.removeFromParent() 
    hitCount++ 
} 

func enemy1Hit (enemy1:Enemy1) { //my enemy1 is defined in my game scene and my Enemy1 is a separate SKSNode class i have created containing physics properties and vars ect. 

    if (enemy1.hit() == true) { 
     //enemy hit animation 
    }else{ 
     //for animations 
    } 
} 

hier ist, wo ich die Physik Kontakt definieren

func didBeginContact(contact: SKPhysicsContact) { 

    let firstBody : SKPhysicsBody = contact.bodyA 
    let secondBody : SKPhysicsBody = contact.bodyB 

    if ((firstBody.categoryBitMask == PhysicsCategory.bullet1) && 
     (secondBody.categoryBitMask == PhysicsCategory.enemy1) || 
     (firstBody.categoryBitMask == PhysicsCategory.enemy1) && 
     (secondBody.categoryBitMask == PhysicsCategory.bullet1)) { 

     if let firstNode = firstBody.node as? SKSpriteNode, secondNode = secondBody .node as? SKSpriteNode { 

      bulletCollisionWithEnemy1((firstNode), bullet1: (secondNode)) 
     } 

, wo mein Problem ist, ich nicht weg zu nennen meine enemy1hit() Funktion gibt. Meine hit() - Funktion ist in meiner Enemy1-Klasse definiert, daher muss ich in den Parametern mein Enemy1 aufrufen und meine Trefferklasse in meiner Kollision mit der Bullet-Klasse aufrufen.

Antwort

0

Basierend auf der Annahme, dass die Klasse Enemy1 eine Unterklasse von SKSpriteNode ist Ich denke, was Sie wollen, ist:

class Enemy1: SKSpriteNode { 

    func bulletCollision(bullet1: SKSpriteNode){ // my enemy1 and bullet are defined in my game scene 
     score += 1 
     scoreLabel.text = "\(score)" 
     bullet1.removeFromParent() 
     hitCount++ 
    } 

    func hit() { //my enemy1 is defined in my game 
     // scene and my Enemy1 is a separate SKSNode class i have created 
     //containing physics properties and vars ect. 

     if (enemy1.hit() == true) { 
      //enemy hit animation 
     } else { 
      //for animations 
     } 
    } 

} 

Überall dort, wo Ihre Stellvertretung ist:

func didBeginContact(contact: SKPhysicsContact) { 

    let firstBody : SKPhysicsBody = contact.bodyA 
    let secondBody : SKPhysicsBody = contact.bodyB 

    if ((firstBody.categoryBitMask == PhysicsCategory.bullet1) && 
     (secondBody.categoryBitMask == PhysicsCategory.enemy1) || 
     (firstBody.categoryBitMask == PhysicsCategory.enemy1) && 
     (secondBody.categoryBitMask == PhysicsCategory.bullet1)) { 

     if let firstNode = firstBody.node as? Enemy1, secondNode = secondBody .node as? SKSpriteNode { 
      firstNode.bulletCollision(secondNode) 
      firstNode.hit() 
     } 
    } 
} 

Denken Sie daran, dass die bulletCollision und hit Methoden sind Mitglieder des Objekts Enemy1 und können so auf dem Objekt aufgerufen werden, anstatt das Objekt an sie übergeben zu müssen.

+0

müssen Sie den secondNode nicht in didBeginContact aufrufen? @george Grün? – gkolman

+1

und ich habe meinen Score und mein Ergebnis in meiner gameScene.swift-Datei definiert, also soll ich mein Ergebnis in meiner Klasse "enemy1" definieren? Das wäre ein bisschen schmerzhaft und könnte später Probleme mit dem Speichern von Punkten oder Punkten verursachen. – gkolman

+0

@gkolman Nein, wenn es gut ist, global, da es nicht spezifisch für eine Entität ist. Der Treffer ist jedoch spezifisch für einen Gegner. Ich bin mir nicht sicher, was du mit deiner ersten Frage meinst? Vielleicht könnten Sie mich mit der vollständigen Klassendefinition verbinden, damit ich besser sehen kann, was Sie erreichen wollen? –