ページ 1 / 1
シーンごとのソース管理
Posted: 2009年12月29日(火) 16:51
by おむすび
以前こちらで質問させて頂きました者です。
http://www.play21.jp/board/formz.cgi?ac ... &rln=38727
上記のソースを使いシーンの管理をしております。
ただシーンのチェンジのやりかたがわかりません。
どのようにすればよいのでしょうか・・・。
Re:シーンごとのソース管理
Posted: 2009年12月29日(火) 17:07
by Justy
GetSceneFuncに渡す引数[シーンID]を変えれば実行されるシーン関数が変わります。
シーンIDは変数としてどこかに保持しておいて、シーンを変えたくなったら別のIDを代入するといいでしょう。
Re:シーンごとのソース管理
Posted: 2009年12月29日(火) 17:24
by おむすび
回答ありがとうございます。
// スタート時のシーン SCENE_START
// ゲームシーン SCENE_GAME
whileの中にGetSceneFunc(SCENE_GAME);
と書いてあるのですがシーンが変わってくれません・・。
使い方が違うのでしょうか・・・。
Re:シーンごとのソース管理
Posted: 2009年12月29日(火) 17:35
by Justy
そのソースを見ないとなんともよくわからないところがありますが、
GetSceneFunc関数の中で、IDに応じて返すシーン関数情報はそれぞれ正しく IDに対応したものを
返していますか?
Re:シーンごとのソース管理
Posted: 2009年12月29日(火) 18:22
by おむすび
game_sceneとstart_sceneは用意してあります。
お互いに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:シーンごとのソース管理
Posted: 2009年12月29日(火) 18:30
by Justy
実際にシーケンスを実行するための情報を持っているのが WinMain関数のローカル変数 sceneFuncなわけですが、
これが最初に GetSceneFunc(SCENE_START) でポインタを受け取って以来、変更されていません。
GetSceneFunc(SCENE_GAME) を呼んだ際に sceneFuncを更新してみて下さい。
それでシーンは変化するはずです。
Re:シーンごとのソース管理
Posted: 2009年12月29日(火) 18:31
by おむすび
なんどもすみません。
変わっておりました。
if(Key[KEY_INPUT_F3].trgKey){
}
のコメントを外してidの数値が変動することも確認しております。
原因は前のシーンで表示していた画像が消えないということにありました。
そうすればよいのでしょうか・・・。
Re:シーンごとのソース管理
Posted: 2009年12月29日(火) 19:04
by おむすび
連レスすみません。
画像の削除ついては切り替えのときに
InitGraph();
InitFontToHandle();
を書いてできました。
しかしゲームシーンのDrawで書いてあるDrawFormatString()を表示してくれません。
シーンのidは変わっております。
Re:シーンごとのソース管理
Posted: 2009年12月29日(火) 19:07
by おむすび
何度も回答してすみません。
ご指摘いただけましたので下記のように変更したのですが
idしか変わりませんでした・・・。
if(Key[KEY_INPUT_F2].trgKey){
const SceneFunc *sceneFunc = GetSceneFunc(SCENE_GAME);
System.InitFlg = true;
System.FinishFlg = true;
}
Re:シーンごとのソース管理
Posted: 2009年12月29日(火) 19:20
by Justy
> const SceneFunc *sceneFunc = GetSceneFunc(SCENE_GAME);
これは新しい変数として代入していますよね?
既にある既存の sceneFuncを変更しないと意味がないです。
Re:シーンごとのソース管理
Posted: 2009年12月29日(火) 19:26
by おむすび
すみません。出来ました。
ありがとうございます><
Re:シーンごとのソース管理
Posted: 2009年12月29日(火) 20:22
by おむすび
すみません。解決マークつけます。