Swift 使用图像名称属性的枚举值初始化spritekit对象
到目前为止,我编写的大多数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
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
中,我作为孩子添加了精灵。这是主要原因。至于位置,我可以轻松解决这个问题。