gpt4 book ai didi

swift - 使用 Swift 在 Sprite 套件的多个场景中重用相同的 Sprite 节点

转载 作者:行者123 更新时间:2023-11-30 10:06:09 24 4
gpt4 key购买 nike

我在我的 GameScene 中创建 Sprite 节点,如下所示。我想在其他 SKScene 中重用 createNodeA1nodeA1。我怎样才能做到这一点?

import SpriteKit

class GameScene: SKScene {

var nodeA1: SKNode!

required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}

override init(size: CGSize) {
super.init(size: size)

// Add sprite node to the scene
nodeA1 = createNodeA1()
addChild(nodeA1)

}
}

// Create dot 1
func createNodeA1() -> SKNode {
let spriteNode = SKNode()
spriteNode.position = CGPointMake(CGRectGetMidX(self.frame)/1.5, CGRectGetMidY(self.frame)/2.0)

let sprite = SKSpriteNode(imageNamed: "dot_1")
sprite.zPosition = 3.0
sprite.name = "A1_Broj"
spriteNode.addChild(sprite)

return spriteNode
}

}

最佳答案

有几种方法可以做到这一点。

您可以使用 loadNode 函数将其他场景子类化为该场景的子类,该函数使这些场景可以访问该函数。

我去年就问过这个问题

Swift multiple level scenes

如果您不熟悉场景子类化,另一种可能更简单的方法是创建节点本身的子类。

所以你创建了一个类

enum EnemyType {
case Normal
case Special
}


class NodeA1: SKSpriteNode {

init(imageNamed: String, enemyType: EnemyType) {
let texture = SKTexture(imageNamed: imageNamed)

if enemyType == .Normal {
super.init(texture: texture, color: SKColor.clearColor(), size: texture.size())
else {
// other init
}

self.zPosition = 1
self.name = ""
// add physics body, other properties or methods for the node

}
}

在 SKScenes 中,您可以像这样在 init 方法中添加节点

  nodeA1 = NodeA1(imageNamed: "ImageName", enemyType: .Normal)
nodeA1.position = ....
addChild(nodeA1)

这样,您添加节点的任何场景都将使用子类,因此包括该节点的所有属性、设置等。子类化的另一个好处是您可以使用

循环遍历所有节点
self.enumerateChildNodesWithName...

然后在所有节点上调用自定义方法。

如果您想对场景进行子类化,则需要创建基本场景

 class BaseScene: SKScene {

// set up all shared stuff in didMoveToView
// have your node function here
// touches began
// physics word and contact collision
// all other stuff that needs to be shared between all level scenes

}

随后的关卡场景将如下所示

  class Level1Scene: BaseScene {

override func didMoveToView(view: SKView) {
super.didMoveToView(view) // This lines imports all stuff in BaseScene didMoveToView


// do level 1 specific setUps.
// you can call any function or property from BaseScene, e.g the loadNode function.
}

您可以像往常一样加载关卡场景,例如,您过渡到第 1 级场景,它将自动使用/有权访问所有父类(super class)方法和 Sprite (BaseScene)。所以你永远不会直接调用baseScene,它会被自动调用。

这也适用于 BaseScene 中的其他方法,因此假设您在 BaseScene 中有一个 Update 方法。

 override func update(currentTime: CFTimeInterval) {.... }

这将适用于作为 BaseScene 子类的所有关卡场景。

但是,如果您需要向更新方法中添加一些仅与 1 级场景相关而不是与所有关卡场景相关的特定内容,会发生什么情况?这将是相同的过程,您在 LevelScene 中创建一个新的更新函数并调用 super。

 override func update(currentTime: CFTimeInterval) {
super.update(currentTime) // this calls the baseScene Update method

/// specific stuff for that level only
}

Super 只是表示当前场景的父类(super class),如果场景是它的子类,则为 BaseScene。

这有帮助吗?

关于swift - 使用 Swift 在 Sprite 套件的多个场景中重用相同的 Sprite 节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35837544/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com