ゲームで使えるビットフラグ管理
もっといいやり方あったら教えてください!!!!
・宣言
#define F_BLANK 0b0000001 // 10進数:1 #define F_WALL 0b0000010 // 10進数:2 #define F_PLAYER 0b0000100 // 10進数:4 #define F_HASIGO 0b0001000 // 10進数:8 #define F_COIN 0b0010000 // 10進数:16 int flg = 0;
・フラグを立てる
🔴例
flg = flg | F_PLAYER
変数flgにもし 0b0001000 (F_HASIGO)が入っていた場合
0b0001000 [OR] 0b0000100 は 「0b0001100」 となってハシゴフラグとプレイヤーフラグを両方立てた状態になる。
❌例
flg = F_PLAYER ;
このようにしてしまうと、もともと立ってたハシゴフラグが消えてしまってプレイヤーフラグのみが立つことになってしまう。
・フラグを下ろす
🔴例
flg = flg & ~MS_PLAYER;
変数flgにもし 0b0001100 ハシゴフラグとプレイヤーフラグが立っていた場合
0b0001000 [AND] 0b0000100 は 「0b0001100」 となってハシゴフラグとプレイヤーフラグを両方立てた状態になる。
・フラグを抽出する
if ((flg & F_PLAYER) == F_PLAYER) { printf("プレイヤーフラグが立ってます\n"); }
・サンプルプログラム
#include <stdio.h> #define F_BLANK 0b0000001 // 10進数:1 #define F_WALL 0b0000010 // 10進数:2 #define F_PLAYER 0b0000100 // 10進数:4 #define F_HASIGO 0b0001000 // 10進数:8 #define F_COIN 0b0010000 // 10進数:16 void main() { int flg = 0; // プレイヤーフラグを立てる flg = flg | F_PLAYER; // ハシゴフラグを立てる flg = flg | F_HASIGO; // プレイヤーフラグを下げる flg = flg & ~F_PLAYER; if ((flg & F_PLAYER) == F_PLAYER) { printf("プレイヤーフラグが立ってます\n"); } else { printf("プレイヤーフラグが下がってます\n"); } getchar(); }
ステップ実行しならがらflgの値を追ってみましょう。
・マクロを定義する
#define M_FLAG_ON(flg,b) (flg | b) #define M_FLAG_OFF(flg,b) (flg & ~b) #define M_FLAG_CHECK(flg,b) (flg & b)
マクロを定義しておくとソースがすっきりして可読性があがります。
・マクロを使ったサンプルプログラム
#include <stdio.h> #define F_BLANK 0b0000001 // 10進数:1 #define F_WALL 0b0000010 // 10進数:2 #define F_PLAYER 0b0000100 // 10進数:4 #define F_HASIGO 0b0001000 // 10進数:8 #define F_COIN 0b0010000 // 10進数:16 #define M_FLAG_ON(flg,b) (flg | b) #define M_FLAG_OFF(flg,b) (flg & ~b) #define M_FLAG_CHECK(flg,b) (flg & b) void main() { int flg = 0; // プレイヤーフラグを立てる flg = M_FLAG_ON(flg , F_PLAYER); // ハシゴフラグを立てる flg = M_FLAG_ON(flg , F_HASIGO); // プレイヤーフラグを下げる flg = M_FLAG_OFF(flg ,F_PLAYER); // プレイヤーフラグを抽出して比較 if (M_FLAG_ON(flg,F_PLAYER) == F_PLAYER) { printf("プレイヤーフラグが立ってます\n"); } else { printf("プレイヤーフラグが下がってます\n"); } getchar(); }||< ------------------------------------------------------------------ この記事がもし少しでも役に立ったら投げ銭お願いします。 <b>bitZeny:</b> Zz882aLZbEbKFcdR2DPVmASxso3PEfYktv <b>MonaCoin:</b> MCm1YDXSqzQPxK2EzXvgSiztkbMu7uy1dM <b>XP:</b> XY6fzoZkxAhobZMmyayu4UJJ2bt6ZTpqUH <b>bitCoin:</b> 3EFyxTh5UfFTn2EenBGunjatNHjpgKAis7 <b>YAJUCOIN:</b> YUD1Ju6iPst3paGVZHiabBLNrYA312XAVC <b>イーサ:</b>