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

» 2016年05月17日 05時00分 公開
[杉本裕樹マネーフォワード]

自機の種類を増やす

 次は自機の種類を増やしてみようと思います。コストと攻撃力が違う3種類の自機を作ってみます。

 まずは、こちら「sozai.zip」の画像素材をAssets.xcassetsに追加してください。併せてCharの名前をChar1に変更してください。こちら素材はぴぼや様のフリー素材を使わせていただきました。

 次に、Char.swiftを修正して3種類の自機を作成します。以下のようにCharのサブクラスを3つ作ってください。それぞれ攻撃力と設置コストのプロパティを持たせています。

  1. class Char: SKSpriteNode {
  2. // 省略
  3. // var power = 1
  4. var power: Int {
  5. return 0
  6. }
  7. var cost: Int {
  8. return 10
  9. }
  10. }
  11. class Char1: Char {
  12. init() {
  13. super.init(texture: SKTexture(imageNamed: "Char1"), color: UIColor.clearColor(), size: CGSize(width: 32, height: 32))
  14. }
  15. required init?(coder aDecoder: NSCoder) {
  16. fatalError("init(coder:) has not been implemented")
  17. }
  18. override var power: Int {
  19. return 1
  20. }
  21. override var cost: Int {
  22. return 10
  23. }
  24. }
  25. class Char2: Char {
  26. init() {
  27. super.init(texture: SKTexture(imageNamed: "Char2"), color: UIColor.clearColor(), size: CGSize(width: 32, height: 32))
  28. }
  29. required init?(coder aDecoder: NSCoder) {
  30. fatalError("init(coder:) has not been implemented")
  31. }
  32. override var power: Int {
  33. return 2
  34. }
  35. override var cost: Int {
  36. return 20
  37. }
  38. }
  39. class Char3: Char {
  40. init() {
  41. super.init(texture: SKTexture(imageNamed: "Char3"), color: UIColor.clearColor(), size: CGSize(width: 32, height: 32))
  42. }
  43. required init?(coder aDecoder: NSCoder) {
  44. fatalError("init(coder:) has not been implemented")
  45. }
  46. override var power: Int {
  47. return 3
  48. }
  49. override var cost: Int {
  50. return 30
  51. }
  52. }

 次に、自機設置処理を修正します。SetCharScene.swiftのtouchesEndedを以下のように書き換えてください。アラートで「どの自機を設置するか」を選べるようにしました。

  1. class SetCharScene: SKScene {
  2. var coin = 100
  3. var charData = [(name: String, 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 char = Char1()
  12. char.position = point
  13. self.coin -= char.cost
  14. self.addChild(char)
  15. self.charData.append((name: "Char1", position: point))
  16. }))
  17. alert.addAction(UIAlertAction(title: "Char2を設置", style: .Default, handler: { _ in
  18. let char = Char2()
  19. char.position = point
  20. self.coin -= char.cost
  21. self.addChild(char)
  22. self.charData.append((name: "Char2", position: point))
  23. }))
  24. alert.addAction(UIAlertAction(title: "Char3を設置", style: .Default, handler: { _ in
  25. let char = Char3()
  26. char.position = point
  27. self.coin -= char.cost
  28. self.addChild(char)
  29. self.charData.append((name: "Char3", position: point))
  30. }))
  31. alert.addAction(UIAlertAction(title: "キャンセル", style: .Cancel, handler: nil))
  32. rootViewController?.presentViewController(alert, animated: true, completion: nil)
  33. }
  34. }
  35. }

 GameSceneの方にも変更を反映します。GameScene.swiftのcreateCharsを以下のように修正してください。

  1. class GameScene: SKScene, SKPhysicsContactDelegate {
  2. // 省略
  3. func createChars(charData: [(name: String, position: CGPoint)]) {
  4. charData.forEach {
  5. let char: Char
  6. if name == "Char1" {
  7. char = Char1()
  8. } else if name == "Char2" {
  9. char = Char2()
  10. } else {
  11. char = Char3()
  12. }
  13. char.position = $0.position
  14. char.physicsBody = SKPhysicsBody(rectangleOfSize: char.size)
  15. char.physicsBody?.contactTestBitMask = 0x1
  16. addChild(char)
  17. chars.append(char)
  18. }
  19. }
  20. // 省略
  21. }

 併せて、createCharsを呼び出す箇所も修正します。SetCharScene.swiftのdidMoveToViewを以下のように直してください。

  1. class SetCharScene: SKScene {
  2. // 省略
  3. override func didMoveToView(view: SKView) {
  4. // 省略
  5. let button = Button(text: "ゲーム開始", rect: buttonRect, afterTap: {
  6. let scene = GameScene(fileNamed: "GameScene")
  7. scene?.scaleMode = .ResizeFill
  8. view.presentScene(scene)
  9. scene?.createChars(self.charData) // ここを修正
  10. })
  11. addChild(button)
  12. }
  13. // 省略
  14. }

 これで3種類の自機を出せるようになりました。

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のメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。