シーンごとのソース管理

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
おむすび

シーンごとのソース管理

#1

投稿記事 by おむすび » 15年前

以前こちらで質問させて頂きました者です。

http://www.play21.jp/board/formz.cgi?ac ... &rln=38727

上記のソースを使いシーンの管理をしております。
ただシーンのチェンジのやりかたがわかりません。
どのようにすればよいのでしょうか・・・。

Justy

Re:シーンごとのソース管理

#2

投稿記事 by Justy » 15年前

 GetSceneFuncに渡す引数[シーンID]を変えれば実行されるシーン関数が変わります。
 シーンIDは変数としてどこかに保持しておいて、シーンを変えたくなったら別のIDを代入するといいでしょう。

おむすび

Re:シーンごとのソース管理

#3

投稿記事 by おむすび » 15年前

回答ありがとうございます。

// スタート時のシーン SCENE_START
// ゲームシーン SCENE_GAME

whileの中にGetSceneFunc(SCENE_GAME);
と書いてあるのですがシーンが変わってくれません・・。
使い方が違うのでしょうか・・・。

Justy

Re:シーンごとのソース管理

#4

投稿記事 by Justy » 15年前

 そのソースを見ないとなんともよくわからないところがありますが、
GetSceneFunc関数の中で、IDに応じて返すシーン関数情報はそれぞれ正しく IDに対応したものを
返していますか?

おむすび

Re:シーンごとのソース管理

#5

投稿記事 by おむすび » 15年前

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;
        }
    }
}

Justy

Re:シーンごとのソース管理

#6

投稿記事 by Justy » 15年前

 実際にシーケンスを実行するための情報を持っているのが WinMain関数のローカル変数 sceneFuncなわけですが、
これが最初に GetSceneFunc(SCENE_START) でポインタを受け取って以来、変更されていません。

  GetSceneFunc(SCENE_GAME) を呼んだ際に sceneFuncを更新してみて下さい。
 それでシーンは変化するはずです。

おむすび

Re:シーンごとのソース管理

#7

投稿記事 by おむすび » 15年前

なんどもすみません。
変わっておりました。

if(Key[KEY_INPUT_F3].trgKey){
}
のコメントを外してidの数値が変動することも確認しております。

原因は前のシーンで表示していた画像が消えないということにありました。
そうすればよいのでしょうか・・・。

おむすび

Re:シーンごとのソース管理

#8

投稿記事 by おむすび » 15年前

連レスすみません。

画像の削除ついては切り替えのときに
InitGraph();
InitFontToHandle();
を書いてできました。
しかしゲームシーンのDrawで書いてあるDrawFormatString()を表示してくれません。

シーンのidは変わっております。

おむすび

Re:シーンごとのソース管理

#9

投稿記事 by おむすび » 15年前

何度も回答してすみません。
ご指摘いただけましたので下記のように変更したのですが
idしか変わりませんでした・・・。
if(Key[KEY_INPUT_F2].trgKey){
            const SceneFunc *sceneFunc = GetSceneFunc(SCENE_GAME); 
            System.InitFlg = true;
            System.FinishFlg = true;
        }

Justy

Re:シーンごとのソース管理

#10

投稿記事 by Justy » 15年前


> const SceneFunc *sceneFunc = GetSceneFunc(SCENE_GAME);

 これは新しい変数として代入していますよね?
 既にある既存の sceneFuncを変更しないと意味がないです。

おむすび

Re:シーンごとのソース管理

#11

投稿記事 by おむすび » 15年前

すみません。出来ました。
ありがとうございます><

おむすび

Re:シーンごとのソース管理

#12

投稿記事 by おむすび » 15年前

すみません。解決マークつけます。

閉鎖

“C言語何でも質問掲示板” へ戻る