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

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

ただいまの
回答率

89.98%

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

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 3,250

kabuto_0170

score 26

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

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


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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+1

こんにちは。

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

#include <bitset>
struct flag{
    enum type : std::size_t {
        stage1_clear,//ステージ1をクリアしたか
        talk_murabito,//村人に話しかけたか
        size
    };
};
std::bitset<flag::size> flags;

//使い方
flags[flag::stage1_clear]

追記

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

-1

ビットフラッグを使うとか。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 14:48

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

    キャンセル

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

  • ただいまの回答率 89.98%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる