mona-game

ゲームプログラミング技術メモや、講座、仮想通貨など幅広く趣味のことを書いて行こうと思います

ゲームで使えるビットフラグ管理

もっといいやり方あったら教えてください!!!!

・宣言

#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>