Как переместить сцены в Swift
В Objective-C, используя Sprite-Kit, я бы успешно использовал что-то вроде следующего кода в Objective-C, чтобы открыть новую сцену
if ([touchedNode.name isEqual: @"Game Button"]) {
SKTransition *reveal = [SKTransition revealWithDirection:SKTransitionDirectionDown duration:1.0];
GameScene *newGameScene = [[GameScene alloc] initWithSize: self.size];
// Optionally, insert code to configure the new scene.
newGameScene.scaleMode = SKSceneScaleModeAspectFill;
[self.scene.view presentScene: newGameScene transition: reveal];
}
При попытке перенести мою простую игру в Swift, у меня есть эта работа...
for touch: AnyObject in touches {
let touchedNode = nodeAtPoint(touch.locationInNode(self))
println("Node touched: " + touchedNode.name);
let touchedNodeName:String = touchedNode.name
switch touchedNodeName {
case "Game Button":
println("Put code here to launch the game scene")
default:
println("No routine established for this")
}
Но я не знаю, какой код писать для перехода на другую сцену.
Вопрос (ы):
- Может ли кто-нибудь указать пример использования SKTransition с Swift?
- Вы обычно создавали бы другой "файл", чтобы поместить другой код сцены в другую сцену, предполагая, что у вас есть под Objective-C, или есть что-то в использовании Swift, что означает, что я должен подходить к нему по-другому?
Спасибо
Ответы
Ответ 1
Чтобы начать со второго вопроса, это до вас. Если вы хотите, вы можете продолжать следовать соглашению Objective-C, имеющему один класс для каждого файла, хотя это не является обязательным требованием и не было в Objective-C. При этом, если у вас есть несколько классов, которые тесно связаны друг с другом, но не состоят из большого количества кода, было бы неразумно группировать их в один файл. Просто делайте то, что кажется правильным, и не делайте огромный код кода в одном файле.
Тогда для ваших первых вопросов... Да, у вас уже много чего было. В основном, с того места, где вы встали, вам нужно создать экземпляр GameScene по своему размеру: initializer. Оттуда вы просто установите свойства и вызовите их.
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
super.touchesBegan(touches, withEvent: event)
guard let location = touches.first?.locationInNode(self),
let scene = scene,
nodeAtPoint(location) == "Game Button" else {
return
}
let transition = SKTransition.reveal(
with: .down,
duration: 1.0
)
let nextScene = GameScene(size: scene.size)
nextScene.scaleMode = .aspectFill
scene.view?.presentScene(nextScene, transition: transition)
}
Ответ 2
если вам нужно работать с действием touch-begain или node, а затем использовать его:
override func touchesBegan(touches: NSSet!, withEvent event: UIEvent!) {
let touch = touches.anyObject() as UITouch
if CGRectContainsPoint(btncloseJump.frame, touch.locationInNode(self)) {
self.scene.removeFromParent()
btncloseJump.removeFromParent()
let skView = self.view as SKView
skView.ignoresSiblingOrder = true
var scene: HomeScene!
scene = HomeScene(size: skView.bounds.size)
scene.scaleMode = .AspectFill
skView.presentScene(scene, transition: SKTransition.fadeWithColor(SKColor(red: 25.0/255.0, green: 55.0/255.0, blue: 12.0/255.0, alpha: 1), duration: 1.0))
}
}