DXライブラリを用いたゲーム、メインループに疑問

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
化猫
記事: 15
登録日時: 15年前

DXライブラリを用いたゲーム、メインループに疑問

#1

投稿記事 by 化猫 » 13年前

単純に気になったことを質問させて頂きます。
プログラムは問題なく動くので、説明しやすいように龍神録プログラミングの館のプログラムを例にしたいと思います。

9章 メインループで呼ぶ関数を制御してみよう

--GV.hに以下を追加--

コード:

GLOBAL int func_state;
このプログラムのmain.cpp

コード:

#define GLOBAL_INSTANCE 
#include "../include/GV.h"

//ループで必ず行う3大処理
int ProcessLoop(){
        if(ProcessMessage()!=0)return -1;//プロセス処理がエラーなら-1を返す
        if(ClearDrawScreen()!=0)return -1;//画面クリア処理がエラーなら-1を返す
        GetHitKeyStateAll_2();//現在のキー入力処理を行う
        return 0;
}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
    ChangeWindowMode(TRUE);//ウィンドウモード
    if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化

        while(ProcessLoop()==0){//メインループ
                switch(func_state){
                        case 0:
                                load();         //データロード
                                first_ini();//初回の初期化
                                func_state=100;
                                break;
                        case 100:
                                graph_main();//描画メイン
                                break;
                        default:
                                printfDx("不明なfunc_state\n");
                                break;
                }

                if(CheckStateKey(KEY_INPUT_ESCAPE)==1)break;//エスケープが入力されたらブレイク
        ScreenFlip();//裏画面反映
    }

    DxLib_End();//DXライブラリ終了処理
    return 0;
}
とあり、実行するとまずcase 0に入ると思うのですが

ループ1回目が行われる時、func_stateは何故0なのでしょうか。
どこかで初期化をしたわけではないようで分かりません。

自分が作っているゲームでも同じループ方法を採っていますが、上のプログラムで言うと20行目の

コード:

first_ini();
でfunc_stateにあたる変数を初期化しています。
ですが、この関数が実行(func_stateが初期化)される前にswitchで行き先が決められているはず。だけど、その時には初期化されてない。

宣言時に

コード:

GLOBAL int func_state = 0;
とするとエラーが出てしまいますし、勝手に0にされるものなのでしょうか?

とっち
記事: 56
登録日時: 13年前
住所: 岡山

Re: DXライブラリを用いたゲーム、メインループに疑問

#2

投稿記事 by とっち » 13年前

この場合func_stateはグローバル変数なので、勝手に0に初期化されます。

もし不安なら
15行目にfunc_state=0;をつけたせばいいかと思います。

コード:

if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
    func_state=0;
        while(ProcessLoop()==0){//メインループ

化猫
記事: 15
登録日時: 15年前

Re: DXライブラリを用いたゲーム、メインループに疑問

#3

投稿記事 by 化猫 » 13年前

なるほど、グローバル変数は自動的に0に初期化されるのですね。
勉強になりました。
ありがとうございました。

non
記事: 1097
登録日時: 14年前

Re: DXライブラリを用いたゲーム、メインループに疑問

#4

投稿記事 by non » 13年前

初期値を入れられない理由として、
頭についているGLOBALはどういう意味かわかりますか?
non

化猫
記事: 15
登録日時: 15年前

Re: DXライブラリを用いたゲーム、メインループに疑問

#5

投稿記事 by 化猫 » 13年前

non さんが書きました:初期値を入れられない理由として、
頭についているGLOBALはどういう意味かわかりますか?
GLOBAL int func_state = 0;
ができない理由ということでいいでしょうか?

それでしたら
int func_state;
が宣言されている時、GLOBALがexturnに置き換わるから、というところまでなら理解しています。

閉鎖

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