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

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

自機を好きな位置に配置する

 前項で自機を設置用のSceneを作りました。次は、そのSceneに実際の設置処理を追加していきます。追加する箇所の仕様は「画面をタップ」→「設置確認のアラートを出す」→「OKを押したら配置」とします。

 先ほど作成したSetCharScene.swiftにtouchesEndedメソッドを追加してください。

  1. class SetCharScene: SKScene {
  2. var chars = [Char]()
  3. var coin = 100
  4. // 省略
  5. override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
  6. if touches.count == 1, let point = touches.first?.locationInNode(self) {
  7. if coin < 10 {
  8. return
  9. }
  10. let alert = UIAlertController(title: nil, message: "この場所に設置しますか?",
  11. preferredStyle: .Alert)
  12. let rootViewController = UIApplication.sharedApplication().delegate?.window??.rootViewController
  13. alert.addAction(UIAlertAction(title: "はい", style: .Default, handler: { _ in
  14. let char = Char(imageNamed: "Char")
  15. char.position = point
  16. self.coin -= 10
  17. self.addChild(char)
  18. self.chars.append(char)
  19. }))
  20. alert.addAction(UIAlertAction(title: "いいえ", style: .Cancel, handler: nil))
  21. rootViewController?.presentViewController(alert, animated: true, completion: nil)
  22. }
  23. }
  24. }

 これで画面タップで確認ポップアップが表示されて、「はい」を押すとキャラクターが配置されるようになりました。

配置した自機を実際のゲーム画面にも反映する

 自機の設置はできたので、それを実際のゲーム画面にも反映します。GameScene.swiftを以下のように修正してください。

  1. class GameScene: SKScene, SKPhysicsContactDelegate {
  2. // 省略
  3. // let char = Char(imageNamed: "Char")
  4. var chars = [Char]()
  5. // 省略
  6. func createChars(points: [CGPoint]) {
  7. points.forEach {
  8. let char = Char(imageNamed: "Char")
  9. char.position = $0
  10. char.physicsBody = SKPhysicsBody(rectangleOfSize: char.size)
  11. char.physicsBody?.contactTestBitMask = 0x1
  12. addChild(char)
  13. chars.append(char)
  14. }
  15. }
  16. override func update(currentTime: NSTimeInterval) {
  17. // chars.forEachを使ってそれぞれのcharに対して処理をするよう修正
  18. chars.forEach { char in
  19. char.stateMachine.updateWithDeltaTime(currentTime)
  20. if let charState = char.stateMachine.currentState as? Char.CharState where charState.enableToAttack() {
  21. enemyList.enemiesCloseToPoint(char.frame.origin, distance: 50).forEach {
  22. $0.life -= charState.power
  23. char.stateMachine.enterState(Char.StayState.self)
  24. if $0.life <= 0 {
  25. $0.physicsBody?.node?.removeFromParent()
  26. $0.physicsBody?.node?.removeAllActions()
  27. if enemyList.isAllEnemyRemoved() {
  28. state = .GameClear
  29. let myLabel = SKLabelNode(fontNamed: "HiraginoSans-W6")
  30. myLabel.text = "ゲームクリア"
  31. myLabel.fontSize = 45
  32. myLabel.position = CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame) - 20)
  33. addChild(myLabel)
  34. }
  35. }
  36. }
  37. }
  38. }
  39. // char.stateMachine.updateWithDeltaTime(currentTime)
  40. // if let charState = char.stateMachine.currentState as? Char.CharState where charState.enableToAttack() {
  41. // enemyList.enemiesCloseToPoint(char.frame.origin, distance: 50).forEach {
  42. // $0.life -= charState.power
  43. // char.stateMachine.enterState(Char.StayState.self)
  44. // if $0.life <= 0 {
  45. // $0.physicsBody?.node?.removeFromParent()
  46. // $0.physicsBody?.node?.removeAllActions()
  47. //
  48. // if enemyList.isAllEnemyRemoved() {
  49. // state = .GameClear
  50. //
  51. // let myLabel = SKLabelNode(fontNamed: "HiraginoSans-W6")
  52. // myLabel.text = "ゲームクリア"
  53. // myLabel.fontSize = 45
  54. // myLabel.position = CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame) - 20)
  55. // addChild(myLabel)
  56. // }
  57. // }
  58. // }
  59. // }
  60. }
  61. }

 GameSceneに「createChars」という自機を作るメソッドを作りました。

 次は、SetCharSceneからそのメソッドを呼び出すようにします。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.chars.map { $0.position }) // この1行を追加
  10. })
  11. addChild(button)
  12. }
  13. // 省略
  14. }

 これで自由に自機をセットできるようになりました。

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