正如我所說的有很多,其必須完成的變化:
首先,讓我們改變MLWall類,並添加將在startMoving方法中使用的持續時間屬性:
var duration:NSTimeInterval = 0.5
然後還MLWall類中更改init方法:
init(duration: NSTimeInterval) {
self.duration = duration
//...
}
,並更改startMoving方法來使用這個傳遞的參數:
func startMoving() {
let moveLeft = SKAction.moveByX(-kDefaultXToMovePerSecond, y: 0, duration: self.duration)
runAction(SKAction.repeatActionForever(moveLeft))
}
這些是Wall類內部的變化。現在,讓我們對WallGenerator類進行一些更改:
第一個WallGenerator類應該知道牆的走多快。因此,我們要添加屬性來存儲信息:
var currentDuration: NSTimeInterval = 1 // I named it duration, because SKAction takes duration as a parameter, but this actually affects on speed of a wall.
之後,這必須改變第一種方法是startGeneratingWallsEvery(第二:)到startGeneratingWallsEvery(二:時間:
//duration parameter added
func startGeneratingWallsEvery(seconds: NSTimeInterval, duration : NSTimeInterval) {
self.currentDuration = duration
generationTimer = NSTimer.scheduledTimerWithTimeInterval(seconds, target: self, selector: "generateWall", userInfo: nil, repeats: true)
}
在這裏,我們。正在一個WallGenerator意識到希望的壁的速度的 並且具有爲了使用該速度要被改變的下一個方法是:
//duration parameter added
func generateWall() {
//...
//Duration parameter added
let wall = MLWall(duration: self.currentDuration)
//...
}
還有一個GameScene離開了。在那裏,我添加了一個tapCounter屬性:
let debugLabel = SKLabelNode(fontNamed: "Arial") //I've also added a debug label to track taps count visually
var tapCounter = 0
這裏,如果你想看到抽頭數數你如何初始化標籤:
//Setup debug label
debugLabel.text = "Tap counter : \(tapCounter)"
debugLabel.position = CGPoint(x: CGRectGetMidX(frame), y: CGRectGetMaxY(frame)-50.0)
debugLabel.fontColor = SKColor.purpleColor()
self.addChild(debugLabel)
首先,我已經改變了啓動方法:
func start() {
//...
// adding duration parameter in method call
wallGenerator.startGeneratingWallsEvery(1,duration: 1)
}
重要的部分是:wallGenerator.startGeneratingWallsEvery(1,duration: 1)
它說開始產生壁每秒與一個第二持續時間(其影響上節點的速度)。
接下來,我修改的touchesBegan現場到這一點:
if isGameOver {
restart()
} else if !isStarted {
start()
} else {
tapCounter++
debugLabel.text = "Tap counter : \(tapCounter)"
if(tapCounter > 10){
wallGenerator.stopGenerating()
wallGenerator.startGeneratingWallsEvery(0.5, duration:0.5)
}
hero.flip()
}
然後,改重啓()方法,以重新啓動計數器,當遊戲結束:
func restart() {
tapCounter = 0
//...
}
而這幾乎它。我想我沒有忘記一些東西,但是在我的身邊,它應該如此。另外請注意,使用NSTimer就像這個GitHub project不是你想要的SpriteKit。這是因爲NSTimer不尊重場景,視圖或節點的暫停狀態。這意味着即使你認爲遊戲已經暫停,它仍會繼續產卵。 SKAction將是這種情況的首選替代品。
希望這會有所幫助,如果您還有其他問題,請隨時提問,但我想您可以從上面的代碼中瞭解正在發生的事情。基本上什麼做的是WallGenerator已經意識到他們的牆上節點應該有多快,以及華爾街節點已意識到這一點應該有多快......
編輯:
還有另一種方式通過用鑰匙移動動作來改變牆壁的速度。然後,在產卵的時候,根據tapCounter值,你可以通過鍵訪問一個移動的動作,並直接改變動作的速度屬性......這可能是一個更短的方法,但仍然需要一些改變(在裏面傳遞一個持續時間參數牆上的課堂和實現裏面的tapCounter)。
它看起來像你正在現場運行一個動作。嘗試在牆上節點上運行一個動作。 – Whirlwind
我在牆上運行這個類 –
它看起來不像你發佈的代碼。 startMoving()方法是Wall類還是GameScene類的成員?如果它是GameScene類的成員,那麼你應該這樣做:wallNode.runAction(...)而不是runAction(...) – Whirlwind