在Swift:SpriteKit中添加Array以在for循环中移动图像组

时间:2014-12-01 18:40:39

标签: ios arrays swift sprite-kit

如何在我的更新功能中将starsSqArray添加到for循环中,以获取所有SKSpriteNodesfor _starsSq1以便所有星星一起移动而不是单独移动?

现在我的Swift课程一直返回一个错误,指出_starsSqArray没有位置(我的代码被排除在外)。我的目标是抓住绘制的星星并一次向下移动它们。

import SpriteKit

class Stars:SKNode {

//Images
var _starsSq1:SKSpriteNode?

//Variables
var starSqArray = Array<SKSpriteNode>()
var _starSpeed1:Float = 5;

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

override init() {
    super.init()
    println("stars plotted")
    createStarPlot()
}

/*-------------------------------------
    ## MARK: Update
-------------------------------------*/
func update() {

    for (var i = 0; i < starSqArray.count; i++) {
        _starsSq1!.position = CGPoint(x: self.position.x , y: self.position.y + CGFloat(_starSpeed1))
    }
}

/*-------------------------------------
    ## MARK: Create Star Plot
-------------------------------------*/

func createStarPlot() {
    let screenSize: CGRect = UIScreen.mainScreen().bounds
    let screenWidth = screenSize.width
    let screenHeight = screenSize.height

    for (var i = 0; i < 150 ; i++) {
        _starsSq1 = SKSpriteNode(imageNamed: "starSq1")
        addChild(_starsSq1!)
        //starSqArray.addChild(_starsSq1)
        var x = arc4random_uniform(UInt32(screenSize.width + 400))
        var y = arc4random_uniform(UInt32(screenSize.height + 400))
        _starsSq1!.position = CGPoint(x: CGFloat(x), y: CGFloat(y))
    }

}

}

2 个答案:

答案 0 :(得分:1)

for (SKSpriteNode *spriteNode in starSqArray) {
    spriteNode.position = CGPoint(x: spriteNode.position.x , y: spriteNode.position.y + GFloat(_starSpeed1))
}

在update()函数中使用上面的代码。

希望这会有所帮助......

答案 1 :(得分:1)

从设计角度提出几点建议:

  1. 你已经把你所有的星星(我猜是这样的)分组到一个共同的父节点(你正确地命名为星星)里面。然后你只需要移动 Stars 类型的节点,它的所有子节点就会自动移动。
  2. 手动更改更新方法中节点的坐标确实有效但是(imho)它不是移动它的最佳方式。您应该使用 SKAction
  3. 所以,如果你想以一个共同的速度和方向永远移动星星,你可以将这个方法添加到星星

    func moveForever() {
        let distance = 500 // change this value as you prefer
        let seconds : NSTimeInterval = 5 // change this value as you prefer
    
        let direction = CGVector(dx: 0, dy: distance)
        let move = SKAction.moveBy(direction, duration: seconds)
        let moveForever = SKAction.repeatActionForever(move)
        self.runAction(moveForever)
    }
    

    现在,您可以删除更新方法中的代码,并在希望星星开始移动时调用moveForever。

    最后,在某些时候星星会离开屏幕。我不知道你想要达到的效果,但你需要处理这个问题。