• Like
I phone勉強会 2010_03_06_gameloop
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

I phone勉強会 2010_03_06_gameloop

  • 612 views
Published

西東京iPhone勉強会で発表した遺産です

西東京iPhone勉強会で発表した遺産です

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
  • 遺産ゲットに来ました。
    Are you sure you want to
    Your message goes here
No Downloads

Views

Total Views
612
On SlideShare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
1
Comments
1
Likes
2

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. ゲームループの つくりかた 沖田@tmokita12年11月17日土曜日
  • 2. おわび • いまさらな内容かもしれませんし iPhone固有というところはあまりないです。 ごめんなさい。 • ゲーム作りのきっかけになれば と思って発表することにしました。 その程度です、ごめんなさい。12年11月17日土曜日
  • 3. おねがい • 発表の途中でも ・よくわからねぇぞ!《゚Д゚》ゴラァア!!  とか ・細かく説明しろ!《゚Д゚》ゴラァア!!  とかあったら 随時お気軽にお願いします。 • つっこんでもらったほうが安心します。12年11月17日土曜日
  • 4. 自己12年11月17日土曜日 紹介
  • 5. 沖田 知彦 @  tmokita12年11月17日土曜日
  • 6. 本業12年11月17日土曜日
  • 7. 零細ゲーム デベロッパ 所属 iPhone案件はじめました12年11月17日土曜日
  • 8. しかし12年11月17日土曜日
  • 9. 不況12年11月17日土曜日
  • 10. なので12年11月17日土曜日
  • 11. 副業12年11月17日土曜日
  • 12. iPhoneプログラマ12年11月17日土曜日
  • 13. 関わった アプリ12年11月17日土曜日
  • 14. その他はひみつ12年11月17日土曜日
  • 15. あらためて12年11月17日土曜日
  • 16. ゲームループの つくりかた (初級編)12年11月17日土曜日
  • 17. 目次 • はじめに • 業界用語 • 基本ループの考えかた • Sceneとかなんとか • おまけ12年11月17日土曜日
  • 18. はじめに • ゲームの作り方を 難しく考えすぎている 人が多い12年11月17日土曜日
  • 19. 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 Ending12年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日土曜日
  • 43. • 基本的なループはこんなかんじ12年11月17日土曜日
  • 44. ため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日土曜日
  • 48. できた12年11月17日土曜日
  • 49. しかし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日土曜日
  • 55. できた!12年11月17日土曜日
  • 56. シーン完成! • 一つのSceneは基本的にこんなかんじ12年11月17日土曜日
  • 57. そして12年11月17日土曜日
  • 58. 接続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日土曜日
  • 63. まとめ12年11月17日土曜日
  • 64. まとめ • つまりはゲーム用の 「便利なタスク」 • ゲーム用として Loading、Draw、を考慮 • 仕組みを理解すれば 各描画パーツに応用可能12年11月17日土曜日
  • 65. おまけ12年11月17日土曜日
  • 66. お!12年11月17日土曜日
  • 67. こいつ12年11月17日土曜日
  • 68. できるな!12年11月17日土曜日
  • 69. と思わせる小ワザ • メモリプールをつくる(実は大技) • 構造体は無駄なく並べる • 2の累乗の剰余は&でマスク • 2の累乗を掛ける(割る)ときはシフト • キー入力のバリエーションをつくる12年11月17日土曜日
  • 70. キー入力 • Normal - 押している間だけOn • Repeat - 押した瞬間と一定時間後にOn • Trig - 押した瞬間だけOn • EndTrig - 離した瞬間だけOn12年11月17日土曜日
  • 71. これで12年11月17日土曜日
  • 72. できるね!12年11月17日土曜日
  • 73. やったね!12年11月17日土曜日
  • 74. おめでとう!12年11月17日土曜日
  • 75. あ り が と う ございました12年11月17日土曜日
  • 76. • いずれどこかで中級編を・・・ • tmokita@gmail.com • Twitter : tmokita12年11月17日土曜日