i phone勉強会 2010_03_06_gameloop

76
ゲームループの つくりかた 沖田@tmokita 121117日土曜日

Upload: tomohiko-okita

Post on 13-Jul-2015

649 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: I phone勉強会 2010_03_06_gameloop

ゲームループのつくりかた

沖田@tmokita

12年11月17日土曜日

Page 2: I phone勉強会 2010_03_06_gameloop

おわび

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

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

12年11月17日土曜日

Page 3: I phone勉強会 2010_03_06_gameloop

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

• つっこんでもらったほうが安心します。12年11月17日土曜日

Page 4: I phone勉強会 2010_03_06_gameloop

自己紹介

12年11月17日土曜日

Page 5: I phone勉強会 2010_03_06_gameloop

沖田知彦@

 tmokita12年11月17日土曜日

Page 6: I phone勉強会 2010_03_06_gameloop

本業12年11月17日土曜日

Page 7: I phone勉強会 2010_03_06_gameloop

零細ゲームデベロッパ所属

iPhone案件はじめました12年11月17日土曜日

Page 8: I phone勉強会 2010_03_06_gameloop

しかし12年11月17日土曜日

Page 9: I phone勉強会 2010_03_06_gameloop

不況12年11月17日土曜日

Page 10: I phone勉強会 2010_03_06_gameloop

なので12年11月17日土曜日

Page 11: I phone勉強会 2010_03_06_gameloop

副業12年11月17日土曜日

Page 12: I phone勉強会 2010_03_06_gameloop

iPhoneプログラマ12年11月17日土曜日

Page 13: I phone勉強会 2010_03_06_gameloop

関わったアプリ

12年11月17日土曜日

Page 14: I phone勉強会 2010_03_06_gameloop

その他はひみつ

12年11月17日土曜日

Page 15: I phone勉強会 2010_03_06_gameloop

あらためて12年11月17日土曜日

Page 16: I phone勉強会 2010_03_06_gameloop

ゲームループのつくりかた(初級編)

12年11月17日土曜日

Page 17: I phone勉強会 2010_03_06_gameloop

目次• はじめに

• 業界用語

• 基本ループの考えかた

• Sceneとかなんとか

• おまけ

12年11月17日土曜日

Page 18: I phone勉強会 2010_03_06_gameloop

はじめに

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

12年11月17日土曜日

Page 19: I phone勉強会 2010_03_06_gameloop

が!12年11月17日土曜日

Page 20: I phone勉強会 2010_03_06_gameloop

• 実はたいしたことはやっていませんごめんなさい

12年11月17日土曜日

Page 21: I phone勉強会 2010_03_06_gameloop

とりあえず知っとけ的な物

12年11月17日土曜日

Page 22: I phone勉強会 2010_03_06_gameloop

業界用語• リソース(音とか絵とかバイナリとか、データそのもの)• レイヤー(大きい単位での描画優先順位)• プライオリティ(小さい単位での描画優先順位)• BG(背景)

• スプライト、オブジェ(細かく動くやつ)• フレーム(FPS:フレーム/Sec 60FPS=秒間60回画面更新)

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

Page 23: I phone勉強会 2010_03_06_gameloop

リソース(Resource)

• リソースマネージャがあると便利

• 無駄な重複読み込みを防ぐ

• 最適なリソース配置

• 非同期ロードなどの処理

12年11月17日土曜日

Page 24: I phone勉強会 2010_03_06_gameloop

レイヤー(Layer)• 描画順番を大きく区切るための構造

• フォトショップのレイヤーとか

手前12年11月17日土曜日

Page 25: I phone勉強会 2010_03_06_gameloop

プライオリティ• 同じレイヤー内での描画順番

Layer Layer

> <12年11月17日土曜日

Page 26: I phone勉強会 2010_03_06_gameloop

BG,スプライト

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

都合により発表時とは画像を変えてあります

12年11月17日土曜日

Page 27: I phone勉強会 2010_03_06_gameloop

以上をふまえて

12年11月17日土曜日

Page 28: I phone勉強会 2010_03_06_gameloop

ループの話

12年11月17日土曜日

Page 29: I phone勉強会 2010_03_06_gameloop

ゲームの基本は無限ループ

12年11月17日土曜日

Page 30: I phone勉強会 2010_03_06_gameloop

基本ループ 1

• int main(){ GameInitialize(); whlie( isGameFinish() ) { GameMainLoop(); } GameFinalize();}

12年11月17日土曜日

Page 31: I phone勉強会 2010_03_06_gameloop

iPhoneの場合はタイマーで

12年11月17日土曜日

Page 32: I phone勉強会 2010_03_06_gameloop

基本ループ 2• applicationDidFinishLaunching

{ GameInitialize(); SetTimer(1.f/60.f);}

• OnTimer{ GameMainLoop();}

• applicationWillTerminate{ GameFinalize();}

12年11月17日土曜日

Page 33: I phone勉強会 2010_03_06_gameloop

ソースコードは壊滅的

12年11月17日土曜日

Page 34: I phone勉強会 2010_03_06_gameloop

でも書きます

12年11月17日土曜日

Page 35: I phone勉強会 2010_03_06_gameloop

そしてシーン

12年11月17日土曜日

Page 36: I phone勉強会 2010_03_06_gameloop

これが今日のメイン

12年11月17日土曜日

Page 37: I phone勉強会 2010_03_06_gameloop

Scene

• Webでいうところの各ページ

• 各画面をSceneとして作り最後に接続する

• ex.)タイトル画面ゲームメインエンディング

12年11月17日土曜日

Page 38: I phone勉強会 2010_03_06_gameloop

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

シーンのイメージ(あくまでもイメージ)

Title GameMain Ending

都合により発表時とは画像を変えてあります

12年11月17日土曜日

Page 39: I phone勉強会 2010_03_06_gameloop

各シーンのつくり方

12年11月17日土曜日

Page 40: I phone勉強会 2010_03_06_gameloop

Pattern 1• Switch−Caseでの分岐

while(1) { switch(nScene) { case kSceneTitle: funcTitleScene(); break; case kSceneGameMain: funcGameMainScene(); break; case kSceneEnding: funcEndingScene(); break; }}

12年11月17日土曜日

Page 41: I phone勉強会 2010_03_06_gameloop

Pattern 2

• 関数ポインタにする• typedef void (*SceneFunc)(void*);

SceneFunc funcScenes[] = { funcTitleScene, funcGameMainScene, funcEndingScene};

• while(1) { funcScenes[nScene](&arg);}

12年11月17日土曜日

Page 42: I phone勉強会 2010_03_06_gameloop

Pattern 3

• 仮想関数にする• CSceneBase sceneArray[] = {

TitleClass, GameMainClass, EndingClass,};

• while(1) { CSceneBase* currentScene = getCurrentScene(); currentScene->exec();}

12年11月17日土曜日

Page 43: I phone勉強会 2010_03_06_gameloop

• 基本的なループはこんなかんじ

12年11月17日土曜日

Page 44: I phone勉強会 2010_03_06_gameloop

ためしに

12年11月17日土曜日

Page 45: I phone勉強会 2010_03_06_gameloop

•スプライトを一つ保持して描画するシーンを考える

• Class SceneOne{ CSprite* sprite;}

12年11月17日土曜日

Page 46: I phone勉強会 2010_03_06_gameloop

必要な処理を考える

• Initialize - 初期化

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

•Finalize - 終了処理

12年11月17日土曜日

Page 47: I phone勉強会 2010_03_06_gameloop

書いてみる• Scene::Initialize

{ sprite = [[CSprite alloc] initWithData:@”texture.png”];}

• Scene::Main(){ [sprite updateParameter]; [sprite draw];}

• Scene::Finalize(){ [sprite release];}

12年11月17日土曜日

Page 48: I phone勉強会 2010_03_06_gameloop

できた12年11月17日土曜日

Page 49: I phone勉強会 2010_03_06_gameloop

しかし12年11月17日土曜日

Page 50: I phone勉強会 2010_03_06_gameloop

あれれのれ?

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

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

12年11月17日土曜日

Page 51: I phone勉強会 2010_03_06_gameloop

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

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

12年11月17日土曜日

Page 52: I phone勉強会 2010_03_06_gameloop

もういちど考える• Initialize - 初期化

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

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

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

•Draw - 描画処理

• Finalize - 終了処理

12年11月17日土曜日

Page 53: I phone勉強会 2010_03_06_gameloop

も一回書いてみる(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日土曜日

Page 54: I phone勉強会 2010_03_06_gameloop

も一回書いてみる(2)• Scene::Main

{ [sprite updateParameter];}

• Scene::Draw{ [GameSystem requestDraw:sprite];}

• Scene::Finalize(){ [sprite release];}

12年11月17日土曜日

Page 55: I phone勉強会 2010_03_06_gameloop

できた!12年11月17日土曜日

Page 56: I phone勉強会 2010_03_06_gameloop

シーン完成!

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

12年11月17日土曜日

Page 57: I phone勉強会 2010_03_06_gameloop

そして12年11月17日土曜日

Page 58: I phone勉強会 2010_03_06_gameloop

接続12年11月17日土曜日

Page 59: I phone勉強会 2010_03_06_gameloop

Sceneの接続

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

12年11月17日土曜日

Page 60: I phone勉強会 2010_03_06_gameloop

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日土曜日

Page 61: I phone勉強会 2010_03_06_gameloop

ソースコードは壊滅的

12年11月17日土曜日

Page 62: I phone勉強会 2010_03_06_gameloop

Tips

• Scene選択できるSceneを作っておく

•できるだけScene単体で動くようにしておく

•→分業&デバッグが楽

12年11月17日土曜日

Page 63: I phone勉強会 2010_03_06_gameloop

まとめ12年11月17日土曜日

Page 64: I phone勉強会 2010_03_06_gameloop

まとめ• つまりはゲーム用の「便利なタスク」

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

• 仕組みを理解すれば各描画パーツに応用可能

12年11月17日土曜日

Page 65: I phone勉強会 2010_03_06_gameloop

おまけ12年11月17日土曜日

Page 66: I phone勉強会 2010_03_06_gameloop

お!12年11月17日土曜日

Page 67: I phone勉強会 2010_03_06_gameloop

こいつ12年11月17日土曜日

Page 68: I phone勉強会 2010_03_06_gameloop

できるな!12年11月17日土曜日

Page 69: I phone勉強会 2010_03_06_gameloop

と思わせる小ワザ• メモリプールをつくる(実は大技)

• 構造体は無駄なく並べる

• 2の累乗の剰余は&でマスク

• 2の累乗を掛ける(割る)ときはシフト

• キー入力のバリエーションをつくる

12年11月17日土曜日

Page 70: I phone勉強会 2010_03_06_gameloop

キー入力

• Normal - 押している間だけOn

• Repeat - 押した瞬間と一定時間後にOn

• Trig - 押した瞬間だけOn

• EndTrig - 離した瞬間だけOn

12年11月17日土曜日

Page 71: I phone勉強会 2010_03_06_gameloop

これで12年11月17日土曜日

Page 72: I phone勉強会 2010_03_06_gameloop

できるね!12年11月17日土曜日

Page 73: I phone勉強会 2010_03_06_gameloop

やったね!12年11月17日土曜日

Page 74: I phone勉強会 2010_03_06_gameloop

おめでとう!

12年11月17日土曜日

Page 75: I phone勉強会 2010_03_06_gameloop

ありがとうございました

12年11月17日土曜日

Page 76: I phone勉強会 2010_03_06_gameloop

• いずれどこかで中級編を・・・

[email protected]

• Twitter : tmokita

12年11月17日土曜日