SpriteKit как создавать и переходить к разным сценам (язык Swift)

#swift #sprite-kit #transition

#swift #sprite-kit #переход

Вопрос:

Я создал игру с помощью sprite kit, но в тот момент, когда игра запущена, она переходит прямо в игру. Как я могу реализовать разные сцены, такие как главное меню и сцена завершения игры, и переход между ними либо нажатием метки на экране, либо контактом во время игры.

Комментарии:

1. Я решаю эту проблему в swift, вы можете найти некоторый код внизу.

Ответ №1:

Похоже, вы не заглядывали в документацию Apple. У них есть отличное руководство по SpriteKit. Кроме того, учебные пособия по RayWenderlich.com в категории SpriteKit они феноменальны. Я еще не много читал в Swift, но, насколько я понимаю, Swift может быть написан вместе с Objective-C.При этом я дам вам отправную точку (в Objective-C).

1) Вызов начальной сцены:

В вашем главном контроллере просмотра вам нужно будет преобразовать свойство VC view в SKView within viewDidLoad следующим образом:

SKView *spriteKitView = (SKView *)self.view;

некоторые полезные свойства отладки на SKView :

 spriteKitView.showsFPS = YES;
spriteKitView.showsNodeCount = YES;
spriteKitView.showsPhysics = YES;
  

Вам придется настраивать каждую сцену отдельно (подкласс SKScene ). После того, как вы это сделаете, импортируйте основную сцену в реализацию класса вашего основного VC. Чтобы представить основную сцену (все еще в viewDidLoad ):

 MyScene *mainScene = [MyScene new];
[spriteKitView presentScene: mainScene];
  

2) переход между сценами через метку (или любую другую SKNode ) :
Задайте соответствующие узлы в качестве свойств и представьте новую сцену через:

 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    CGPoint touchLocation = [touch locationInNode:self];

    if ([self.playAgainButton containsPoint:touchLocation]) {
        [self presentGamePlayScene];
    } else if([self.mainMenuButton containsPoint:touchLocation]) {
        [self presentMainMenu];
    }
}


- (void)presentGamePlayScene {
    gamePlayScene *newGamePlay = [[gamePlayScene alloc]init];
    newGamePlay.scaleMode = SKSceneScaleModeAspectFill;
    SKTransition *arbitraryTransition = [SKTransition crossFadeWithDuration:2.0]; //look into SKTransition for a plethora of different options.
    [self.view presentScene:newGamePlay transition:arbitraryTransition];
}
  

3) Для изменения сцен через контакт, соблюдайте протокол SKPhysicsContactDelegate в пределах любого заданного SKScene . В рамках реализации этой сцены:

 - (void)didBeginContact:(SKPhysicsContact *)contact {
    if(contact.bodyA.categoryBitMask == enemyCategory amp;amp; contact.bodyB.categoryBitMask == arbitraryNodeCategory) {
        [self presentGameOverScene];
    }
}
  

К SKPhysicsContact SKPhysicsBody нему через свойства привязаны 2 сталкивающихся файла. Эти сталкивающиеся узлы должны быть SKPhysicsBody инициализированы. Кроме того, у них должно быть contactBitMask установлено их свойство SKPhysicsBody , подобное этому:

 @implementation SomeNode 

- (instanceType)initCollidingNode {
     if(self = [super init]) {
         self.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.someSize];
         self.physicsBody.contactBitMask = enemyCategory | powerUpCategory;
         self.physicsBody.categoryBitMask = arbitraryNodeCategory;
         self.physicsBody.dynamic = YES 
     }
     return self;
}
  
  • SKSpriteNode и SKPhysicsBody имеют другие соответствующие свойства, которые могут вам понадобиться

Комментарии:

1. Я не понимаю objective-c. Я новичок в разработке iOS, и я начинаю с Swift, но трудно найти несколько руководств.

2. Попробуй raywenderlich.com , Книга Apple о Swift или этот блог iOS: ios-blog.co.uk/swift-tutorials -примечание: objective-c по-прежнему будет актуален в обозримом будущем.

3. Это в Objective C, а не в Swift, и поэтому не является подходящим ответом.

4. @BenJammin где документация этого Apple для SpriteKit с Swift? Если вы имеете в виду официальный документ, то он предназначен только для Obj-C. developer.apple.com/library/ios/documentation/GraphicsAnimation/… ^^op вы можете попробовать это: github.com/monchote/spritekit-programming-guide-swift — кто-то портировал код из руководства Obj-C на Swift, но я не изучал его.

Ответ №2:

Я решаю эту проблему в swift.

 func goToGameScene(){
    let gameScene:GameScene = GameScene(size: self.size) // create your new scene
    let transition = SKTransition.revealWithDirection(SKTransitionDirection.Down, duration: 0) // create type of transition (you can check in documentation for more transtions)
    gameScene.scaleMode = SKSceneScaleMode.AspectFill
    self.view!.presentScene(gameScene, transition: transition)
}
  

Ответ №3:

Создайте новый файл swift с именем MainMenu.swift

Следующий код, размещенный в вашей текущей сцене, позволит перейти к сцене, описанной в MainMenu.swift:

 var scene =  MainMenu(size: self.size)
let skView = self.view! as SKView
skView.ignoresSiblingOrder = true
scene.scaleMode = .ResizeFill
scene.size = skView.bounds.size
skView.presentScene(scene)
  

В новой сцене вы можете использовать следующий код, чтобы вернуться к сцене, описанной в GameScene.swift:

 var scene =  GameScene(size: self.size)
let skView = self.view! as SKView
skView.ignoresSiblingOrder = true
scene.scaleMode = .ResizeFill
scene.size = skView.bounds.size
skView.presentScene(scene)
  

Ответ №4:

Создайте файл с именем: testScene .Swift

Объявите это в своей игровой сцене.Файл Swift и реализовать функцию касания следующим образом:

 var sceneTest: TestScene!

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
    // Configure the view.
    let gameView = self.view as SKView!

    /* Sprite Kit applies additional optimizations to improve rendering performance */
    gameView.ignoresSiblingOrder = true

    sceneTest = TestScene(size: gameView.bounds.size)
    gameView.presentScene(sceneTest)
    sceneTest.scaleMode = .AspectFill
}
  

Это представит новую сцену под названием testScene