2017-04-14 89 views
1

我的代碼遇到了一些麻煩。我試圖讓殭屍按照我的球員用下面的代碼周圍:如何使SKSpriteNode跟隨另一個SKSpriteNode

class GameScene: SKScene, SKPhysicsContactDelegate { 
    func Enemies() { 
     Enemy = SKSpriteNode(imageNamed: "Spaceship") 
     Enemy.size = CGSize(width: 50, height: 50) 
     Enemy.color = UIColor(red: 0.9, green: 0.1, blue: 0.1, alpha: 1.0) 
     Enemy.colorBlendFactor = 1.0 

     //physics 
     Enemy.physicsBody = SKPhysicsBody(rectangleOf: Enemy.size) 
     Enemy.physicsBody?.isDynamic = true 
     Enemy.physicsBody?.affectedByGravity = false 
     Enemy.name = "Enemy" 

     Enemy.position.y = -frame.size.height/2 
     let positionX = arc4random_uniform(UInt32(frame.size.width)) 
     Enemy.position.x = CGFloat(positionX) 
     addChild(Enemy) 
    } 

    override func didMove(to view: SKView) { 

     enemyTimer = Timer.scheduledTimer(timeInterval: 0.5, target: self, selector: #selector(GameScene.Enemies), userInfo: nil, repeats: true) 

    override func update(_ currentTime: TimeInterval) { 
     Enemy.run(SKAction.move(to: ship.position, duration: 3)) 
    } 

如果我運行這段代碼,我可以生成殭屍,但他們不會跟着我的主力球員,他們將只是去(即在時間= 0產生的殭屍會在時間= 0時進入船隻位置,在時間= 1時產生的殭屍將在時間= 1時進入船隻位置,依此類推)。但是,如果我運行此代碼,而只產生一個殭屍像這樣:

override func didMove(to view: SKView) { 
    Enemies() 
} 

孤獨的殭屍會跟隨我的玩家。任何想法爲什麼代碼適用於一個殭屍,但不適用於多個殭屍?

+0

很多問題在這裏...你不應該使用計時器。它不與遊戲循環配對。其次,你不應該每秒執行60次新動作來實現[target and a seeker behavior](http://stackoverflow.com/a/36235426/3402095)接下來,要記住的一件好事是該行爲一經創建就無法修改。意思是,當你設置動作的參數一次,你不能以後修改它們。此外,你的敵人變量是全球性的,這對我來說沒有意義。它只保留對最後一個敵人的引用。我的意思是說,你的邏輯在這種情況下可能是錯誤的...... – Whirlwind

回答

2

我不會建議不斷在您的更新週期中添加操作,由於所有幕後發生的事情,您將遭受性能損失。相反,使用SKAction.customAction,你只能添加到你的精靈一次。
下面是一個自定義操作的例子,它將做你想做的事情,記住只分配一次。 (代碼沒有經過測試,所以可能需要編輯)

let customActionBlock = 
{ 
    (node,elapsedTime) in 
    let dx = ship.x - node.position.x 
    let dy = ship.y - node.position.y 
    let angle = atan2(dx,dy) 
    node.position.x += sin(angle) * speedPerFrame 
    node.position.y += cos(angle) * speedPerFrame 

} 

let duration = TimeInterval(Int.max) //want the action to run infinitely 
let followPlayer = SKAction.customAction(withDuration:duration,actionBlock:customActionBlock) 
Enemy.run(action:followPlayer,withKey:"follow") 
-1

也許你應該在Enemy之前removeAllActions()閱讀操作。看起來你的行爲需要3秒鐘,但是每一幀都要添加一個動作,所以它一次最多有180個動作。

+0

我已經試過了,並沒有改變結果 –

+0

檢查'ship'是否是'struct'或'class'。也許它是一個'struct',你只需要複製值並且以後再不更新 - 它應該是'class'。 – Alistra