#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