2017-03-04 169 views
1

我試圖製作一個遊戲,龍隨機移動,英雄必須避開它。我可以讓龍出現在一個隨機的位置並移動一兩次,但是爲了使它不斷地從一個點移動到另一個點,然後移動一些給我帶來麻煩。我認爲這可能是因爲我沒有在生成所有隨機數之前等待完成操作。我試着下面的代碼,包括標籤,以證明自己的隨機數生成,至少可達20 ...使用Swift隨機移動一個精靈3

import SpriteKit 
import GameplayKit 

class GameScene: SKScene { 

private let greenDragonNode = GreenDragonSprite.newInstance() 
private var lastUpdateTime : TimeInterval = 0 
private var i = 0 

override func sceneDidLoad() { 

    self.lastUpdateTime = 0 

    let xOrigin = CGFloat(arc4random()).truncatingRemainder(dividingBy: size.width) 
    let yOrigin = CGFloat(arc4random()).truncatingRemainder(dividingBy: size.height) 
    let dragonOrigin = CGPoint(x: xOrigin, y: yOrigin) 

    greenDragonNode.position = dragonOrigin 
    greenDragonNode.setScale(0.1) 

    addChild(greenDragonNode) 

    } 

override func didMove(to view: SKView) { 

    for i in 1...20 { 
    let xDestination = CGFloat(arc4random()).truncatingRemainder(dividingBy: size.width) 
    let yDestination = CGFloat(arc4random()).truncatingRemainder(dividingBy: size.height) 
    let dragonDestination = CGPoint(x: xDestination, y: yDestination) 

    let xDestination2 = CGFloat(arc4random()).truncatingRemainder(dividingBy: size.width) 
    let yDestination2 = CGFloat(arc4random()).truncatingRemainder(dividingBy: size.height) 
    let dragonDestination2 = CGPoint(x: xDestination2, y: yDestination2) 

    let dragonNodeTravel = SKAction.move(to:dragonDestination, duration: 3.0) 
    let dragonNodeReturn = SKAction.move(to: dragonDestination2, duration: 3.0) 
    greenDragonNode.run(SKAction.sequence([dragonNodeTravel, dragonNodeReturn])) 

// i += 1 
    let label = SKLabelNode(text: "\(i)") 
    label.position = dragonDestination2 
    addChild(label) 
    } 
} 

} 

回答

0

,因爲只執行從最後一個動作的循環正在發生。您必須制定隊列的操作。所以你應該將它們追加到一個數組中,然後按照如下順序運行它們:

import SpriteKit 

import GameplayKit 

class GameScene: SKScene { 

    private let greenDragonNode = SKSpriteNode(color: .green, size: CGSize(width: 20, height: 20)) 

    func getRandomPoint(withinRect rect:CGRect)->CGPoint{ 

     let x = CGFloat(arc4random()).truncatingRemainder(dividingBy: rect.size.width) 
     let y = CGFloat(arc4random()).truncatingRemainder(dividingBy: rect.size.height) 

     return CGPoint(x: x, y: y) 
    } 

    override func didMove(to view: SKView) { 

     greenDragonNode.position = self.getRandomPoint(withinRect: frame) 

     addChild(greenDragonNode) 

     var actions:[SKAction] = [] 

     for i in 1...20 { 

      let destination = getRandomPoint(withinRect: frame) 

      let move = SKAction.move(to:destination, duration: 1.0) 

      actions.append(move) 

      let label = SKLabelNode(text: "\(i)") 
      label.position = destination 
      addChild(label) 
     } 

     let sequence = SKAction.sequence(actions) 
     greenDragonNode.run(sequence) 

    } 
} 
+0

這與我想要的完全相同,謝謝! – Dominick

+0

@Dominick如果這個答案幫助你解決了你的問題,請考慮接受它。 – Whirlwind