Takunojiのプログラミング・プレイグラウンド(遊び場)

「プログラミングのススメ」と学習した結果身につくもの、アイディアを実現するために何をしたら良いか?の答えが出せるようになります。

Swift4 SpriteKitとUIKitを併用する

イントロダクション

前回はSpriteKitの画面の構成について調べました。
今回は、SpriteKitとUIKitの併用についてやります。※参考サイト

そして、サンプルファイルのダウンロードを行います。

参考サイト解釈

サンプルは実際に参考サイトを見ながら実装する様になっている様です。

参考サイトの以下のインデックス?部分を参照しています。

Architecture of the App

そして、UIKitを使用する画面のソース(サンプルではTitlePage.sks)に以下をインポートします。→UIKitフレームワークとその他のサポートされる機能

import UIKit

とSpriteKitフレームワーク

import SpriteKit

そして、入力コンポーネントを作成するSubViewを作成します。
※サンプルではFooter.sks

以下のフォルダ「ProtoTypeMkhyap」を右クリック → New File → iOS

f:id:Takunoji:20170814113654p:plain f:id:Takunoji:20170814120144p:plain

SpriteKit Scene(テンプレート)を選択→Nextボタンを押下します。
名前を入力して「Create」

【余談】やり方がほぼ同じなのでテンプレート選択を間違えると他のものができます。
Cocoa Classを作成する場合は以下の通り

f:id:Takunoji:20170814113724p:plain

そして、「Cocoa Touch Class」を選択→Nextを押下します。


TitlePage.sksを開き「Scene」インスペクターの「Custom Class」を開きます。

f:id:Takunoji:20170814112958p:plain

f:id:Takunoji:20170814113034p:plain左の部分を選択してやると上記右上に表示されます

ちなみに、上記のビューが大きすぎる場合は、f:id:Takunoji:20170814120721p:plainのマイナスを押下すると
サイズが小さくなります。

 

【本題】

さて、引き続きファイルの作成を行います。

上記で画面の土台になる部分に入力コンポーネントを追加します。

作成した、からのSpriteKitテンプレートに入力コンポーネントを追加します。

サンプルの場合は「ボタン」なのでイメージを追加して、そのイメージに対して
アクション(動き)を実装しています。アニメーションは、別の機会に。。。

作成した、fotter.sksのファイルとfotter.swifを土台の画面上に乗せるイメージです。

TitlePage.sksとfotter.sksをルートになる「GameScene.sks」に追加して実装完了。

ソースには以下の様に実装します。
GameScene.switft

var footer:SKNode!

var btnNext: SKSpriteNode!

var btnPrevious: SKSpriteNode!

var btnSound: SKSpriteNode!

var btnHome: SKSpriteNode!

fotter.swift

override func sceneDidLoad() {

  super.sceneDidLoad()

  footer = childNode(withName: "footer")

}

イメージの追加時のコードは以下

btnNext = childNode(withName: "//buttonNext") as! SKSpriteNode

btnPrevious = childNode(withName: "//buttonPrevious") as! SKSpriteNode

btnSound = childNode(withName: "//buttonSound") as! SKSpriteNode

btnHome = childNode(withName: "//buttonHome") as! SKSpriteNode

ページ遷移

func goToScene(scene: SKScene) {

  let sceneTransition = SKTransition.fade(with: UIColor.darkGray, duration: 1)

  scene.scaleMode = .aspectFill

  self.view?.presentScene(scene, transition: sceneTransition)

}

サンプルでの各ページ実装

In TitlePage.swift, override the method to return the next scene:

override func getNextScene() -> SKScene? {

  return SKScene(fileNamed: "Scene01") as! Scene01

}

In Scene01.swift add:

override func getPreviousScene() -> SKScene? {

  return SKScene(fileNamed: "TitlePage") as! TitlePage

}

With all that in place, you can now override the touch handler in GameScene.swift by adding this method:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

  guard let touch = touches.first else { return }

    

  // 1

  let touchLocation = touch.location(in: self)



  // 2

  if footer.contains(touchLocation) {

    let location = touch.location(in: footer)



    // 3

    if btnNext.contains(location) {

      goToScene(scene: getNextScene()!)

    } else if btnPrevious.contains(location) {

      goToScene(scene: getPreviousScene()!)

    } else if btnHome.contains(location) {

      goToScene(scene: SKScene(fileNamed: "TitlePage") as! TitlePage)

    }

     

  } else {



    // 4

    touchDown(at: touchLocation)

  }

}

あとは実装してみて、感触をつかむのが良いと思います。

てか、これから実装入ります。。。ではでは(笑)