簡體   English   中英

依次更改SKAction.wait(forDuration:)

[英]Change SKAction.wait(forDuration: ) in sequence

我有這個。 它可以運行,但是現在我必須更改forDuration: 10 5 forDuration: 10 在動作序列中有4個精靈在給定的時間內移動其路徑。 一旦運行序列,就無法更改forDuration: 10

有人可以在那里幫助我嗎?

let s1_1 = SKAction.run{let unit = S1(); unit.gegnerSpeed = 100; unit.moveAlongPath(self.pfadGegner);self.addChild(unit)}
let s1_2 = SKAction.run{let unit = S1(); unit.gegnerSpeed = 80; unit.moveAlongPath(self.pfadGegner);self.addChild(unit)}


let action1 = SKAction.sequence([
                s1_1, SKAction.wait(forDuration: 10),
                s1_2, SKAction.wait(forDuration: 10),
                s1_1, SKAction.wait(forDuration: 10),
                s1_2, SKAction.wait(forDuration: 10)    ])
            let sequenz = SKAction.sequence([action1, SKAction.run {
                self.letzterGegnerLos = true
                }])
            run(SKAction.repeat(sequenz, count: 1))

非常感謝。

我不確定為什么要在場景中運行動作來運行動作,而是應該在特定節點上執行動作。 但這就是說,一旦分配了一個序列,就我所知,就無法更改其內部的動作。 這意味着您必須刪除序列,並為新序列分配新的等待時間。

還是你

在像您這樣的情況下,可以操縱動作或節點的speed屬性。 要控制動作的速度,您需要使用node.action(forKey:"key")提取動作。 唯一的問題是,您可以控制序列中所有動作的速度。

相反,讓我們更改節點的速度。

為此,我建議使用變量來分配速度:

let dSpeed = 1
let action1 = SKAction.sequence([

            s1_1,
            SKAction.run{[unowned self] in self.speed = dSpeed}, 
            SKAction.wait(forDuration: 10),
            SKAction.run{[unowned self] in self.speed = 1}, 
            s1_2,
            SKAction.run{[unowned self] in self.speed = dSpeed}, 
            SKAction.wait(forDuration: 10),
            SKAction.run{[unowned self] in self.speed = 1},
            s1_1, 
            SKAction.run{[unowned self] in self.speed = dSpeed},
            SKAction.wait(forDuration: 10),
            SKAction.run{[unowned self] in self.speed = 1},
            s1_2, 
            SKAction.run{[unowned self] in self.speed = dSpeed},
            SKAction.wait(forDuration: 10),
            SKAction.run{[unowned self] in self.speed = 1}    ])
        let sequenz = SKAction.sequence([action1, SKAction.run {
            self.letzterGegnerLos = true
            }])
        run(SKAction.repeat(sequenz, count: 1))

當然,現在我們在場景快速運行方面遇到了問題。 這就是為什么我要質疑為什么要在場景中運行事物的原因。

從代碼的外觀來看,您需要一個生成節點來生成單元。 讓我們來創建它。

lazy var spawnNode = {
                         [unowned self] in
                         let node = SKNode()
                         self.addChild(node)
                         return node
                     }()

一旦您訪問spawnNode ,它將創建它並將其添加到場景中。

接下來,我們設置您的生成功能。

func spawn(_ speed:int)
{
    let unit = S1()
    unit.gegnerSpeed = speed
    unit.moveAlongPath(self.pfadGegner)
    self.addChild(unit)
}

最后,讓我們開始行動

let s1_1 = SKAction.run{spawn(100)}
let s1_2 = SKAction.run{spawn(80)}
let dSpeed = 1
let action1 = SKAction.sequence([

            s1_1,
            SKAction.run{spawnNode.speed = dSpeed}, 
            SKAction.wait(forDuration: 10),
            SKAction.run{spawnNode.speed = 1}, 
            s1_2,
            SKAction.run{spawnNode.speed = dSpeed}, 
            SKAction.wait(forDuration: 10),
            SKAction.run{spawnNode.speed = 1},
            s1_1, 
            SKAction.run{spawnNode.speed = dSpeed},
            SKAction.wait(forDuration: 10),
            SKAction.run{spawnNode.speed = 1},
            s1_2, 
            SKAction.run{spawnNode.speed = dSpeed},
            SKAction.wait(forDuration: 10),
            SKAction.run{spawnNode.speed = 1}    ])
        let sequenz = SKAction.sequence([action1, SKAction.run {
            self.letzterGegnerLos = true
            }])
        run(SKAction.repeat(sequenz, count: 1))

現在,如果我們希望節點產生速度快兩倍,則執行dSpeed = 2 如果我們希望節點產生速度慢兩倍,則執行dSpeed = 0.5 通過這種方式,我們不會以任何方式操縱場景的速度。

請注意,我在運行塊之前和之后而不是在序列的開頭和結尾進行速度更改的原因是,以防萬一您需要進行任何動畫處理。 現在設置代碼的方式立即運行塊,因此您可以避免在開頭設置dSpeed,在最后設置1。 但是,如果由於某種原因在生成節點之后立即放置了移動動作,則該移動動作將使用生成節點的速度。 因此,如果您只打算執行運行塊,那么這是可以接受的。

let action1 = SKAction.sequence([
        SKAction.run{spawnNode.speed = dSpeed}, 
        s1_1,     
        SKAction.wait(forDuration: 10),
        s1_2,
        SKAction.wait(forDuration: 10),
        s1_1, 
        SKAction.wait(forDuration: 10),
        s1_2, 
        SKAction.wait(forDuration: 10),
        SKAction.run{spawnNode.speed = 1}    ])
    let sequenz = SKAction.sequence([action1, SKAction.run {
        self.letzterGegnerLos = true
        }])
    run(SKAction.repeat(sequenz, count: 1))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM