使用Swift 3随机移动精灵

时间:2017-03-04 00:04:43

标签: swift sprite-kit

我试图制作一个龙随机移动的游戏,英雄必须避开它。我可以让龙出现在一个随机位置并移动一次或两次,但是为了让它从一点到另一点连续移动然后再移动一些给我带来麻烦。我想这可能是因为我没有在生成所有随机数之前等待动作完成。我尝试了以下代码,包括标签,以证明随机数正在产生,至少高达20 ......

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)
    }
}

}

1 个答案:

答案 0 :(得分:0)

这种情况正在发生,因为只执行for循环中的最后一个操作。您必须创建队列操作。所以你应该将它们附加到一个数组中,并按顺序运行它们,如下所示:

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)

    }
}