将 SKSpriteNode 移动 Y - Swift 2 + SpriteKit

Posted

技术标签:

【中文标题】将 SKSpriteNode 移动 Y - Swift 2 + SpriteKit【英文标题】:Move SKSpriteNode by Y - Swift 2 + SpriteKit 【发布时间】:2015-12-25 01:59:50 【问题描述】:

我正在开发一款 2D 游戏,我正在使用 Swift 和 SpriteKit。首先,我开始创建动画对象并向下移动。为了创建这些“对象”,我使用了 Spaceship(Xcode 的资产图像)。

查看我的代码:

import SpriteKit

class GameScene: SKScene 

    var spaceship = SKSpriteNode()

    var screenSize:CGSize!

    var gameStarted:Bool = false

    var moveAndRemove = SKAction()

    override func didMoveToView(view: SKView) 
        /* Setup your scene here */
        screenSize = self.frame.size

        self.createSpaceship()
    


    func createSpaceship() -> Void 
        spaceship = SKSpriteNode()
        spaceship.texture = SKTexture(imageNamed: "Spaceship")
        spaceship.size = CGSize(width: 70, height: 100)
        spaceship.setScale(1.0)

        spaceship.position = CGPoint(x: screenSize.width / 3, y: screenSize.height - 75)

        spaceship.zPosition = 1

        self.addChild(spaceship)
    


    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) 
        if gameStarted == false 
            gameStarted = true

            let spawn = SKAction.runBlock  () in
                self.createSpaceship()
            
            let delay = SKAction.waitForDuration(1.5)
            let spawnDelay = SKAction.sequence([spawn, delay])
            let spanDelayForever = SKAction.repeatActionForever(spawnDelay)
            self.runAction(spanDelayForever)

            let distance = CGFloat(screenSize.height + spaceship.frame.height)
            let moveTargets = SKAction.moveToY(spaceship.frame.origin.y - distance, duration: 8.0)
            let removeTargets = SKAction.removeFromParent()

            moveAndRemove = SKAction.sequence([moveTargets,removeTargets])
        
    

    override func update(currentTime: CFTimeInterval) 
        /* Called before each frame is rendered */
    

但是当我运行游戏时,Spaceship 仍然在展示中。找不到能解决的。

有人可以帮我吗?

宇宙飞船必须向下 (Y),创建副本,然后在 Y 方向向下移动。

【问题讨论】:

尝试使用 moveBy 而不是 moveTo 它没有工作,它仍然停止。 您需要在每艘飞船上运行moveAndRemove 操作。我建议您将动作定义移至 createSpaceship 方法并在您创建的每艘飞船上运行 moveAndRemove 动作。 @0x141E 成功了!非常感谢!把答案发给我标记为正确。 【参考方案1】:

您需要在每艘飞船上运行moveAndRemove 操作。我建议您将动作定义移至 createSpaceship 方法并在您创建的每艘飞船上运行 moveAndRemove 动作。例如,

func createSpaceship() 
    // This can be a local variable and combined into a single statement
    let spaceship = SKSpriteNode(imageNamed: "Spaceship")
    spaceship.size = CGSize(width: 70, height: 100)
    spaceship.setScale(1.0)
    spaceship.position = CGPoint(x: screenSize.width / 3, y: screenSize.height - 75)
    spaceship.zPosition = 1

    let distance = CGFloat(screenSize.height + spaceship.frame.height)
    let moveTargets = SKAction.moveToY(spaceship.frame.origin.y - distance, duration: 8.0)
    let removeTargets = SKAction.removeFromParent()
    let moveAndRemove = SKAction.sequence([moveTargets,removeTargets])

    // Add the action to the list of actions executed by the spaceship
    spaceship.runAction(moveAndRemove)

    self.addChild(spaceship)

【讨论】:

moveAndRemove 实现了什么?我了解 moveToY,但为什么需要删除目标? @Confused 这就是 OP 在目标移动到新位置后想要发生的事情。查看问题。 对不起,我可能问错人了。我只是不明白为什么需要删除“目标”。

以上是关于将 SKSpriteNode 移动 Y - Swift 2 + SpriteKit的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中围绕其起始值上下移动 SKSpriteNode?

将 SKSpriteNode 移动到 SKTileMapNode 上的特定图块

在屏幕上移动 SKSpriteNode

改变移动 SKSpriteNode 的方向?

仅当 SKSpriteNode 是 Fruit 类型时才用手指移动 SKSpriteNode(SKSpriteNode 的子类)

如何围绕节点的 Y 轴旋转 SKSpriteNode?