【问题标题】:How to spawn images forever? Sprite-Kit如何永远生成图像?精灵套件
【发布时间】:2020-06-30 14:31:15
【问题描述】:

我试图在我的游戏中创建一个躲避球功能,我需要重复生成一个躲避球,而我使用的当前代码(如下所示)导致 线程 1:异常:“尝试添加一个已经有的 SKNode父级:名称:'(null)'纹理:['dodgeball5'(500 x 500)]位置:{-140.00019836425781,-55.124687194824219}规模:{1.00,1.00}大小:{30,30}锚:{0.5, 0.5} 旋转:0.00"。我做错了什么?

class ClassicLevelScene: SKScene { 
// Right Pointing Cannons
var rightPointingCannon: [SKReferenceNode] = []

// Dodgeball 5 Constants
var dodgeball5 = SKSpriteNode(imageNamed: "dodgeball5")

// Dodgeball SKActions
var dodgeballRepeat = SKAction()
let dodgeballMoveLeft = SKAction.moveBy(x: -400, y: 0, duration: 0.5)
let dodgeballMoveRight = SKAction.moveBy(x: 400, y: 0, duration: 0.5)
let dodgeballMoveDone = SKAction.removeFromParent()
let dodgeballWait = SKAction.wait(forDuration: 1)
var dodgeballLeftSequence = SKAction()
var dodgeballRightSequence = SKAction()


override func didMove(to view: SKView) {

    // Cannon Setup
    for child in self.children {
      if child.name == "rightPointingCannon" {
        if let child = child as? SKReferenceNode {
            rightPointingCannon.append(child)
            dodgeball5.position = child.position
            run(SKAction.repeatForever(
              SKAction.sequence([
                SKAction.run(spawnDodgeball),
                SKAction.wait(forDuration: 1.0)
                ])
            ))

        }
      }
    }
    
    // Dodgeball Right Sequence
    dodgeballRightSequence = SKAction.sequence([dodgeballMoveRight, dodgeballMoveDone, dodgeballWait])


}

func spawnDodgeball() {
    dodgeball5.zPosition = -1
    dodgeball5.size = CGSize(width: 30, height: 30)
    addChild(dodgeball5)
    dodgeball5.run(dodgeballRightSequence)
}
}

【问题讨论】:

    标签: ios swift xcode sprite-kit


    【解决方案1】:

    假设单球和球可以离开屏幕:

    我实际上建议不要克隆精灵。 只需重复使用它。

    一旦它离开屏幕,您可以重置它的位置和速度并再次显示它。不需要创建很多对象,如果你只需要一个。

    【讨论】:

    • 可靠的建议,但如果这与本例相关,则有太多未知变量无法推断。我们不知道屏幕上一次可以有多少个球。我们甚至不知道球能否离开屏幕
    • 我同意第一部分。但即便如此,缓存也可能是处理此问题的更好方法。而且由于他将球从屏幕上移开,我认为它们可见的时间是有限的。此外,该名称暗示比赛中的球数很可能是有限的。但这些都是公平的观点。
    • 同意。我总是试图推动缓存和重用。但是,我总是根据我认为 OP 的技能集来回答我的问题。我不觉得缓存会有所帮助,而是根据代码示例和 OP 先前的问题感到困惑。我通过提出一个容易获得结果的简单解决方案来解决我的答案,同时为其他方面提供小代码建议。我见过很多人第一次尝试失败,然后被复杂的解决方案淹没,然后退出。不要说你的想法是错的,因为它是伟大的想法,只是证明我的婴儿步骤答案是正确的
    【解决方案2】:

    一个 SKNode 一次只能有 1 个父节点。

    您需要先创建一个新的 SKSpriteNode 或克隆 dodgeball5 才能在 spawnDodgeball() 上再次添加

    你可以使用

    addChild(dodgeball5.copy())

    而不是

    addChild(dodgeball5)

    但要确保 dodgeball5 之前没有父级。

    【讨论】:

      【解决方案3】:

      您的代码似乎过于复杂。

      您需要做的就是复制()您的球并将其添加到您的场景中

      您的所有 SKAction 也不需要在类级别声明

      目前还不清楚为什么只实例化一个大炮时要创建一组大炮

      class ClassicLevelScene: SKScene { 
      
          // Dodgeball 5 Constants
          var dodgeball5 = SKSpriteNode(imageNamed: "dodgeball5")
          
          override func didMove(to view: SKView) {
          
              setupCannonAndBall()
      
              let dodgeballMoveRight = SKAction.moveBy(x: 400, y: 0, duration: 0.5)
              let dodgeballMoveDone = SKAction.removeFromParent()
              let dodgeballWait = SKAction.wait(forDuration: 1)
      
              dodgeballRightSequence = SKAction.sequence([dodgeballMoveRight, dodgeballMoveDone, dodgeballWait])
      
              //setup sequences ^ before spawning ball
              let spawn = SKAction.run(spawnDodgeball)
              let wait = SKAction.wait(forDuration: 1.0)
              run(SKAction.repeatForever(SKAction.sequence([spawn, wait])))
          }
      
          func setupCannonAndBall() {
      
              if let cannonRef = SKReferenceNode(fileNamed: "rightPointingCannon") {
      
                  dodgeball5.position = cannonRef.position
                  dodgeball5.isHidden = true
                  dodgeball5.size = CGSize(width: 30, height: 30)
                  dodgeball5.zPosition = -1
              }
          }
      
          func spawnDodgeball() {
      
              let dodgeball = dodgeball.copy()
              dodgeball.isHidden = false
              addChild(dodgeball)
      
              dodgeball.run(dodgeballRightSequence)
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2014-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-23
        • 1970-01-01
        • 2013-02-11
        • 2014-07-27
        相关资源
        最近更新 更多