こんばんは ゲームプログラミング入門者です
C言語の入門サイトとこのサイトの「ゲームプログラミングの館」を全て理解し終わった程度の知識量です
これから書く文の中にはゲームプログラミングの館で使われていたワードを用いるのでもしかしたら一般的ではないのかもしれませんが許してください
また使用ライブラリはDXライブラリを前提としてお話させていただきます
早速、質問なのですがゲームのメインループの中で画像のロードをするためにフラグ変数でロードが終わったかどうかを管理したいのですが
そのフラグ変数の宣言のやり方がよくわかりません
画像のロードのフラグ変数は関数を抜けても記憶しておかねばならないため、その記憶方法について悩んでいます
私の思いついた方法は
・グローバル変数を使う
・静的変数を使う
・new演算子を用いてヒープ領域を使う
・グラフィックデータの識別番号変数に値が入っているか調べる(グラフィックデータの識別番号変数をフラグにする)
以上の4つなのですが、どの方法も短所を考えることができます
フラグ変数はどういった方法で宣言すればいいのでしょうか
また、フラグ変数の管理の仕方なども教えていただきたいです
御回答お願いします
フラグ変数の宣言の仕方
Re: フラグ変数の宣言の仕方
書かれた4つの方法のいずれについても長所や短所があってご自分では決められない、ということでしょうか。T.K さんが書きました: フラグ変数はどういった方法で宣言すればいいのでしょうか
仮にそうだとしても、フラグを使わなければならないのであれば、どれかを使わざるを得ないわけですよね。
どれでもいいのではないでしょうか。ご自身がわかりやすければ。
ご自身がわかるように管理すればよいと思います。T.K さんが書きました: また、フラグ変数の管理の仕方なども教えていただきたいです
こういう紋切り型の回答しかできないのは、「何がしたいかをいちばんよくわかっているのは質問者さんご自身であるはずだから」です。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
Re: フラグ変数の宣言の仕方
どれがいいかは場合によるかもしれないですが、T.K さんが書きました:私の思いついた方法は
・グローバル変数を使う
・静的変数を使う
・new演算子を用いてヒープ領域を使う
・グラフィックデータの識別番号変数に値が入っているか調べる(グラフィックデータの識別番号変数をフラグにする)
以上の4つなのですが、どの方法も短所を考えることができます
・クラスのメンバ変数を使う(抜けても記憶しておかねばならない関数をクラスのメンバにする)
・フラグを格納する変数への参照orポインタを抜けても記憶しておかねばならない関数に渡す
という選択肢もあります。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: フラグ変数の宣言の仕方
>>boxさん
とりあえず、私の考えた方法で問題がないようでよかったです
先日、練習用のゲームのプログラムを書いてみたところ、エディタにboolとFALSEという単語がずらっと並んでしまったので
これでいいのかと怖くなってしまったので掲示板を利用させていただいたのです・・・
>>みけCATさん
また、二行目の説明も全体的に意味が分かりません(ごめんなさい)
もしよろしければ教えていただけないでしょうか?
とりあえず、私の考えた方法で問題がないようでよかったです
先日、練習用のゲームのプログラムを書いてみたところ、エディタにboolとFALSEという単語がずらっと並んでしまったので
これでいいのかと怖くなってしまったので掲示板を利用させていただいたのです・・・
>>みけCATさん
抜けても記憶しておかねばならない関数というのはどういう意味でしょうか?みけCAT さんが書きました: ・クラスのメンバ変数を使う(抜けても記憶しておかねばならない関数をクラスのメンバにする)
・フラグを格納する変数への参照orポインタを抜けても記憶しておかねばならない関数に渡す
また、二行目の説明も全体的に意味が分かりません(ごめんなさい)
もしよろしければ教えていただけないでしょうか?
Re: フラグ変数の宣言の仕方
「画像のロードのフラグ変数は関数を抜けても記憶しておかねばならないため、その記憶方法について悩んでいます」という文で言及されている関数、という意味です。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;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: フラグ変数の宣言の仕方
>>みけCATさん
私めの為にわざわざコードまで書いていただいてありがとうございます
ゲームが終わるまで抜けることのないmain関数で、フラグ変数を宣言するということでしょうか?
(↑の認識で合っていますか?)
合っているのだとしたら、ゲームではあらゆるモジュールにフラグ変数が必要になるので
ちょっと管理しづらくなるような・・・?とプログラミング入門者的には思ってしまいます
(構造体のメンバの中に
flags_t():a(0),b(0),c(0){}
このような見慣れない構文があったのですが
これは単に初期値を代入しているだけという考えでいいですか?)
私めの為にわざわざコードまで書いていただいてありがとうございます
ゲームが終わるまで抜けることのないmain関数で、フラグ変数を宣言するということでしょうか?
(↑の認識で合っていますか?)
合っているのだとしたら、ゲームではあらゆるモジュールにフラグ変数が必要になるので
ちょっと管理しづらくなるような・・・?とプログラミング入門者的には思ってしまいます
(構造体のメンバの中に
flags_t():a(0),b(0),c(0){}
このような見慣れない構文があったのですが
これは単に初期値を代入しているだけという考えでいいですか?)
Re: フラグ変数の宣言の仕方
そんな感じです。T.K さんが書きました:ゲームが終わるまで抜けることのないmain関数で、フラグ変数を宣言するということでしょうか?
あくまで選択肢の一つです。T.K さんが書きました:合っているのだとしたら、ゲームではあらゆるモジュールにフラグ変数が必要になるので
ちょっと管理しづらくなるような・・・?とプログラミング入門者的には思ってしまいます
あまり良くない選択肢だったようですね。
ここではそれでいいです。T.K さんが書きました:(構造体のメンバの中に
flags_t():a(0),b(0),c(0){}
このような見慣れない構文があったのですが
これは単に初期値を代入しているだけという考えでいいですか?)
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: フラグ変数の宣言の仕方
ご返信ありがとうございます!
色々な解決策があるようですが初心者の私には難しそうだったので
おとなしくstaticなグローバル変数を使うことにしました
入門サイトはグローバル変数を使うことに対しての脅しを仕掛けてくるサイトが多く、
なんとなく使用をためらっていたのですが、よくよく考えたら別にstaticであるならば使ってもいいじゃんと思えてきたので
このような解決策とさせていただきました
ここに書き込んだおかげで、どの方法がやりやすいか今一度考えることができました!ありがとうございました!
色々な解決策があるようですが初心者の私には難しそうだったので
おとなしくstaticなグローバル変数を使うことにしました
入門サイトはグローバル変数を使うことに対しての脅しを仕掛けてくるサイトが多く、
なんとなく使用をためらっていたのですが、よくよく考えたら別にstaticであるならば使ってもいいじゃんと思えてきたので
このような解決策とさせていただきました
ここに書き込んだおかげで、どの方法がやりやすいか今一度考えることができました!ありがとうございました!
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: フラグ変数の宣言の仕方
誰も補足していないので、書いときますと。
newもflags_t():a(0),b(0),c(0){}もC++で許される書き方です。
DXライブラリはC++でコンパイルされるので問題なく通りますが、文法としてはC言語ではないと言うことはご理解ください。
newもflags_t():a(0),b(0),c(0){}もC++で許される書き方です。
DXライブラリはC++でコンパイルされるので問題なく通りますが、文法としてはC言語ではないと言うことはご理解ください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: フラグ変数の宣言の仕方
わざわざ御忠告ありがとうございます!
エムアロックはどうしても馴染めないため、クラスもオブジェクト指向も使っていませんが
C++のコンパイラということでnewを使っています
(プログラミング初心者的にはC言語でもnewを早く使わせろと思っちゃうんですが)
今後、混乱しないようにしっかり覚えておきます!
エムアロックはどうしても馴染めないため、クラスもオブジェクト指向も使っていませんが
C++のコンパイラということでnewを使っています
(プログラミング初心者的にはC言語でもnewを早く使わせろと思っちゃうんですが)
今後、混乱しないようにしっかり覚えておきます!