2015-08-03 48 views
-2

在我的遊戲中,有一個向左移動的「牆」類。我想改變它的基礎上計數i的速度,我加入到touchesBegan方法:如何用count SwiftKit更改運動的持續時間?

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent { 
    count++ 
} 

func startMoving() { 

    let moveLeft = SKAction.moveByX(-kDefaultXToMovePerSecond, y: 0, duration: 1) 

    let move = SKAction.moveByX(-kDefaultXToMovePerSecond, y: 0, duration: 0.5) 

    if(count <= 10) 
    { 
     runAction(SKAction.repeatActionForever(moveLeft)) 
    } 
    else 
    { 
    runAction(SKAction.repeatActionForever(move)) 
    } 
} 

,但它不工作。你能幫我嗎?

+0

它看起來像你正在現場運行一個動作。嘗試在牆上節點上運行一個動作。 – Whirlwind

+0

我在牆上運行這個類 –

+0

它看起來不像你發佈的代碼。 startMoving()方法是Wall類還是GameScene類的成員?如果它是GameScene類的成員,那麼你應該這樣做:wallNode.runAction(...)而不是runAction(...) – Whirlwind

回答

0

嘗試做它像這樣:

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent { 
    count++ 
    startMoving() 

} 

func startMoving() { 
    removeAllActions() 
    let moveLeft = SKAction.moveByX(-kDefaultXToMovePerSecond, y: 0, duration: count <= 10 ? 1.0 : 0.5) 
    runAction(SKAction.repeatActionForever(moveLeft)) 

} 

由於我看了你的問題,下面的評論,你做一個真正不清楚的問題,但無論如何你必須在你的代碼思想體系的問題。

你的touchesBegan方法是在牆上實現的,如果我理解了一切正確的話,那麼它對新生成的牆壁沒有影響。你必須將該邏輯移至現場,然後以速度作爲參數產生新的牆,或者至少使得類var爲count,因此每個牆都可以訪問它,但是仍然必須處理場景中的觸摸,因爲現在觸摸是在用戶直接在牆上輕敲時處理的。

+0

這是行不通的......這些行動的大家一起工作。我需要它每秒1秒,然後每秒0.5秒 –

+0

我提供的代碼允許您的實例每秒鐘通過'kDefaultXToMovePerSecond'移動,直到count等於或大於10,然後它會移動'kDefaultXToMovePerSecond'每半秒鐘。這是一個理想的行爲? – s1ddok

+0

@ s1ddok她正在嘗試改變移動牆的速度,但有一個WallGenerator類生成預定尺寸的牆。由於Wall節點不知道屏幕上的觸摸次數,因此應該以期望的速度進行初始化。有一個名爲Nimble Ninja的GitHub項目...你可以自己下載它,看看我在說什麼...... – Whirlwind

1

正如我所說的有很多,其必須完成的變化:

首先,讓我們改變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)。

相關問題