SpriteKit:离开屏幕后如何删除对象?

时间:2017-03-08 02:38:05

标签: swift sprite-kit

我有一个岩石精灵,它正在下降,每次它离开屏幕我想重置它回到顶部并让它再次下降。它应该是一个连续的循环。这是我的代码:

import SpriteKit
import GameplayKit

class GameScene: SKScene {

func addRock(){
    var rock = self.childNode(withName: "rock")
    rock?.physicsBody?.affectedByGravity = true
    //self.addChild(rock!)
}

override func sceneDidLoad() {
    //bRock = self.childNode(withName: "rock")
    }

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    //addRock()
    var rock = self.childNode(withName: "rock")
    rock?.physicsBody?.affectedByGravity = true
    /*if (Int((rock?.position.y)!) < Int((self.view?.scene?.view?.bounds.minY)!)){
        print("out of screen")
        rock?.removeFromParent()
        addRock()
    }*/
    }


override func update(_ currentTime: TimeInterval) {
    // Called before each frame is rendered
    var rock = self.childNode(withName: "rock")
    //rock?.physicsBody?.affectedByGravity = true
    if (!intersects(rock!)){
     print("out of screen")
     rock?.removeFromParent()
     addRock()
     }

}
}

我让摇滚在屏幕上然后掉下来。一旦它离开屏幕,它不会重置,我收到一个错误。我尝试将重置代码放在touchesBegan和更新函数中,但都不起作用。如果有人能指导我走正确的道路,那将非常感激。

3 个答案:

答案 0 :(得分:0)

您遇到的问题是您要从场景中移除摇滚节点,但addRock方法实际上并未添加新摇滚,它只是找到现有节点如果有,并在其physicsBody上设置属性。您应该只更改其位置,而不是删除节点。

假设您的场景的默认锚点为(0,0),您可以像这样重置位置:

override func update(_ currentTime: TimeInterval) {
    // Called before each frame is rendered
    if let rock = self.childNode(withName: "rock") {
    if !intersects(rock!) {
        print("out of screen")
        rock.position.y = size.height/2 // divided by 2 as discussed in comments
    }
}

这会将摇滚的位置重置到场景的顶部,并且应该从那里恢复掉落。

答案 1 :(得分:0)

三种方式:

  1. 离开屏幕后,同一块岩石新位于正确的位置,所以你只需要设置它的位置(错误命名)addRockresetRock应该更好):{{ 1}}。但要注意你还需要重置它的速度等,因为它之前被物理定律所感动......
  2. 每次在rock.position = CGPoint(...) addRock离开屏幕时创建一个新的摇滚(以及它的所有初始化代码。更简单,因为默认情况下所有物理参数都将使用正确的值进行初始化。
  3. 创建一个初始摇滚的克隆。我想你的sks文件中有一个模型,然后不要将它命名为rock(岩石模型),只需在let rock = SKSpriteNode(...)...中克隆它,并给它正确的名称addRock。不要忘记在开始时从场景中删除模型。这是通常的做法。

答案 2 :(得分:0)

您还可以考虑按顺序使用一系列移动动作来控制岩石的行为。鉴于已经定义了移动动作,请按照您定义的顺序,依次进行[(掉落,隐藏,回到顶部,取消隐藏)]-永远重复。

只要岩石实际上不与任何东西相互作用,而仅用于背景/背景,则隐藏和隐藏它们是使它们坠落的效果的好方法。