MUD游戏开发进阶:位运算在游戏开发中的重要应用

本文节选自《LPC语言基础教程:从零学习游戏开发》,版权归@mudren,欢迎转载,但必须注明来源(mud.ren)。

位段(或称“位域”,Bit field)为一种数据结构,可以把数据以位的形式紧凑的储存,并允许程序员对此结构的位进行操作。在 LPC 语言中有几个和位运算相关的方法:set_bit(3), clear_bit(3), test_bit(3),但是在游戏开发中这些使用的很少了,但利用位运算来存储状态还是非常常用的。

比如:在游戏中开发迷宫,如何判断迷宫房间的方向是否是出口?我们看看一个房间的出口有多少种: file

东、南、西、北四个方向出口组合一共有16种状态,我们可以声明16个变量来表示,但在写代码时可能会很麻烦。而巧用位运算,我们可以更轻松的实现相关功能: file

如上图,我们做如下定义:

#define N 1<<0
#define E 1<<1
#define S 1<<2
#define W 1<<3

北、东、南、西分别是1、2、4、8,对应二进制0001、0010、0100、1000,在游戏开发中做位运算的时候,我关注的主要是某一位的值是0,还是1,而并不是去关注这个整数的值是多少。在这里第1位是1代表北方有出口,第2位为1代表东方有出口,第3位为1代表南方有出口,第4位为1代表西方有出口,而类似东北方向都有出口就是0011,四个方向都有出口就是1111。

当我们需要设置一个迷宫房间某个方向的出口时只需要使用按位或|运算设置对应位为1,而需要判断迷宫房间某个方向是否有出口时只需要用按位与&运算判断对应位是否为1即可。

// 初始化房间(没有任何出口)
int x = 0;

// 设置北方出口
x |= N;
// 设置东方出口
x |= E;

// 北方是否有出口
if (x & N)
{
    // todo
}

关于&~<<等位运算符的使用如果不熟悉,可以回顾教程第三章第一节的内容。

附几个常用的位运算函数,用来做位运算检测。

//检查state的第pos位是否为1
int bitCheck(int state, int pos)
{
    return state & (1 << (pos - 1));
}

//返回将state的第pos位的值设为1的值
int bitSet(int state, int pos)
{
    return state | (1 << (pos - 1));
}

//返回将state的第pos位的值设为0的值
int bitClear(int state, int pos)
{
    return state & (~(1 << (pos - 1)));
}

更新中...

京ICP备13031296号-4