FactoryMethodパターンでリファクタリングすると、ゲーム開発がどう便利になるのかをSwiftコードで学ぶiOS SDKとSwiftで始めるゲーム作成入門(6)(4/4 ページ)

» 2016年05月17日 05時00分 公開
[杉本裕樹マネーフォワード]
前のページへ 1|2|3|4       

FactoryMethodパターンを使って自機の生成を改善

 最後に、生成処理をFactoryMethodパターンを使ってリファクタリングしようと思います。

 FactoryMethodパターンとはGoFデザインパターンの1つで、オブジェクトの生成に関するものです。Charの生成処理をFactoryに持たせることで分岐を減らそうと思います。

 まずは、「CharFactory.swift」を作って以下のように書いてください。

  1. class CharFactory {
  2. func createChar() -> Char {
  3. return Char()
  4. }
  5. }
  6. class Char1Factory: CharFactory {
  7. override func createChar() -> Char {
  8. return Char1()
  9. }
  10. }
  11. class Char2Factory: CharFactory {
  12. override func createChar() -> Char {
  13. return Char2()
  14. }
  15. }
  16. class Char3Factory: CharFactory {
  17. override func createChar() -> Char {
  18. return Char3()
  19. }
  20. }

 次に自機をセットする処理を修正します。SetCharScene.swiftを修正します。

  1. class SetCharScene: SKScene {
  2. var coin = 100
  3. var charData = [(factory: CharFactory, position: CGPoint)]()
  4. // 省略
  5. override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
  6. if touches.count == 1, let point = touches.first?.locationInNode(self) {
  7. let alert = UIAlertController(title: nil, message: "どのキャラクターを設置しますか?",
  8. preferredStyle: .Alert)
  9. let rootViewController = UIApplication.sharedApplication().delegate?.window??.rootViewController
  10. alert.addAction(UIAlertAction(title: "Char1を設置", style: .Default, handler: { _ in
  11. let factory = Char1Factory()
  12. let char = factory.createChar()
  13. char.position = point
  14. self.coin -= char.cost
  15. self.addChild(char)
  16. self.charData.append((factory: factory, position: point))
  17. }))
  18. alert.addAction(UIAlertAction(title: "Char2を設置", style: .Default, handler: { _ in
  19. let factory = Char2Factory()
  20. let char = factory.createChar()
  21. char.position = point
  22. self.coin -= char.cost
  23. self.addChild(char)
  24. self.charData.append((factory: factory, position: point))
  25. }))
  26. alert.addAction(UIAlertAction(title: "Char3を設置", style: .Default, handler: { _ in
  27. let factory = Char3Factory()
  28. let char = Char3()
  29. char.position = point
  30. self.coin -= char.cost
  31. self.addChild(char)
  32. self.charData.append((factory: factory, position: point))
  33. }))
  34. alert.addAction(UIAlertAction(title: "キャンセル", style: .Cancel, handler: nil))
  35. rootViewController?.presentViewController(alert, animated: true, completion: nil)
  36. }
  37. }
  38. }

 次にGameSceneのcreateCharsも少し修正します。今まであった分岐がなくなりすっきりとしました。

  1. class GameScene: SKScene, SKPhysicsContactDelegate {
  2. // 省略
  3. func createChars(charData: [(factory: CharFactory, position: CGPoint)]) {
  4. charData.forEach {
  5. let char = $0.factory.createChar()
  6. char.position = $0.position
  7. char.physicsBody = SKPhysicsBody(rectangleOfSize: char.size)
  8. char.physicsBody?.contactTestBitMask = 0x1
  9. addChild(char)
  10. chars.append(char)
  11. }
  12. }
  13. // 省略
  14. }

 以上でFactoryMethodパターンを使った書き換えは終了です。FactoryMethodパターンを使ったことで「どのCharを生成するか」の処理をSetCharSceneだけに持たせることができました。これによって、今後Charの種類が増えたときもSetCharSceneの変更だけで済むようになりました。

 FactoryMethodパターンは局所的なパターンで、とても使いやすいので、機会あればぜひ試してみてください。

次回は、iOS 9のReplayKitも使う

 今回はFactoryMethodパターンを使いつつ自機の配置周りの改善を行ってきました。

 今回実装したソースコード「konkai.zip」は、こちらからダウンロードできます

 次回はタワーディフェンスとして不足している機能の実装を進めてゲームとしての完成度を高めていきます。iOS 9から登場したゲーム録画機能ができるReplayKitも使っていくので、どうぞお楽しみに。

筆者紹介

杉本裕樹

田町のベンチャーで働くエンジニア。

仕事ではiPhoneアプリの開発やRailsを使ったWebサービス開発を行っている。最近のマイブームはUnityを使った3Dゲーム開発。

前のページへ 1|2|3|4       

Copyright © ITmedia, Inc. All Rights Reserved.

スポンサーからのお知らせPR

Smart & Social 記事ランキング

本日月間

注目のテーマ

4AI by @IT - AIを作り、動かし、守り、生かす
Microsoft & Windows最前線2025
AI for エンジニアリング
ローコード/ノーコード セントラル by @IT - ITエンジニアがビジネスの中心で活躍する組織へ
Cloud Native Central by @IT - スケーラブルな能力を組織に
システム開発ノウハウ 【発注ナビ】PR
あなたにおすすめの記事PR

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。