2015-10-19 122 views
0

我開始使用SKS文件來快速創建遊戲,在這個遊戲中,我試圖讓敵人在手機屏幕的寬度內隨機產卵,而不是整個sks文件現場只在屏幕寬度內隨機生成敵人

override func didMoveToView(view: SKView) { 
    self.physicsWorld.contactDelegate = self 
    NSTimer.scheduledTimerWithTimeInterval(0.2, target: self, selector: Selector("spawnEnemy"), userInfo: nil, repeats: true) 
} 

func spawnEnemy(){ 
    //supposed to pick random point within the screen width 
    let xPos = Int.random(self.frame.width) 

    enemy = SKSpriteNode(imageNamed: "enemy") 
    enemy.position = CGPointMake(CGFloat(xpos), self.frame.size.height/2) 
    enemy.physicsBody = SKPhysicsBody(circleOfRadius: 7) 
    enemy.physicsBody?.affectedByGravity = true 
    enemy.physicsBody?.categoryBitMask = 0 
    enemy.physicsBody?.contactTestBitMask = 1 
    addChild(self.enemy) 
} 
+0

首先,使用SKAction或更新:產卵的方法。如果節點,場景或視圖暫停,NSTimer不受影響,因此可能導致「麻煩」。其次,您試圖一遍又一遍地添加相同的節點(在spawnEnemy方法中添加self.enemy)。你應該創建一個新的節點,或者至少創建一個現有節點的副本,然後再將它添加到場景中(如果你嘗試添加一個已經有父節點的節點,你將會得到一個錯誤)。您的代碼中還有一些拼寫錯誤。修復這一切,看看它是否工作。讓我知道你是否需要一個代碼示例。 – Whirlwind

回答

1

不管怎麼說,我寫了一個例子,你:)

所以,這裏就是你們的榜樣應該是什麼樣子才能工作:

override func didMoveToView(view: SKView) { 
     self.physicsWorld.contactDelegate = self 

     NSTimer.scheduledTimerWithTimeInterval(0.2, target: self, selector: Selector("spawnEnemy"), userInfo: nil, repeats: true) 


    } 


    func randomBetweenNumbers(firstNum: CGFloat, secondNum: CGFloat) -> CGFloat{ 
     return CGFloat(arc4random())/CGFloat(UINT32_MAX) * abs(firstNum - secondNum) + min(firstNum, secondNum) 
    } 

    func spawnEnemy(){ 
     //supposed to pick random point within the screen width 
     let xPos = randomBetweenNumbers(0, secondNum: frame.width) 

     let enemy = SKSpriteNode(imageNamed: "enemy") //create a new enemy each time 
     enemy.position = CGPointMake(CGFloat(xPos), self.frame.size.height/2) 
     enemy.physicsBody = SKPhysicsBody(circleOfRadius: 7) 
     enemy.physicsBody?.affectedByGravity = true 
     enemy.physicsBody?.categoryBitMask = 0 
     enemy.physicsBody?.contactTestBitMask = 1 
     addChild(enemy) 
    } 

方法randomBetweenNu mbers是從here借來的。

而且,這是你如何可以通過使用SKAction產卵敵人另一種方式:

override func didMoveToView(view: SKView) { 
     self.physicsWorld.contactDelegate = self 

     let wait = SKAction .waitForDuration(1, withRange: 0.5) 

     let spawn = SKAction.runBlock({ 

      self.spawnEnemy() 

     }) 

     let spawning = SKAction.sequence([wait,spawn]) 

     self.runAction(SKAction.repeatActionForever(spawning), withKey:"spawning") 



    } 

方法spawnEnemy仍然在這兩種情況下是相同的。要停止產卵,您可以刪除某個鍵的操作(在這種情況下爲「產卵」)。你可以這樣做:

if((self.actionForKey("spawning")) != nil){ 
     self.removeActionForKey("spawning") 
    } 
+0

與應用程序的問題是,敵人不是在手機屏幕內產卵,他們正在貫穿sks文件。 frame.width獲取整個sks文件的寬度。我只希望範圍只是在手機的寬度內,謝謝你的回覆btw –

+0

@ sk8ertagsk8ertag你真的試過了代碼嗎?在我的身邊,它的工作原理應該如此。沿着從左邊開始到屏幕右側的線生成節點。另一件你應該知道的事情是,當你從.sks文件創建場景時,默認的場景大小是1024x768。但是我認爲你已經正確地初始化你的場景(和視圖)的大小。 – Whirlwind

+0

雅我試過的代碼,但它仍然無法正常工作。你是如何初始化你的場景的 –