SlideShare ist ein Scribd-Unternehmen logo
1 von 76
Downloaden Sie, um offline zu lesen
ゲームループの
               つくりかた
                 沖田@tmokita




12年11月17日土曜日
おわび

        • いまさらな内容かもしれませんし
               iPhone固有というところはあまりないです。
               ごめんなさい。

        • ゲーム作りのきっかけになれば
               と思って発表することにしました。
               その程度です、ごめんなさい。

12年11月17日土曜日
おねがい
               • 発表の途中でも
                ・よくわからねぇぞ!《゚Д゚》ゴラァア!!
                 とか
                ・細かく説明しろ!《゚Д゚》ゴラァア!!
                 とかあったら
                随時お気軽にお願いします。

               • つっこんでもらったほうが安心します。
12年11月17日土曜日
自己
12年11月17日土曜日
               紹介
沖田
                知彦
                 @
                tmokita
12年11月17日土曜日
本業
12年11月17日土曜日
零細ゲーム
   デベロッパ
     所属        iPhone案件はじめました
12年11月17日土曜日
しかし
12年11月17日土曜日
不況
12年11月17日土曜日
なので
12年11月17日土曜日
副業
12年11月17日土曜日
iPhone
プログラマ
12年11月17日土曜日
関わった
            アプリ
12年11月17日土曜日
その他はひみつ


12年11月17日土曜日
あらためて
12年11月17日土曜日
ゲームループの
               つくりかた
               (初級編)
12年11月17日土曜日
目次
               • はじめに
               • 業界用語
               • 基本ループの考えかた
                • Sceneとかなんとか
               • おまけ
12年11月17日土曜日
はじめに

               • ゲームの作り方を
                 難しく考えすぎている
               人が多い




12年11月17日土曜日
12年11月17日土曜日
               が!
• 実はたいしたことはやっていません
                ごめんなさい




12年11月17日土曜日
とりあえ
           ず知っと
           け的な物
12年11月17日土曜日
業界用語
          •    リソース(音とか絵とかバイナリとか、データそのもの)

          •    レイヤー(大きい単位での描画優先順位)

          •    プライオリティ(小さい単位での描画優先順位)

          •    BG(背景)

          •    スプライト、オブジェ(細かく動くやつ)

          •    フレーム(FPS:フレーム/Sec 60FPS=秒間60回画面更新)


          • シーン、モード(各画面)
12年11月17日土曜日
リソース(Resource)

               • リソースマネージャがあると便利
                • 無駄な重複読み込みを防ぐ
                • 最適なリソース配置
                • 非同期ロードなどの処理

12年11月17日土曜日
レイヤー(Layer)
               • 描画順番を大きく区切るための構造
               • フォトショップのレイヤーとか

                  奥


                      手前
12年11月17日土曜日
プライオリティ
               • 同じレイヤー内での描画順番
     Layer               Layer




                  >              <
12年11月17日土曜日
都合により発表時とは画像
                BG,スプライト
     を変えてあります




      BG                   スプライト
                           (オブジェ)




12年11月17日土曜日
以上を
           ふまえて
12年11月17日土曜日
ループの
                 話
12年11月17日土曜日
ゲームの
           基本は無
           限ループ
12年11月17日土曜日
基本ループ 1
               • int main()
                 {
                     GameInitialize();
                     whlie( isGameFinish() )
                     {
                       GameMainLoop();
                     }
                     GameFinalize();
                 }


12年11月17日土曜日
iPhoneの
           場合はタ
           イマーで
12年11月17日土曜日
基本ループ 2
               •   applicationDidFinishLaunching
                   {
                     GameInitialize();
                     SetTimer(1.f/60.f);
                   }
               •   OnTimer
                   {
                     GameMainLoop();
                   }
               •   applicationWillTerminate
                   {
                     GameFinalize();
                   }



12年11月17日土曜日
ソースコ
           ードは壊
            滅的
12年11月17日土曜日
でも
           書きます
12年11月17日土曜日
そして
          シーン
12年11月17日土曜日
これが
               今日の
12年11月17日土曜日
               メイン
Scene
               • Webでいうところの各ページ
               • 各画面をSceneとして作り最後に接続する
               • ex.)
                タイトル画面
                ゲームメイン
                エンディング


12年11月17日土曜日
シーンのイメージ
                (あくまでもイメージ)
  都合により発表時とは画像
     を変えてあります




               タイトル画面     ゲームプレイ画面   エンディング




                Title     GameMain   Ending
12年11月17日土曜日
各シー
               ンのつ
12年11月17日土曜日
               くり方
Pattern 1
               •   Switch−Caseでの分岐
                   while(1) {
                     switch(nScene) {
                     case kSceneTitle:
                       funcTitleScene();
                       break;
                     case kSceneGameMain:
                       funcGameMainScene();
                       break;
                     case kSceneEnding:
                       funcEndingScene();
                       break;
                     }
                   }
12年11月17日土曜日
Pattern 2
               •   関数ポインタにする

               •   typedef void (*SceneFunc)(void*);
                   SceneFunc funcScenes[] = {
                     funcTitleScene,
                     funcGameMainScene,
                     funcEndingScene
                   };
               •   while(1) {
                     funcScenes[nScene](&arg);
                   }
12年11月17日土曜日
Pattern 3
               •   仮想関数にする

               •   CSceneBase sceneArray[] = {
                    TitleClass,
                     GameMainClass,
                     EndingClass,
                   };
               •   while(1) {
                     CSceneBase* currentScene = getCurrentScene();
                     currentScene->exec();
                   }

12年11月17日土曜日
• 基本的なループはこんなかんじ




12年11月17日土曜日
ため
12年11月17日土曜日
               しに
• スプライトを一つ保持して
                描画するシーンを考える

               • Class SceneOne
                {
                    CSprite* sprite;
                }


12年11月17日土曜日
必要な処理を考える

               •Initialize - 初期化

               • Main - 毎フレーム呼ばれる

               • Finalize - 終了処理

12年11月17日土曜日
書いてみる
               •   Scene::Initialize
                   {
                     sprite = [[CSprite alloc] initWithData:@”texture.png”];
                   }
               •   Scene::Main()
                   {
                     [sprite updateParameter];
                     [sprite draw];
                   }
               •   Scene::Finalize()
                   {
                     [sprite release];
                   }
12年11月17日土曜日
できた
12年11月17日土曜日
しかし
12年11月17日土曜日
あれれのれ?

      •    非同期ロードは?
           →「NowLoading」とかは?

      •    ん?描画ってこれでいいの?

12年11月17日土曜日
• リソースのロードは非同期に行う
           そのため
           「ロード要求」と
           「ロードしたデータのセット」
           は段階をわけて行う必要がある

      • レイヤーやプライオリティを考慮したり
           高速化のためには
           描画はまとめて一気に行うほうが都合がよい


12年11月17日土曜日
もういちど考える
               •   Initialize - 初期化


               •Loading          - リソースのロード中


               •PreMain           - ロード後メインループ前に一回

               •   Main - 毎フレーム呼ばれる処理


               •   Draw - 描画処理
               •   Finalize - 終了処理

12年11月17日土曜日
も一回書いてみる(1)
               •   Scene::Initialize
                   {
                     sprite = [[CSprite alloc] init];
                     [ResourceManage requestLoad_SpriteData];
                   }
               •   Scene::Loading()
                   {
                     [GameSystem requestDraw_NowLoading];
                   }
               •   Scene::PreMain()
                   {
                     data = [ResourceManage getLoadedSpriteData()];
                     [sprite setData:data];
                     [sprite setLayer:LAYER_0];
                     [sprite setPriority:100];
                   }
12年11月17日土曜日
も一回書いてみる(2)
               •   Scene::Main
                   {
                     [sprite updateParameter];
                   }
               •   Scene::Draw
                   {
                     [GameSystem requestDraw:sprite];
                   }
               •   Scene::Finalize()
                   {
                     [sprite release];
                   }

12年11月17日土曜日
できた!
12年11月17日土曜日
シーン完成!


               • 一つのSceneは基本的にこんなかんじ



12年11月17日土曜日
そして
12年11月17日土曜日
接続
12年11月17日土曜日
Sceneの接続

        •      Sceneをつなぐ
               1 現在実行中のシーンの終了
               2 次のシーンの初期化


12年11月17日土曜日
while(1){
                 CSceneBase* curentScene = getCurrentScene();

                   // 初期化
                   if( [curentScene isNotInitialize] )
                       [curentScene Initialize];

                   //ロード中
                   if( [ResourceManager isLoading] )
                       [curentScene Loading];

                   // ロード完了後に一回だけ
                   if( [ResourceManager isLoadFinish] )
                       [currentScene PreMain];

                   // Loading中にMain、Drawを呼ぶかはご自由に
                   [currentScene Main];
                   [currentScene Draw];

                   // シーンのDrawでRequestされたものをレイヤーとプライオリティを考慮して描画
                   [GameSystem DrawRequestedObject];

                   if( [SceneManager isRequestChange] )
                   {
                       [currentScene Finalize];
                       [SceneManager setNextScene: getRequestedScene()];
                   }
               }
12年11月17日土曜日
ソースコ
           ードは壊
            滅的
12年11月17日土曜日
Tips

      • Scene選択できるSceneを作っておく
      • できるだけScene単体で動くように
           しておく

      • →分業&デバッグが楽
12年11月17日土曜日
まとめ
12年11月17日土曜日
まとめ
               • つまりはゲーム用の
                「便利なタスク」

               • ゲーム用として
                Loading、Draw、を考慮

               • 仕組みを理解すれば
                各描画パーツに応用可能
12年11月17日土曜日
おまけ
12年11月17日土曜日
お!
12年11月17日土曜日
こいつ
12年11月17日土曜日
できるな!
12年11月17日土曜日
と思わせる小ワザ
               • メモリプールをつくる(実は大技)
               • 構造体は無駄なく並べる
               • 2の累乗の剰余は&でマスク
               • 2の累乗を掛ける(割る)ときはシフト
               • キー入力のバリエーションをつくる
12年11月17日土曜日
キー入力

               • Normal - 押している間だけOn
               • Repeat - 押した瞬間と一定時間後にOn
               • Trig - 押した瞬間だけOn
               • EndTrig - 離した瞬間だけOn

12年11月17日土曜日
これで
12年11月17日土曜日
できるね!
12年11月17日土曜日
やったね!
12年11月17日土曜日
おめでとう!

12年11月17日土曜日
あ
 り
 が
 と
 う
 ございました
12年11月17日土曜日
• いずれどこかで中級編を・・・
               • tmokita@gmail.com
               • Twitter : tmokita


12年11月17日土曜日

Weitere ähnliche Inhalte

Andere mochten auch (11)

Energy management
Energy managementEnergy management
Energy management
 
Wtidev 0430 tmoktia
Wtidev 0430 tmoktiaWtidev 0430 tmoktia
Wtidev 0430 tmoktia
 
Cocos2dx 8hour
Cocos2dx 8hourCocos2dx 8hour
Cocos2dx 8hour
 
Wtidev0227 tmokita
Wtidev0227 tmokitaWtidev0227 tmokita
Wtidev0227 tmokita
 
Marteokiko
MarteokikoMarteokiko
Marteokiko
 
Team building a case study
Team building a case studyTeam building a case study
Team building a case study
 
Design of super elevation :- A case study
Design of super elevation :- A case studyDesign of super elevation :- A case study
Design of super elevation :- A case study
 
Extraction of developed pillars by opencast mine: acase study
Extraction of developed pillars by opencast mine:   acase studyExtraction of developed pillars by opencast mine:   acase study
Extraction of developed pillars by opencast mine: acase study
 
Highwall mining – a new approach in india
Highwall mining – a new approach in indiaHighwall mining – a new approach in india
Highwall mining – a new approach in india
 
New approch towards support desugn
New approch towards support desugnNew approch towards support desugn
New approch towards support desugn
 
Pillar design
Pillar designPillar design
Pillar design
 

I phone勉強会 2010_03_06_gameloop

  • 1. ゲームループの つくりかた 沖田@tmokita 12年11月17日土曜日
  • 2. おわび • いまさらな内容かもしれませんし iPhone固有というところはあまりないです。 ごめんなさい。 • ゲーム作りのきっかけになれば と思って発表することにしました。 その程度です、ごめんなさい。 12年11月17日土曜日
  • 3. おねがい • 発表の途中でも ・よくわからねぇぞ!《゚Д゚》ゴラァア!!  とか ・細かく説明しろ!《゚Д゚》ゴラァア!!  とかあったら 随時お気軽にお願いします。 • つっこんでもらったほうが安心します。 12年11月17日土曜日
  • 5. 沖田 知彦 @  tmokita 12年11月17日土曜日
  • 7. 零細ゲーム デベロッパ 所属 iPhone案件はじめました 12年11月17日土曜日
  • 13. 関わった アプリ 12年11月17日土曜日
  • 16. ゲームループの つくりかた (初級編) 12年11月17日土曜日
  • 17. 目次 • はじめに • 業界用語 • 基本ループの考えかた • Sceneとかなんとか • おまけ 12年11月17日土曜日
  • 18. はじめに • ゲームの作り方を 難しく考えすぎている 人が多い 12年11月17日土曜日
  • 20. • 実はたいしたことはやっていません ごめんなさい 12年11月17日土曜日
  • 21. とりあえ ず知っと け的な物 12年11月17日土曜日
  • 22. 業界用語 • リソース(音とか絵とかバイナリとか、データそのもの) • レイヤー(大きい単位での描画優先順位) • プライオリティ(小さい単位での描画優先順位) • BG(背景) • スプライト、オブジェ(細かく動くやつ) • フレーム(FPS:フレーム/Sec 60FPS=秒間60回画面更新) • シーン、モード(各画面) 12年11月17日土曜日
  • 23. リソース(Resource) • リソースマネージャがあると便利 • 無駄な重複読み込みを防ぐ • 最適なリソース配置 • 非同期ロードなどの処理 12年11月17日土曜日
  • 24. レイヤー(Layer) • 描画順番を大きく区切るための構造 • フォトショップのレイヤーとか 奥 手前 12年11月17日土曜日
  • 25. プライオリティ • 同じレイヤー内での描画順番 Layer Layer > < 12年11月17日土曜日
  • 26. 都合により発表時とは画像 BG,スプライト を変えてあります BG スプライト (オブジェ) 12年11月17日土曜日
  • 27. 以上を ふまえて 12年11月17日土曜日
  • 28. ループの 話 12年11月17日土曜日
  • 29. ゲームの 基本は無 限ループ 12年11月17日土曜日
  • 30. 基本ループ 1 • int main() { GameInitialize(); whlie( isGameFinish() ) { GameMainLoop(); } GameFinalize(); } 12年11月17日土曜日
  • 31. iPhoneの 場合はタ イマーで 12年11月17日土曜日
  • 32. 基本ループ 2 • applicationDidFinishLaunching { GameInitialize(); SetTimer(1.f/60.f); } • OnTimer { GameMainLoop(); } • applicationWillTerminate { GameFinalize(); } 12年11月17日土曜日
  • 33. ソースコ ードは壊 滅的 12年11月17日土曜日
  • 34. でも 書きます 12年11月17日土曜日
  • 35. そして シーン 12年11月17日土曜日
  • 36. これが 今日の 12年11月17日土曜日 メイン
  • 37. Scene • Webでいうところの各ページ • 各画面をSceneとして作り最後に接続する • ex.) タイトル画面 ゲームメイン エンディング 12年11月17日土曜日
  • 38. シーンのイメージ (あくまでもイメージ) 都合により発表時とは画像 を変えてあります タイトル画面 ゲームプレイ画面 エンディング Title GameMain Ending 12年11月17日土曜日
  • 39. 各シー ンのつ 12年11月17日土曜日 くり方
  • 40. Pattern 1 • Switch−Caseでの分岐 while(1) { switch(nScene) { case kSceneTitle: funcTitleScene(); break; case kSceneGameMain: funcGameMainScene(); break; case kSceneEnding: funcEndingScene(); break; } } 12年11月17日土曜日
  • 41. Pattern 2 • 関数ポインタにする • typedef void (*SceneFunc)(void*); SceneFunc funcScenes[] = { funcTitleScene, funcGameMainScene, funcEndingScene }; • while(1) { funcScenes[nScene](&arg); } 12年11月17日土曜日
  • 42. Pattern 3 • 仮想関数にする • CSceneBase sceneArray[] = { TitleClass, GameMainClass, EndingClass, }; • while(1) { CSceneBase* currentScene = getCurrentScene(); currentScene->exec(); } 12年11月17日土曜日
  • 45. • スプライトを一つ保持して 描画するシーンを考える • Class SceneOne { CSprite* sprite; } 12年11月17日土曜日
  • 46. 必要な処理を考える •Initialize - 初期化 • Main - 毎フレーム呼ばれる • Finalize - 終了処理 12年11月17日土曜日
  • 47. 書いてみる • Scene::Initialize { sprite = [[CSprite alloc] initWithData:@”texture.png”]; } • Scene::Main() { [sprite updateParameter]; [sprite draw]; } • Scene::Finalize() { [sprite release]; } 12年11月17日土曜日
  • 50. あれれのれ? • 非同期ロードは? →「NowLoading」とかは? • ん?描画ってこれでいいの? 12年11月17日土曜日
  • 51. • リソースのロードは非同期に行う そのため 「ロード要求」と 「ロードしたデータのセット」 は段階をわけて行う必要がある • レイヤーやプライオリティを考慮したり 高速化のためには 描画はまとめて一気に行うほうが都合がよい 12年11月17日土曜日
  • 52. もういちど考える • Initialize - 初期化 •Loading - リソースのロード中 •PreMain - ロード後メインループ前に一回 • Main - 毎フレーム呼ばれる処理 • Draw - 描画処理 • Finalize - 終了処理 12年11月17日土曜日
  • 53. も一回書いてみる(1) • Scene::Initialize { sprite = [[CSprite alloc] init]; [ResourceManage requestLoad_SpriteData]; } • Scene::Loading() { [GameSystem requestDraw_NowLoading]; } • Scene::PreMain() { data = [ResourceManage getLoadedSpriteData()]; [sprite setData:data]; [sprite setLayer:LAYER_0]; [sprite setPriority:100]; } 12年11月17日土曜日
  • 54. も一回書いてみる(2) • Scene::Main { [sprite updateParameter]; } • Scene::Draw { [GameSystem requestDraw:sprite]; } • Scene::Finalize() { [sprite release]; } 12年11月17日土曜日
  • 56. シーン完成! • 一つのSceneは基本的にこんなかんじ 12年11月17日土曜日
  • 59. Sceneの接続 • Sceneをつなぐ 1 現在実行中のシーンの終了 2 次のシーンの初期化 12年11月17日土曜日
  • 60. while(1){ CSceneBase* curentScene = getCurrentScene(); // 初期化 if( [curentScene isNotInitialize] ) [curentScene Initialize]; //ロード中 if( [ResourceManager isLoading] ) [curentScene Loading]; // ロード完了後に一回だけ if( [ResourceManager isLoadFinish] ) [currentScene PreMain]; // Loading中にMain、Drawを呼ぶかはご自由に [currentScene Main]; [currentScene Draw]; // シーンのDrawでRequestされたものをレイヤーとプライオリティを考慮して描画 [GameSystem DrawRequestedObject]; if( [SceneManager isRequestChange] ) { [currentScene Finalize]; [SceneManager setNextScene: getRequestedScene()]; } } 12年11月17日土曜日
  • 61. ソースコ ードは壊 滅的 12年11月17日土曜日
  • 62. Tips • Scene選択できるSceneを作っておく • できるだけScene単体で動くように しておく • →分業&デバッグが楽 12年11月17日土曜日
  • 64. まとめ • つまりはゲーム用の 「便利なタスク」 • ゲーム用として Loading、Draw、を考慮 • 仕組みを理解すれば 各描画パーツに応用可能 12年11月17日土曜日
  • 69. と思わせる小ワザ • メモリプールをつくる(実は大技) • 構造体は無駄なく並べる • 2の累乗の剰余は&でマスク • 2の累乗を掛ける(割る)ときはシフト • キー入力のバリエーションをつくる 12年11月17日土曜日
  • 70. キー入力 • Normal - 押している間だけOn • Repeat - 押した瞬間と一定時間後にOn • Trig - 押した瞬間だけOn • EndTrig - 離した瞬間だけOn 12年11月17日土曜日
  • 75. あ り が と う ございました 12年11月17日土曜日
  • 76. • いずれどこかで中級編を・・・ • tmokita@gmail.com • Twitter : tmokita 12年11月17日土曜日