ページ 1 / 1
フラグ変数の宣言の仕方
Posted: 2015年7月30日(木) 22:21
by T.K
こんばんは ゲームプログラミング入門者です
C言語の入門サイトとこのサイトの「ゲームプログラミングの館」を全て理解し終わった程度の知識量です
これから書く文の中にはゲームプログラミングの館で使われていたワードを用いるのでもしかしたら一般的ではないのかもしれませんが許してください
また使用ライブラリはDXライブラリを前提としてお話させていただきます
早速、質問なのですがゲームのメインループの中で画像のロードをするためにフラグ変数でロードが終わったかどうかを管理したいのですが
そのフラグ変数の宣言のやり方がよくわかりません
画像のロードのフラグ変数は関数を抜けても記憶しておかねばならないため、その記憶方法について悩んでいます
私の思いついた方法は
・グローバル変数を使う
・静的変数を使う
・new演算子を用いてヒープ領域を使う
・グラフィックデータの識別番号変数に値が入っているか調べる(グラフィックデータの識別番号変数をフラグにする)
以上の4つなのですが、どの方法も短所を考えることができます
フラグ変数はどういった方法で宣言すればいいのでしょうか
また、フラグ変数の管理の仕方なども教えていただきたいです
御回答お願いします
Re: フラグ変数の宣言の仕方
Posted: 2015年7月30日(木) 22:32
by box
T.K さんが書きました:
フラグ変数はどういった方法で宣言すればいいのでしょうか
書かれた4つの方法のいずれについても長所や短所があってご自分では決められない、ということでしょうか。
仮にそうだとしても、フラグを使わなければならないのであれば、どれかを使わざるを得ないわけですよね。
どれでもいいのではないでしょうか。ご自身がわかりやすければ。
T.K さんが書きました:
また、フラグ変数の管理の仕方なども教えていただきたいです
ご自身がわかるように管理すればよいと思います。
こういう紋切り型の回答しかできないのは、「何がしたいかをいちばんよくわかっているのは質問者さんご自身であるはずだから」です。
Re: フラグ変数の宣言の仕方
Posted: 2015年7月30日(木) 22:39
by みけCAT
T.K さんが書きました:私の思いついた方法は
・グローバル変数を使う
・静的変数を使う
・new演算子を用いてヒープ領域を使う
・グラフィックデータの識別番号変数に値が入っているか調べる(グラフィックデータの識別番号変数をフラグにする)
以上の4つなのですが、どの方法も短所を考えることができます
どれがいいかは場合によるかもしれないですが、
・クラスのメンバ変数を使う(抜けても記憶しておかねばならない関数をクラスのメンバにする)
・フラグを格納する変数への参照orポインタを抜けても記憶しておかねばならない関数に渡す
という選択肢もあります。
Re: フラグ変数の宣言の仕方
Posted: 2015年7月30日(木) 23:09
by T.K
>>boxさん
とりあえず、私の考えた方法で問題がないようでよかったです
先日、練習用のゲームのプログラムを書いてみたところ、エディタにboolとFALSEという単語がずらっと並んでしまったので
これでいいのかと怖くなってしまったので掲示板を利用させていただいたのです・・・
>>みけCATさん
みけCAT さんが書きました:
・クラスのメンバ変数を使う(抜けても記憶しておかねばならない関数をクラスのメンバにする)
・フラグを格納する変数への参照orポインタを抜けても記憶しておかねばならない関数に渡す
抜けても記憶しておかねばならない関数というのはどういう意味でしょうか?
また、二行目の説明も全体的に意味が分かりません(ごめんなさい)
もしよろしければ教えていただけないでしょうか?
Re: フラグ変数の宣言の仕方
Posted: 2015年7月30日(木) 23:16
by みけCAT
T.K さんが書きました:抜けても記憶しておかねばならない関数というのはどういう意味でしょうか?
「画像のロードのフラグ変数は関数を抜けても記憶しておかねばならないため、その記憶方法について悩んでいます」という文で言及されている関数、という意味です。
T.K さんが書きました:また、二行目の説明も全体的に意味が分かりません(ごめんなさい)
もしよろしければ教えていただけないでしょうか?
例えば
コード:
#include <cstdio>
struct flags_t {
int a, b, c;
flags_t():a(0),b(0),c(0){}
};
void kannsuu(flags_t &flags) {
int next_a = !flags.a;
int next_b = flags.a ? !flags.b : flags.b;
int next_c = (flags.a && flags.b) ? !flags.c : flags.c;
flags.a = next_a;
flags.b = next_b;
flags.c = next_c;
}
int main(void) {
flags_t flags;
for (int i = 0; i < 8; i++) {
kannsuu(flags);
printf("%d %d %d\n", flags.a, flags.b, flags.c);
}
return 0;
}
Re: フラグ変数の宣言の仕方
Posted: 2015年7月31日(金) 11:11
by T.K
>>みけCATさん
私めの為にわざわざコードまで書いていただいてありがとうございます
ゲームが終わるまで抜けることのないmain関数で、フラグ変数を宣言するということでしょうか?
(↑の認識で合っていますか?)
合っているのだとしたら、ゲームではあらゆるモジュールにフラグ変数が必要になるので
ちょっと管理しづらくなるような・・・?とプログラミング入門者的には思ってしまいます
(構造体のメンバの中に
flags_t():a(0),b(0),c(0){}
このような見慣れない構文があったのですが
これは単に初期値を代入しているだけという考えでいいですか?)
Re: フラグ変数の宣言の仕方
Posted: 2015年7月31日(金) 12:43
by みけCAT
T.K さんが書きました:ゲームが終わるまで抜けることのないmain関数で、フラグ変数を宣言するということでしょうか?
そんな感じです。
T.K さんが書きました:合っているのだとしたら、ゲームではあらゆるモジュールにフラグ変数が必要になるので
ちょっと管理しづらくなるような・・・?とプログラミング入門者的には思ってしまいます
あくまで選択肢の一つです。
あまり良くない選択肢だったようですね。
T.K さんが書きました:(構造体のメンバの中に
flags_t():a(0),b(0),c(0){}
このような見慣れない構文があったのですが
これは単に初期値を代入しているだけという考えでいいですか?)
ここではそれでいいです。
Re: フラグ変数の宣言の仕方
Posted: 2015年7月31日(金) 15:39
by T.K
ご返信ありがとうございます!
色々な解決策があるようですが初心者の私には難しそうだったので
おとなしくstaticなグローバル変数を使うことにしました
入門サイトはグローバル変数を使うことに対しての脅しを仕掛けてくるサイトが多く、
なんとなく使用をためらっていたのですが、よくよく考えたら別にstaticであるならば使ってもいいじゃんと思えてきたので
このような解決策とさせていただきました
ここに書き込んだおかげで、どの方法がやりやすいか今一度考えることができました!ありがとうございました!
Re: フラグ変数の宣言の仕方
Posted: 2015年7月31日(金) 18:53
by softya(ソフト屋)
誰も補足していないので、書いときますと。
newもflags_t():a(0),b(0),c(0){}もC++で許される書き方です。
DXライブラリはC++でコンパイルされるので問題なく通りますが、文法としてはC言語ではないと言うことはご理解ください。
Re: フラグ変数の宣言の仕方
Posted: 2015年7月31日(金) 20:25
by T.K
わざわざ御忠告ありがとうございます!
エムアロックはどうしても馴染めないため、クラスもオブジェクト指向も使っていませんが
C++のコンパイラということでnewを使っています
(プログラミング初心者的にはC言語でもnewを早く使わせろと思っちゃうんですが)
今後、混乱しないようにしっかり覚えておきます!