#ios #swift #sprite-kit
#iOS #swift #sprite-kit
Вопрос:
Я создаю простую игру для iOS, и у меня возникли некоторые проблемы. Действительно, я создал свои разные классы для своих элементов: планета, маркер, фон и астероиды. Однако, когда я пытаюсь инициализировать их при условии переключения (из GameScene), у меня появляется сообщение об ошибке «ожидаемое объявление».
Переменная «lvlSelected» является глобальной и представляет уровень, запрошенный игроком (из другой сцены).
Вот мой код переключения :
switch lvlSelected {
case 1 :
private var planet = Planet(imageName: "Planet1")
private var bullet = Bullet(imageName: "Bullet1")
private var background = Background(imageName: "Background1")
private var asteroide = Asteroides(img: "Asteroid1")
case 2 :
private var planet = Planet(imageName: "Planet2")
private var bullet = Bullet(imageName: "Bullet2")
private var background = Background(imageName: "Background2")
private var asteroide = Asteroides(img: "Asteroid2")
default :
private var planet = Planet(imageName: "Planet")
private var bullet = Bullet (imageName: "Bullet")
private var background = Background(imageName : "Background")
private var asteroide = Asteroides(img."Asteroid")
}
Спасибо за вашу помощь
Вот класс моей планеты :
class Planet:SKSpriteNode {
init(imageName: String){
let texture = SKTexture(imageNamed : imageName)
super.init(texture: texture, color: .clear, size: texture.size())
self.physicsBody = SKPhysicsBody(circleOfRadius: self.size.width/2, center: self.anchorPoint)
self.physicsBody!.affectedByGravity = false
self.physicsBody!.categoryBitMask = GameScene.physicsCategories.planet
self.physicsBody!.collisionBitMask = GameScene.physicsCategories.none
self.physicsBody!.contactTestBitMask = GameScene.physicsCategories.asteroid
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func addPlanet(parent: GameScene) {
self.setScale(0.55)
self.position = CGPoint(x: parent.size.width / 2, y: -self.size.height)
self.zPosition = 2
self.anchorPoint = CGPoint(x: 0.5, y: 0.5)
parent.addChild(self)
}
Комментарии:
1. 1. Вы не можете использовать
private
с локальными переменными. 2. Вам, вероятно, не нужны локальные переменные.
Ответ №1:
Это должно быть так, как вы хотите.
private var planet = Planet(imageName: "Planet")
private var bullet = Bullet (imageName: "Bullet")
private var background = Background(imageName : "Background")
private var asteroide = Asteroides(img."Asteroid")
switch lvlSelected {
case 1 :
planet = Planet(imageName: "Planet1")
bullet = Bullet(imageName: "Bullet1")
background = Background(imageName: "Background1")
asteroide = Asteroides(img: "Asteroid1")
break
case 2 :
planet = Planet(imageName: "Planet2")
bullet = Bullet(imageName: "Bullet2")
background = Background(imageName: "Background2")
asteroide = Asteroides(img: "Asteroid2")
break
default :
break
}
Если вы объявите var внутри switch, регистр будет доступен только внутри этого регистра.
Комментарии:
1. rmaddy, потому что вы уже определили свои значения по умолчанию, когда вы их объявили.
2. Хотя это моя точка зрения. Нет необходимости инициализировать их, просто чтобы сбросить их в коммутаторе.
3. Я понимаю вашу точку зрения, не могли бы вы вместо этого работать с опциями в этом случае?
4. Зависит от того, где они объявлены. Если они являются свойствами класса, то, возможно, сделайте их неявно развернутыми. Если они являются локальными для функции, содержащей переключатель, тогда сделайте их обычными
let
константами без начального значения.5. Да, мое решение было таким, чтобы упростить 🙂
Ответ №2:
В вашем случае нет необходимости в переключении, вы можете использовать интерполяцию строк:
class GameScene : SKScene
{
private let planet : Planet
private let bullet : Bullet
private let background : Background
private let asteroide : Asteroides
convenience init(lvlSelected : Int){
let level = 1 ... 2 ~= lvlSelected ? "(lvlSelected)" : ""
planet = Planet(imageName: "Planet(level)")
bullet = Bullet (imageName: "Bullet(level)")
background = Background(imageName: "Background(level)")
asteroid = Asteroides(img: "Asteroid(level)")
self.init() //whatever init you use here
}
}
~=
является оператором сопоставления с шаблоном и #a ... #b
означает диапазон чисел от a до b, включая a и b, поэтому вы спрашиваете, находится ли число в определенном диапазоне
(condition) ? (statement 1) : (statement 2)
является ли троичным оператором, который является, если условие истинно, то оператор 1, иначе оператор 2
"(var)"
является ли интерполяция строки, которая сообщает строке ввести значение var в строку