2014-06-15 68 views
0

我已經創建了一個帶有sprite套件的遊戲,但是在遊戲啓動時,它會直接進入遊戲。我如何通過按屏幕上的標籤或遊戲過程中的聯繫人來實現主菜單和遊戲等場景之間的不同場景以及它們之間的轉換。SpriteKit如何創建並轉換到不同的場景(Swift語言)

+0

我在swift中解決了這個問題,你可以在底部找到一些代碼。 – Sourness

回答

3

看起來你沒有看過蘋果的文檔。他們有一個優秀的SpriteKit指南。此外,spriteKit類別中的RayWenderlich.com教程也非常出色。我還沒有讀懂Swift,但我的理解是Swift可以和Objective-C一起編寫。據說,我會給你一個起點(在Objective-C中)。

1)調用的初始場景:

在您的主視圖控制器,你會想VC的view財產強制轉換爲SKViewviewDidLoad像這樣:

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)要通過聯繫方式更改場景,請遵循任何給定SKScene內的協議SKPhysicsContactDelegate。在那一幕的實現:

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

SKPhysicsContact有2相撞通過屬性附加到它SKPhysicsBody秒。這些碰撞節點必須已經初始化其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有其他相關的屬性,你可能需要
+2

我不明白objective-c。 Im在iOS開發中是新的,我從Swift開始,但很難找到一些教程。 – Sourness

+0

請嘗試raywenderlich.com,蘋果在Swift或本iOS博客上的書:http://ios-blog.co.uk/swift-tutorials/ -note:objective-c在可預見的將來仍然是相關的。 – BenJammin

+0

這是在目標C中,而不是Swift,因此不是一個合適的答案。 – jmcmahon443

0

製作一個名爲:TestScene.Swift

聲明它在你的GameScene.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的新場景

1

我在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) 
} 
0

創建一個名爲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)