質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

4回答

7707閲覧

ゲーム開発でのフラグ管理について

kabuto_0170

総合スコア28

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2016/02/23 04:20

現在C++でゲームを作成しています。(ジャンルはRPGです)
ゲーム中でのフラグの管理についての質問です。

C++

1class Flag{ 2 bool stage1_clear;//ステージ1をクリアしたか 3 bool talk_murabito;//村人に話しかけたか 4 . 5 . 6 . 7}

このように一つのクラスにすべてのフラグを管理させる方法を考えていますが、一般的にはどのようにして管理するべきなのでしょうか?
より良い管理方法があれば教えていただきたいです。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

こんにちは。

もし、全ての「フラグ」を集めてきてFlagsクラスに入れるのであれば、それはよろしく無いです。例えば、全ての「int型」変数を集めてきてIntegersクラスに入れるとバニックになりますね。それと同じです。一つにまとめると扱いやすいものを集めてクラスにしましょう。

例えば、ゲームの進捗状況を管理するクラスに多数のフラグが入ることはあると思います。そして、そこには「どの街にいる」のようなenum型的な情報も必要になるのでは?

投稿2016/02/23 05:44

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

フラグをまとめるかどうかについては、まとめたほうが記憶効率が良くなるとは思うけど
必要以上にまとめるといろいろやり難いでしょうね。どこかに集めるなら、分類してからのほうが良いでしょう。

個人的には、フラグの操作の方が気にります。
マルチスレッドだったり、割り込み駆動だったりすると、それなりの排他制御が必要になりますしね。
フラグの操作は、関数内で排他ちつつ行うのが良しですわな。

投稿2016/02/23 09:29

T.Kanno

総合スコア915

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ビットフラッグを使うとか。bool は、int 型の場合、4バイトもの領域を取ります。ok/ng の2つの意味の為だけに使うにはちょっともったいない。
union Flags {
int stage1clear:1;
int talkMurabito:1;
int findFriends:1;
unsined int numberOfFriends: 4;
};
こうすると、int 型に3つの異なるフラグと、最大15までのカウンタをもたせることができます。
union FlagAll {
unsined short flagAll;
union Flags flagKind;
}
こうすると、
最大サイズが short 型の、一括で纏めて判定したい場合は、flagAll でビットチェックを、個別に判定する場合は、flagKind.numberOfFriends > 5 とか、判定できます。
まぁ、 メモリ一杯あるので、unsined char のフラグでも十分かと。
#define Clear 1
#define NotClear !Clear

投稿2016/02/23 05:24

ipadcaron

総合スコア1693

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ipadcaron

2016/02/23 05:48

↓意見から、この方法はあまり宜しくない方法、ではなくて、なんでもかんでもいっしょくたに纏めちゃうのは宜しくないらしいです。体系的に分類した上でお使いください、。
guest

0

まあ別にそれでも問題ないけど、std::bitsetとenum使うほうが省メモリーにはなる。
名前衝突防止のためにstructでenumをくるまないといけないのがだるいけど。

cpp

1#include <bitset> 2struct flag{ 3 enum type : std::size_t { 4 stage1_clear,//ステージ1をクリアしたか 5 talk_murabito,//村人に話しかけたか 6 size 7 }; 8}; 9std::bitset<flag::size> flags; 10 11//使い方 12flags[flag::stage1_clear]

追記

グローバル変数が害悪なように、なんでも入っているクラスは害悪です。一つのクラスがあちこちで変更されないように設計しましょう。ただ、この手のフラグはそこかしこで参照することが多いので、まとめてしまっても構わないと思います。C++だと関数間通信、クラス間通信はほぼできないですし。

投稿2016/02/23 05:18

編集2016/02/23 05:53
yumetodo

総合スコア5850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問