2016-03-26 22 views
3

私は、敵が右からアプローチしている間に、プレイヤーを画面の左側に配置する簡単なスプライトキットゲームを作成しています。プレイヤーは上下に動かすことができるので、敵がプレイヤーに向かって自分の道を「スマートに」調整するようにします。移動中のプレーヤーに向かって敵を移動する方法は?

プレイヤーが移動するたびにSKActionシーケンスを削除して再追加しようとしましたが、以下のコードでは敵がまったく表示されません。おそらく、移動するチャンス。

いつでもプレーヤーのポジションに向かって移動する「スマート」な敵を作成するためのベストプラクティスについてのご意見をお寄せください。メソッド呼び出し:あなたは、各アップデートで敵positionzRotationプロパティを更新する必要が

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

「正しく動作しません」は技術用語ではありません。私たちは、あなたの期待と不適切なことについて完全な情報を必要としています。 – Rob

+0

@Rob曖昧さを残して申し訳ありませんが、今のところ上記のコードは敵を表示させません。おそらく、フレームごとに各アクションを追加したり削除したりするだけで、移動する機会は決してないからです。ありがとう! – JimmyJammed

+1

あなたは正しいとマークした回答を得ていますが、GameplayKit(ios 9 API)を調べることを強くお勧めします。それは、あなたがはるかに良く、より簡単にしたいようなものを作る敵探索と経路探索を含むより柔軟なゲーム設計のためのツールを提供します。これについてのWeb上にいくつかの良いチュートリアルがあります。 https://www.raywenderlich.com/119959/gameplaykit-tutorial-entity-component-system-agents-goals-behaviorsおよびhttp://code.tutsplus.com/tutorials/an-introduction-to-gameplaykit-part- 1 - cms-24483 – crashoverride777

答えて

9

は、ここに私のコードです。

シーカーとターゲット

わかりましたので、シーンにいくつかのノードを追加することができます。シーカーとターゲットが必要です。シーカーはミサイルであり、ターゲットはタッチ位置になるだろう。私はupdate:メソッドの内部でこれを行うべきだと言ったが、より良い例を作るためにtouchesMovedメソッドを使用する。あなたがそのターゲットに基づいてスプライトを回転させるために持っているどのくらいの計算する必要が狙いを実現するために

を目指し

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) 
    } 
} 

:どのようにセットアップシーンべきここにあります。この例では、私はミサイルを使用してタッチ位置に向けて指し示します。 atan2はY、Xの順ではなく、X、Yのパラメータを受け入れること

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 

} 

注:これを実現するために、あなたは、この(touchesMoved:メソッド内)のように、ATAN2機能を使用する必要があります。

だから今、私たちはミサイルが行くべき角度を持っています。

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

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

をそして、それはそれを次のようになります。今、その角度に基づいて更新の地位をすることができます(右目指し部未満この内部touchesMoved:メソッドを追加します)。スプライト・キットに0ラジアンの角度が正のx軸を指定していること

seeking missile

注:ここでの結果です。そして、正の角度は反時計回りの方向にあります。

polar coords

here続きを読みます。

これは、上向きenter image description hereではなく、右にmissile nose points to the rightにミサイルを向ける必要があることを意味します。上向きの画像も使用できますが、次のようにする必要があります。

missile.zRotation = angle - CGFloat(M_PI_2) 
+1

素晴らしい!完璧な答えと詳細な説明に感謝! – JimmyJammed

+0

が絶品!ありがとうございました –

関連する問題