シーンごとのソース管理
シーンごとのソース管理
以前こちらで質問させて頂きました者です。
http://www.play21.jp/board/formz.cgi?ac ... &rln=38727
上記のソースを使いシーンの管理をしております。
ただシーンのチェンジのやりかたがわかりません。
どのようにすればよいのでしょうか・・・。
http://www.play21.jp/board/formz.cgi?ac ... &rln=38727
上記のソースを使いシーンの管理をしております。
ただシーンのチェンジのやりかたがわかりません。
どのようにすればよいのでしょうか・・・。
Re:シーンごとのソース管理
GetSceneFuncに渡す引数[シーンID]を変えれば実行されるシーン関数が変わります。
シーンIDは変数としてどこかに保持しておいて、シーンを変えたくなったら別のIDを代入するといいでしょう。
シーンIDは変数としてどこかに保持しておいて、シーンを変えたくなったら別のIDを代入するといいでしょう。
Re:シーンごとのソース管理
回答ありがとうございます。
// スタート時のシーン SCENE_START
// ゲームシーン SCENE_GAME
whileの中にGetSceneFunc(SCENE_GAME);
と書いてあるのですがシーンが変わってくれません・・。
使い方が違うのでしょうか・・・。
// スタート時のシーン SCENE_START
// ゲームシーン SCENE_GAME
whileの中にGetSceneFunc(SCENE_GAME);
と書いてあるのですがシーンが変わってくれません・・。
使い方が違うのでしょうか・・・。
Re:シーンごとのソース管理
そのソースを見ないとなんともよくわからないところがありますが、
GetSceneFunc関数の中で、IDに応じて返すシーン関数情報はそれぞれ正しく IDに対応したものを
返していますか?
GetSceneFunc関数の中で、IDに応じて返すシーン関数情報はそれぞれ正しく IDに対応したものを
返していますか?
Re:シーンごとのソース管理
game_sceneとstart_sceneは用意してあります。
お互いにDrawにお互い違うメッセージを表示するようにしております。
お互いにDrawにお互い違うメッセージを表示するようにしております。
#include "DxLib.h" #include "MyLib.h" #include "main.h" #include "start_scene.h" #include "game_scene.h" #include <time.h> ////////////////////////////////////////////////// // キー用 typedef struct{ bool Flg; char Key; char pulKey; char trgKey; }KEY; KEY Key[256]; ////////////////////////////////////////////////// void SetKey(void); ////////////////////////////////////////////////// // シーンIDの管理 typedef enum SceneID{ SCENE_NONE, SCENE_START, SCENE_GAME, SCENE_MAX }SceneID; // シーンIDから呼び出す関数の情報を取得 const SceneFunc *GetSceneFunc(SceneID id) { const SceneFunc *sceneFunc; switch(id){ case SCENE_START: sceneFunc = GetSceneFunc_Start(); break; case SCENE_GAME: sceneFunc = GetSceneFunc_Game(); break; default: // sceneFunc = NULL; break; } System.SceneNum = id; return sceneFunc; } ////////////////////////////////////////////////// int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){ ChangeWindowMode(true); // ウインドウの変更 フルスクリーン・ウインドウ SetDrawScreen( DX_SCREEN_BACK ) ; // 描画先を裏画面に設定 SetWaitVSyncFlag( FALSE ); // DXライブラリ初期化処理 if( DxLib_Init() == -1 ){ return -1; // エラーが起きたら直ちに終了 } const SceneFunc *sceneFunc = GetSceneFunc(SCENE_START); // システム System.InitFlg = true; // フォント SetFontSize(FONT_SIZE); // ChangeFont("HGPゴシックM"); // 乱数の初期化 SRand((unsigned) time(NULL)); // 処理 while(1){ // メッセージループに代わる処理をする if(Key[KEY_INPUT_ESCAPE].Key || ProcessMessage() == -1 ){ break ; // エラーが起きたらループを抜ける } if(System.InitFlg){ if(sceneFunc->init) sceneFunc->init(); } SetKey(); if(sceneFunc->loop) sceneFunc->loop(); if(Key[KEY_INPUT_F3].trgKey){ GetSceneFunc(SCENE_GAME); } // BMP画像の表示 ClearDrawScreen(); if(sceneFunc->draw) sceneFunc->draw(); ScreenFlip(); if(System.FinishFlg){ if(sceneFunc->finish) sceneFunc->finish(); } System.InitFlg = false; System.FinishFlg = false; } // 描画が終ったのでグラフィックをメモリ上から削除する // DeleteGraph( H_Chr ) ; DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 } // キーの情報の取得 void SetKey(void){ static char key[256]; // キー入力の取得 GetHitKeyStateAll(key); for(int i=0; i<256; i++){ Key.Key = key; if(Key.Key){ if(Key.Flg == false){ Key.trgKey = true; Key.Flg = true; }else{ Key.trgKey = false; } }else{ Key.trgKey = 0; Key.Flg = false; } } }
Re:シーンごとのソース管理
実際にシーケンスを実行するための情報を持っているのが WinMain関数のローカル変数 sceneFuncなわけですが、
これが最初に GetSceneFunc(SCENE_START) でポインタを受け取って以来、変更されていません。
GetSceneFunc(SCENE_GAME) を呼んだ際に sceneFuncを更新してみて下さい。
それでシーンは変化するはずです。
これが最初に GetSceneFunc(SCENE_START) でポインタを受け取って以来、変更されていません。
GetSceneFunc(SCENE_GAME) を呼んだ際に sceneFuncを更新してみて下さい。
それでシーンは変化するはずです。
Re:シーンごとのソース管理
なんどもすみません。
変わっておりました。
if(Key[KEY_INPUT_F3].trgKey){
}
のコメントを外してidの数値が変動することも確認しております。
原因は前のシーンで表示していた画像が消えないということにありました。
そうすればよいのでしょうか・・・。
変わっておりました。
if(Key[KEY_INPUT_F3].trgKey){
}
のコメントを外してidの数値が変動することも確認しております。
原因は前のシーンで表示していた画像が消えないということにありました。
そうすればよいのでしょうか・・・。
Re:シーンごとのソース管理
連レスすみません。
画像の削除ついては切り替えのときに
InitGraph();
InitFontToHandle();
を書いてできました。
しかしゲームシーンのDrawで書いてあるDrawFormatString()を表示してくれません。
シーンのidは変わっております。
画像の削除ついては切り替えのときに
InitGraph();
InitFontToHandle();
を書いてできました。
しかしゲームシーンのDrawで書いてあるDrawFormatString()を表示してくれません。
シーンのidは変わっております。
Re:シーンごとのソース管理
何度も回答してすみません。
ご指摘いただけましたので下記のように変更したのですが
idしか変わりませんでした・・・。
ご指摘いただけましたので下記のように変更したのですが
idしか変わりませんでした・・・。
if(Key[KEY_INPUT_F2].trgKey){ const SceneFunc *sceneFunc = GetSceneFunc(SCENE_GAME); System.InitFlg = true; System.FinishFlg = true; }
Re:シーンごとのソース管理
> const SceneFunc *sceneFunc = GetSceneFunc(SCENE_GAME);
これは新しい変数として代入していますよね?
既にある既存の sceneFuncを変更しないと意味がないです。