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日土曜日
- 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日土曜日
- 29. ゲームの
基本は無
限ループ
12年11月17日土曜日
- 30. 基本ループ 1
• int main()
{
GameInitialize();
whlie( isGameFinish() )
{
GameMainLoop();
}
GameFinalize();
}
12年11月17日土曜日
- 32. 基本ループ 2
• applicationDidFinishLaunching
{
GameInitialize();
SetTimer(1.f/60.f);
}
• OnTimer
{
GameMainLoop();
}
• applicationWillTerminate
{
GameFinalize();
}
12年11月17日土曜日
- 33. ソースコ
ードは壊
滅的
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日土曜日