簡體   English   中英

如何更改等待由 SKScene 運行的 SKAction 持續時間?

[英]How to change wait for duration SKAction ran by an SKScene?

在我的 SpriteKit 項目中,我有一個spawnEnemy方法。 我希望這個方法被一遍又一遍地調用,以便敵人在整個游戲中繼續產生。

我所做的就是將spawnEnemy方法放在SKAction runBlock中,並讓我的SKScene永遠運行該操作,並在調用之間延遲(以防止應用程序過載)。

以下是相關代碼的片段:

var _spawnSpeedSeconds: Double = 2.0

func startSpawning()
{
   let waitForXSeconds = SKAction.waitForDuration(self._spawnSpeedSeconds)

   let spawn = SKAction.runBlock({ () -> Void in
            self.spawnEnemy()
        })      
   self.runAction(SKAction.repeatActionForever(SKAction.sequence([spawn, waitForXSeconds])), withKey: "spawnEnemy")
}

func spawnEnemy()
{
...
}

現在經過一段時間后(例如當玩家獲得 5 分或其他東西時),我會降低 _spawnSpeedSeconds 以使敵人在更短的時間內產生更多以增加難度。

問題是,即使我減少了我的 _spawnSpeedSeconds 變量,SKScene 運行的生成動作的延遲仍然是相同的。

我能想到的解決此問題的唯一方法是刪除該動作,然后以新的延遲/生成率重新添加該動作。 有沒有更好的方法來解決這個問題?

謝謝

在這種情況下,請勿使用動作。 它們實際上並不是以動態方式工作的。 一旦設置好它們,它們就會卡住。 只需使用您的更新方法。

我將向您展示如何定期發射導彈:

首先在課堂上設置兩個計時器

var missleTimer:NSTimeInterval = NSTimeInterval(2)
var missleInterval:NSTimeInterval = NSTimeInterval(2)

現在,在我們的更新方法中,我們倒計時並生成導彈

// subtract time from our timer
self.missleTimer -= self.delta

// when our timer reaches zero
if self.missleTimer <= 0 {
    // run your spawning code
    self.launchMissle()
    // reset timer
    self.missleTimer = self.missleInterval
} 

這比在這種情況下使用操作要好,因為我可以在代碼中的任何地方設置missleInterval ,並且更改始終會得到反映。

-(void)recursiveMethod
{
    if(shouldSpawnEnemy)
    {
        _spawnSpeedSeconds -= 0.01;
        SKAction *wait = [SKAction waitForDuration: 0.5];
        SKAction *action = [SKAction performSelector:@selector(recursiveMethod) onTarget:self];
        SKAction *sequence = [SKAction sequence:@[wait,action]];
        [self repeatActionForever:sequence];
    }
}

要開始生成敵人時,請記住調用recursiveMethod。 希望能有所幫助。

提供 swift 解決方案,無需計時器,使用帶有斷路器標志的遞歸:

class YourScene: SKScene {
    
    var gameOver: Bool = false

    func spawnEnemies() {
        let waitAction = SKAction.wait(forDuration: yourDynamicDurationHere)
        self.run(SKAction.sequence([SKAction.run(self.spawnEnemy), waitAction])) {
            if !gameOver {
                spawnEnemies()
            }
        }
    }
}

該解決方案利用run方法的完成處理程序遞歸地安排序列的另一個執行。 由於每個單獨的SKSequence都是在執行之前創建的,因此我們可以為每次迭代傳遞不同的等待時間。

要停止遞歸循環,只需設置gameOver = true。

暫無
暫無

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

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