Swift 使用图像名称属性的枚举值初始化spritekit对象

Swift 使用图像名称属性的枚举值初始化spritekit对象,swift,sprite-kit,Swift,Sprite Kit,到目前为止,我编写的大多数SpriteKit代码只有几个对象,因此我将所有游戏逻辑都放在了游戏场景中。现在我正在做一些更复杂的事情,我正在尝试将一些对象分离到它们自己的类中。我如何初始化下面的Orbita类,以便simpleDescription字符串用于游戏场景中SKSpriteNode的ImageName class Orbita { var orbita : SKSpriteNode init(orbita: SKSpriteNode) { self.orbita = orb

到目前为止,我编写的大多数SpriteKit代码只有几个对象,因此我将所有游戏逻辑都放在了游戏场景中。现在我正在做一些更复杂的事情,我正在尝试将一些对象分离到它们自己的类中。我如何初始化下面的
Orbita
类,以便
simpleDescription
字符串用于
游戏场景中
SKSpriteNode
ImageName

class Orbita  {

var orbita : SKSpriteNode

init(orbita: SKSpriteNode) {
    self.orbita = orbita
    physics ()

}

func physics  ()  {
    orbita.physicsBody = SKPhysicsBody(circleOfRadius: orbita.frame.size.width/2)
    orbita.physicsBody?.friction = 0
   orbita.physicsBody?.restitution = 1
    orbita.physicsBody?.linearDamping = 0
    orbita.physicsBody?.angularDamping = 0
    orbita.physicsBody?.allowsRotation = false
    orbita.physicsBody?.applyImpulse(CGVectorMake(4, -4))

}

enum OrbitaType: Int  {

    case firstPlanet = 0, secondPlanet, thirdPlanet

    func simpleDescription()->String    {
        switch self {

        case .firstPlanet:
            return "green"

        case .secondPlanet:
            return "red"

        case .thirdPlanet:
            return "yellow"
        }
    }
  }}
更新

这就是我到目前为止所能做到的。我决定做一些改变

class Orbita  {

var sprite : SKSpriteNode
var orbitaType : OrbitaType

init(orbita: SKSpriteNode) {
    self.orbita = orbita
    physics ()

}

    init(orbitaType: OrbitaType, gameScene: GameScene) {
    self.orbitaType = orbitaType
    sprite = SKSpriteNode(imageNamed: orbitaType.simpleDescription())

    sprite.name = orbitaCategoryName
    sprite.position = CGPointMake(3*gameScene.frame.size.width/4, 3*gameScene.frame.size.height/4)

    sprite.zPosition = 10
    gameScene.addChild(sprite)

    physics()

}


func physics  ()  {
    sprite.physicsBody = SKPhysicsBody(circleOfRadius: sprite.frame.size.width/2)
    sprite.physicsBody?.friction = 0
   sprite.physicsBody?.restitution = 1
    sprite.physicsBody?.linearDamping = 0
    sprite.physicsBody?.angularDamping = 0
    sprite.physicsBody?.allowsRotation = false
    sprite.physicsBody?.applyImpulse(CGVectorMake(4, -4))

}

enum OrbitaType: Int  {

    case firstPlanet = 0, secondPlanet, thirdPlanet

    func simpleDescription()->String    {
        switch self {

        case .firstPlanet:
            return "green"

        case .secondPlanet:
            return "red"

        case .thirdPlanet:
            return "yellow"
        }
    }
  }}
游戏场景中
class I添加了以下内容:

var newOrbita = Orbita(orbitaType: 0, gameScene: self)
但我一直得到以下错误:

Cannot invoke initializer for type 'Orbita' with an argument list of type '(orbitaType: Int, gameScene: GameScene)'

另外,既然我使用
GameScene
作为参数,如何将
newOrbita
添加为
GameScene
的类变量?

要从单独的类访问任何内容,必须创建该类的实例: 在游戏场景中:

let orbitaInstance = Orbita() //let instanceName = classYouWantToAccess()
然后,在任何函数内部:

let image = SKSpriteNode(image: orbitaInstance.simpleDescription) // instanceOfClassYouAreAccessing.nameOfFunctionOrVariableYouAreAccessing

希望这有帮助,祝你好运。

orbitaType
参数是一个
orbitaType
,而不是
Int
。您需要传递类似于
Orbita的内容(orbitaType:.firstPlanet,

您的错误与
Ball
有关,但代码中没有提到Ball。很抱歉,我将代码与一些注释混合在一起,我刚刚进行了更正。我仍然收到相同的错误我想我必须进行
rawValue
转换才能通过
Int
。如何完成了吗?您可以创建
OrbitaType(rawValue:…)
。只是好奇,为什么需要传递Int?通常最好按名称使用enum常量,因为它更具可读性。既然我使用
GameSecene
作为参数,如何将
newOrbita
添加为
GameSecene
的类变量?为什么要将其作为参数传递?似乎没有必要。对于场景拥有该对象。在
init
中,我作为孩子添加了精灵。这是主要原因。至于位置,我可以轻松解决这个问题。