2016-03-26 4 views
3

Ich erstelle ein einfaches Sprite-Kit-Spiel, das einen Spieler auf der linken Seite des Bildschirms positioniert, während sich Feinde von rechts nähern. Da der Spieler auf und ab bewegt werden kann, möchte ich, dass die Feinde "intelligent" ihren Weg zum Spieler einstellen.Wie bewege ich den Gegner in Richtung eines sich bewegenden Spielers?

Ich habe versucht, die SKAction-Sequenz zu entfernen und neu hinzuzufügen, wenn der Spieler sich bewegt, aber der folgende Code bewirkt, dass die Gegner überhaupt nicht angezeigt werden, wahrscheinlich weil er jede Aktion bei jedem Frame-Update hinzufügt und entfernt eine Chance sich zu bewegen.

In der Hoffnung, ein kleines Feedback über die beste Praxis zu erhalten, "intelligente" Feinde zu schaffen, die sich jederzeit in Richtung der Position eines Spielers bewegen.

Hier ist mein Code:

func moveEnemy(enemy: Enemy) { 
    let moveEnemyAction = SKAction.moveTo(CGPoint(x:self.player.position.x, y:self.player.position.y), duration: 1.0) 
    moveEnemyAction.speed = 0.2 
    let removeEnemyAction = SKAction.removeFromParent() 
    enemy.runAction(SKAction.sequence([moveEnemyAction,removeEnemyAction]), withKey: "moveEnemyAction") 
} 

func updateEnemyPath() { 
    for enemy in self.enemies { 
     if let action = enemy.actionForKey("moveEnemyAction") { 
      enemy.removeAllActions() 
      self.moveEnemy(enemy) 
     } 
    } 
} 

override func update(currentTime: NSTimeInterval) { 
    self. updateEnemyPath() 
} 
+0

"Funktioniert nicht richtig" ist kein Fachausdruck.Wir benötigen vollständige Informationen über Ihre Erwartungen und was sie falsch machen. – Rob

+0

@Rob Entschuldigung für die Ungenauigkeit, im Moment verursacht der obige Code keine Feinde zu erscheinen. Wahrscheinlich, weil es einfach jede Aktion bei jedem Frame-Update hinzufügt und entfernt, so dass sie nie eine Chance haben, sich zu bewegen. Vielen Dank! – JimmyJammed

+1

Obwohl Sie bereits eine Antwort erhalten haben, die Sie als korrekt markiert haben, würde ich Ihnen dringend empfehlen, in GameplayKit (ios 9 API) zu schauen. Es bietet Tools für ein flexibleres Spieldesign, einschließlich Wegfindung und Suche nach Feinden, die Dinge, wie Sie sie wünschen, viel schöner und einfacher machen. Es gibt einige gute Tutorials im Internet dazu. https://www.raywenderlich.com/119959/gameplaykit-tutorial-entity-component-system-agents-goals-behaviors und http://code.utsplus.com/tutorials/an-introduction-to-gameplaykit-part- 1 - cms-24483 – crashoverride777

Antwort

9

Sie haben Feind zu aktualisieren position und zRotation Eigenschaft in jedem Update: Methodenaufruf.

Sucher und ein Ziel

Okay, so können einige Knoten in die Szene. Wir brauchen einen Sucher und ein Ziel. Sucher wäre eine Rakete und Ziel wäre ein Touch-Standort. Ich sagte, Sie sollten dies innerhalb einer update: method tun, aber ich werde die Methode touchesMoved verwenden, um ein besseres Beispiel zu geben. Hier ist, wie sollten Sie Setup die Szene:

import SpriteKit 

class GameScene: SKScene, SKPhysicsContactDelegate { 

    let missile = SKSpriteNode(imageNamed: "seeking_missile") 

    let missileSpeed:CGFloat = 3.0 

    override func didMoveToView(view: SKView) { 

     missile.position = CGPoint(x: frame.midX, y: frame.midY) 

     addChild(missile) 
    } 
} 

Zielen

das Zur Umsetzung streben Sie berechnen haben, die, wie viel Sie ein Sprite basierend auf sein Ziel drehen. In diesem Beispiel werde ich eine Rakete benutzen und sie auf den Touch-Ort zeigen lassen. Um dies zu erreichen, sollten Sie ATAN2 Funktion, wie folgt aus (innen touchesMoved:-Methode) verwenden:

if let touch = touches.first { 

    let location = touch.locationInNode(self) 

    //Aim 
    let dx = location.x - missile.position.x 
    let dy = location.y - missile.position.y 
    let angle = atan2(dy, dx) 

    missile.zRotation = angle 

} 

Beachten Sie, dass atan2 akzeptiert Parameter in y, x bestellen, anstatt x, y.

Also gerade jetzt, wir haben einen Winkel, in dem Rakete gehen sollte. Jetzt aktualisiert seine Position auf diesem Winkel basierend kann (hinzufügen, um diese innerhalb touchesMoved: Methode direkt unter dem Ziel Teil):

//Seek 
let vx = cos(angle) * missileSpeed 
let vy = sin(angle) * missileSpeed 

missile.position.x += vx 
missile.position.y += vy 

Und das wäre es. Hier ist das Ergebnis:

seeking missile

Beachten Sie, dass in Sprite-Kit der Winkel von 0 Radiant die positive x-Achse angibt. Und der positive Winkel im Gegen-Uhrzeigersinn:

polar coords

mehr here lesen.

Dies bedeutet, dass Sie Ihre Rakete nach rechts missile nose points to the right statt nach oben enter image description here orientieren sollten. Sie können auch das nach oben gerichtete Bild verwenden, aber Sie müssen so etwas tun:

+1

Großartig! Perfekte Antwort und schätzen die detaillierten Erklärungen! – JimmyJammed

+0

hervorragend! Vielen Dank –

Verwandte Themen