【问题标题】:Adding Array to move group of images in for loop in Swift : SpriteKit在 Swift 中添加数组以在 for 循环中移动图像组:SpriteKit
【发布时间】:2014-12-01 18:40:39
【问题描述】:

如何将我的 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))
    }

}

}

【问题讨论】:

  • 我不知道 Sprite 节点,但我想如果你将在场景或视图中添加所有星星并将场景向下移动,那么结果将是你想要的。跨度>
  • 您能否提供更多详细信息,例如错误信息?
  • 您是否尝试将它们作为子节点添加到一个父节点并移动该父模式?

标签: ios arrays swift sprite-kit


【解决方案1】:

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

  1. 您已经将所有星星(我猜是这样)组合在一个公共父节点(您正确命名为 Stars)内。然后,您只需移动 Stars 类型的节点,其所有子节点都会自动移动。
  2. 在更新方法中手动更改节点的坐标确实有效,但(恕我直言)这不是移动它的最佳方式。您应该改用 SKAction

所以,如果你想以共同的速度和方向永远移动星星,你可以将此方法添加到 Stars

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。

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

【讨论】:

    【解决方案2】:
    for (SKSpriteNode *spriteNode in starSqArray) {
        spriteNode.position = CGPoint(x: spriteNode.position.x , y: spriteNode.position.y + GFloat(_starSpeed1))
    }
    

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

    希望这会有所帮助...

    【讨论】:

    • 我认为这不会达到他想要的效果。这将使 starSqArray 中的每个精灵都具有完全相同的 X、Y 位置。什么 appzYourLife 更正确,因为 starSqArray 中的所有精灵都是 Stars 的孩子,所以只需移动 Star 就会将所有孩子移动到他们随机分布的位置。如果您不想移动 Stars 节点本身,那么我将拥有一个子节点并让子节点包含所有 startSqArray 精灵并移动子节点。
    • 如果您确实想这样做,您可以选择 spriteNode.position = CGPoint(x: spriteNode.position.x, y: spriteNode.position.y + CGFloat(_startSpeed1)) 但是移动父节点要好得多。
    猜你喜欢
    • 1970-01-01
    • 2014-11-03
    • 2023-01-01
    • 2023-04-03
    • 2020-03-20
    • 1970-01-01
    • 1970-01-01
    • 2011-11-05
    • 1970-01-01
    相关资源
    最近更新 更多