2016-05-17 7 views
0

高校のプログラミングクラスのSwiftプロジェクトを作成しています。私はこの問題を理解しているようには思えません。クラス内の他の人は考えがないようです。SpriteKitSceneにストーリーボードの画像を貼り付けて

私は新しいSwiftプロジェクトを作成し、ゲームフォーマットを選択しました。

new project template

私はその後、私のゲームのための最初のレベルを作るためにいくつかの基本的なコード、迷路は、ユーザーがデバイスを傾ける方法に基づいて代わりにボールの周りに移動迷路ゲームを使用。 これは私のGameScene.swift次のとおりです。私は成功したアプリはmainMenu.storyboardに起動している

menu storyboard

(と:私はmainMenu.storyboardあるアプリはに開いて、メインメニューを、持っていると思います

import SpriteKit 
import CoreMotion 

var accelupdateinterval = 0.1 
var accelmultiplier = 15.0 

class GameScene: SKScene { 

    let manager = CMMotionManager() 

    override func didMoveToView(view: SKView) { 


     manager.startAccelerometerUpdates() 
     manager.accelerometerUpdateInterval = accelupdateinterval 
     manager.startAccelerometerUpdatesToQueue(NSOperationQueue.mainQueue()){ 
      (data, error) in 

      self.physicsWorld.gravity = CGVectorMake(CGFloat((data?.acceleration.x)!) * CGFloat(accelmultiplier), CGFloat((data?.acceleration.y)!) * CGFloat(accelmultiplier)) 

     } 

    } 

    override func update(currentTime: CFTimeInterval) { 
     /* Called before each frame is rendered */ 
    } 
} 

私がlevel1.sksをテストしたときに、レベルの物理学はうまくいくが)、どのようにしてセグを計算するのか困っている。

目標:mainMenu.storyboardで対応する画像をタップすると、人々はlevel1.sks(および後ほど追加するレベル)にセグメンテーションしてもらいたいです。

ストーリーボードリファレンスではlevel1.sksを選択できないため、ストーリーボードリファレンスを追加する方法は使用できません。

私もプレイヤーのアイコンがゴール(このスクリーンショットの上部付近に青いものまで)を触れると、メインメニューに戻ってユーザを送信する方法を見つけるのが大好きです:

game maze screenshot

答えて

0

これを行うには、別のViewControllerサブクラスを作成することをお勧めします。おそらく、LauncherViewControllerという名前で、SKSceneを提示します。次に、あなたのストーリーボードにこのviewControllerを追加して、イメージプレスであなたのメニューにそれをセグメンテーションさせます。ユーザーが迷路を終了すると、あなたのLauncherViewControllerがgameSceneを却下持って

override func prepareForSegue(segue: UIStoryBoardSegue, sender: AnyObject?) { 
    if segue.identifier == "yourSegue" { 
     let destinationViewController = segue.destinationViewController as! LauncherViewController 
     destinationViewController.gameScene = GameScene() 
} 

:ここ

は、あなたのメニューコントローラにあなたは、このようprepareForSegueを持ってLauncherViewController

class LauncherViewController: UIViewController { 

    var gameScene: GameScene! 

    override func viewDidLoad() { 

    } 

    override func viewWillAppear() { 
     presentGameScene() 
    } 

    func presentGameScene(){ 

     let skView = self.view as! SKView 
     skView.showsFPS = false 
     skView.showsNodeCount = false 
     skView.ignoresSiblingOrder = true 
     gameScene.size = skView.bounds.size 
     gameScene.scaleMode = .AspectFill 
     skView.presentScene(gameScene) 

    } 
} 

のスタートですデリゲートパターンを使用します。だから、GameSceneに

protocol GameDelegate { 
    func gameFinished() 
} 

は、あなたのLauncherViewControllerを保持するために

class LauncherViewController: UIViewController, GameDelegate { 

    var gameScene: GameScene! 

    override func viewDidLoad() { 
     gameScene.delegate = self 
    } 

    override func viewWillAppear() { 
     presentGameScene() 
    } 

    func presentGameScene(){ 

     let skView = self.view as! SKView 
     skView.showsFPS = false 
     skView.showsNodeCount = false 
     skView.ignoresSiblingOrder = true 
     gameScene.size = skView.bounds.size 
     gameScene.scaleMode = .AspectFill 
     skView.presentScene(gameScene) 

    } 

    func gameFinished(){ 
     // this forces LauncherViewController to dismiss itself 
     dismissViewControllerAnimated(true, completion: nil) 
    } 
} 

がGameSceneに変数を追加します(下記参照)、このデリゲートに適合し、自己にgameSceneのデリゲート変数を設定しているクラス上のプロトコルを追加デリゲート(LauncherViewController)を呼び出し、デリゲート関数を呼び出す関数を追加します。ゲームを終えた時点を知るためのロジックを追加する必要もあります。

class GameScene: SKScene { 

    let manager = CMMotionManager() 
    var delegate: GameDelegate! 

    override func didMoveToView(view: SKView) { 


    manager.startAccelerometerUpdates() 
    manager.accelerometerUpdateInterval = accelupdateinterval 
    manager.startAccelerometerUpdatesToQueue(NSOperationQueue.mainQueue()){ 
     (data, error) in 

     self.physicsWorld.gravity = CGVectorMake(CGFloat((data?.acceleration.x)!) * CGFloat(accelmultiplier), CGFloat((data?.acceleration.y)!) * CGFloat(accelmultiplier)) 

    } 

} 

func gameOver(){ 
    delegate.gameFinished() 
} 

override func update(currentTime: CFTimeInterval) { 
    /* Called before each frame is rendered */ 
    // it's probably easiest to add the logic for a gameOver here 
    if gameIsOver { 
     gameOver() 
    } 
} 

}

おそらく私はちょうどあなたがわからないか、動作しないものについては、以下のコメントを自分の携帯電話上でこれを書いたように、ここでいくつかのミスがあります。

+0

素晴らしい情報まで@OlivierWilkinson。ありがとう。 LauncherViewControllerを作成し、メインメニューのストーリーボードに参照を追加しました。しかし、1つのボタンを新しいView Controllerにドラッグすると、そのView Controllerを選択できなくなります。だから私は、ボタンとランチャービューコントローラの間にセグを作成することはできません。ボタンにはタップジェスチャ認識機能もあります。何かご意見は? –

+0

は1,2,3,4および5 UIButtonsですか?彼らがUIImagesであれば、そのようにセグを接続することはできません。その代わりに、メニューviewControllerの上のオレンジ色のボタンからランチャービューコントローラーにドラッグし、segueに名前を付け、ジェスチャー認識機能が呼び出す機能でperformSegueWithIdentifier( "segueという名前を付けたもの"、sender:self)を使用する必要があります。それは理にかなっていますか?私は特によく自分自身を説明していない –

+0

それは完璧な意味をなし、ありがとう。私はイメージのテクスチャでボタンに変更し、セグを作りました。私は今のところ仕事を続けて、他に何かが必要な場合はあなたに戻ってきます。これまであなたの助けをありがとうございました。 –

関連する問題