Your SlideShare is downloading. ×
0
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

I phone勉強会 2010_03_06_gameloop

645

Published on

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

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

1 Comment
2 Likes
Statistics
Notes
  • 遺産ゲットに来ました。
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total Views
645
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
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日土曜日

×