3D角色控制器中使用二进制字面量给int赋值的逻辑及优势
3D角色控制器位掩码碰撞状态写法说明
你看到的代码如下:
// assumes we're not blocked int blocked = 0x00; if ( its_a_floor ) blocked |= 0x01; if ( its_a_wall ) blocked |= 0x02;
这种写法是游戏开发领域非常常用的**位掩码(Bitmask)**设计,本质是用单个整型变量的不同二进制位独立存储多个布尔状态,相比普通的单值int赋值或者拆分多个布尔变量,更适配3D角色控制器的场景需求,核心优势有以下几点:
- 支持存储叠加状态:普通int赋值同一时间只能存一种状态,比如你给1代表被地面阻挡、2代表被墙阻挡,就没法表示「同时被地面和墙阻挡」的叠加情况,而位掩码每个位对应一种状态,位或操作可以任意叠加状态,比如同时满足两个条件时
blocked的值为0x03,两种状态互不干扰。 - 状态判断效率极高:3D角色控制器的碰撞检测、移动逻辑每帧都要执行多次,位运算的执行速度远高于多个布尔变量的组合判断。比如要判断是否被墙阻挡,只需要执行
if (blocked & 0x02)即可,不需要额外判断其他状态;要判断是否同时被地面和墙阻挡,只需要判断blocked & 0x03 == 0x03即可。 - 可维护性和扩展性更强:只需要一个变量就能管理所有碰撞阻挡状态,不需要定义大量独立的布尔变量,传递状态时只需要传这一个int值即可。后续如果要新增阻挡类型(比如天花板阻挡、可穿透障碍物阻挡),只需要新增对应位的常量(比如
0x04、0x08)即可,原有逻辑不需要做任何修改。 - 状态修改更安全:位或操作只会修改对应位的状态,不会影响其他已经存储的状态,不会出现普通赋值时不小心覆盖原有状态的问题。
内容的提问来源于stack exchange,提问作者user406126
相关产品推荐
相关产品推荐

