[C++基础]位运算 游戏开发中的应用

位运算的定义:通俗点说,位运算就是对一个整数在计算机中二进制进行操作。

任何一个整数都可以用二进度的方式来表示的,不同类型的整数它的位数的长度也不一样,INT8或者char是由8个2进度

位表示,INT16或者short是由16个2进度位表示,INT32是由32位状态位表示。

位运算在游戏中的应用

往往,在游戏开发中做位运算的时候,我关注的主要是某一位的值是0,还是1,而并不是去关注这个整数的值是多少。

比如:00100010,这个8位的整数从右到左,它的第一位为0,第二位为1,第三位为0,第六位为1。

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

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

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

位运算往往在游戏用来记录一些状态,一个32位的整数,就能记录32种状态,并且只需要一个int就够了。

例子:

假设一个NPC有以下几种状态,行走状态,站立状态,普通攻击状态,技能攻击状态,根据这个NPC的不同状态,客户端需要播放不同的动作。很多同学马上联想到的是用枚举,然后就开始写代码,很快就把程序写好了。这个时候,策划又提了一个新的需求,说攻击的时候可能会产生爆击,爆击的时候普通攻击和技能攻击都需要有不同的表现。

然后这个同学想了想,于是加了一个BOOL来记录这次攻击是否产生爆击,于是很快又把代码写好了。策划又提一个需求,攻击的时候还有命中。于是又加了一个BOOL来记录命中。如果还有BUFF效果,这就坑爹了!

真的是大部分刚招进来的同学都是这么干的,一个模块万多个BOOL,关键很气人的是这些BOOL还用一个INT8的方式一个一个地发往客户端。

解决方案:

用状态位来记录NPC的状态,一个8位的整数即可记录8种状态,16位,32位就可以记录更多的状态

//伪代码
#define STATE_ATTACK 1 //普通攻击
#define STATE_SKILL 2 //技能攻击
#define STATE_DODGE 3  //爆击
#define STATE_HIT 4  //命中

INT8 state = 0; //默认无任何状态

state = bitAdd(state,STATE_ATTACK); //发起普通攻击
state = bitAdd(state,STATE_HIT);  //命中目标
state = bitAdd(state,STATE_DODGE); //产生爆击

if(bitCheck(state,STATE_HIT) == 0) //如果未命中目标
{
}

位运算 与 类似枚举 的操作,主要的区别在于位运算可以用一个变量来记录多种状态共同存在的情况。

位运算在游戏开发领域是用到的很多的,比如在游戏中的奖励系统,游戏中有很多种奖励,每日登录,排位赛,竞技场,公会奖励,在线奖励,签到奖励等,策划需要每一种奖励可以领取的时候,客户端在相应的功能按钮都需要光效表现来引起玩家注意,让玩家知道某某奖励现在是可以领取的。

我看到很多开发人员都是客户端把所有系统的数据都拿到了,然后再根据数据的相应情况来决定是否让这个按钮开启光效。其实我们只需要用一个整数,在服务器端算好每一种奖励是否可以被领取,客户端收到这个数据后,根据每一个状态的情况来开启相应的光效,让玩家点击进入相应的系统的时候,才去拿相应的数据。

位运算常用的是状态位、权限位、自定义加密 

&位运算符号的应用

  • 清零 

清零:快速对某一段数据单元的数据清零,即将其全部的二进制位为0。例如整型数a=321对其全部数据清零的操作为a=a&0x0。 (321=0000 0001 0100 0001) &0=0000 0000 0000 0000= 0000 0000 0000 0000

  • 获取一个数据的指定位 

例如获得整型数a=321的低八位数据的操作为a=a&0xFF。(321=0000 0001 0100 0001) & (0xFF = 0000 0000 1111 11111)

= 0000 0000 0100 0001

获得整型数a=321的高八位数据的操作为a=a&0xFF00。(321=0000 0001 0100 0001) & (0XFF00=1111 1111 0000 0000)

= 0000 0001 0000 0000

  • 保留数据区的特定位  

例如获得整型数a=321的第7-8位(从0开始)位的数据操作为: a=a&110000000

(321=0000 0001 0100 0001) & (384=0000 0001 1000 0000)=0000 0001 0000 0000

时间: 2024-08-01 01:35:29

[C++基础]位运算 游戏开发中的应用的相关文章

位运算 游戏开发中的应用

位运算的定义: 通俗点说,位运算就是对一个整数在计算机中二进制进行操作. 位运算的原理是很简单的,百度百科里就能找到它的一些基本的用法,以及相关的运算符号. 大部分刚刚进入到游戏行业里的程序员,你问他什么叫位运算,他都懂,但实际中往往却不记得去使用它. 任何一个整数都可以用二进度的方式来表示的,不同类型的整数它的位数的长度也不一样,INT8或者char是由8个2进度位表示,INT16或者short是由16个2进度位表示,INT32是由32位状态位表示. 位运算在游戏中的应用 往往,在游戏开发中做

HTML5游戏开发中基础的Tag讲解

一般在HTML5游戏开发中,基础的Tag都用在标题,段落以及分行上,下面就来讲解下几种最常用的Tag.当然最好用的HTML5学习方式就是跟随示例,今天我们的HTML5游戏开发教程也从实例开始. 首先来看一下标题中的Tag应用.在HTML5游戏开发中,我们用从h1至h6的几个Tag来定义文章的标题,每个正文中的标题都是自成一段的.例如这样: <html>  <head></head>  <body>   <h1>This is a heading&

游戏开发中的人工智能 复习

游戏开发中的人工智能 复习 (个人复习,一些仅是给自己的复习提示(=w=),转载注明出处:http://blog.csdn.net/hcbbt/article/details/42815479) 配套教材:游戏开发中的人工智能 知识点 移动 Bresenham,视线(略),拦截 // Bresenham if (deltaCol > deltaRow) { fraction = deltaRow * 2 - deltaCol; while (nextCol != endCol) { if (fr

游戏开发中的矩阵初探

游戏开发中的矩阵初探 1.矩阵在3d空间中的作用 (1)长方体A想绕(10,3,4)旋转50°且沿着x方向放大2倍且向(9,-1,8)方向平移2个单位,那么经过上面的变换后,新的长方体各个点的坐标是多少呢?应用矩阵可以很轻松的算出答案. (2)知道子坐标系在父坐标系中的位置,可以求出子坐标系中的店在父坐标系中的位置. 2.矩阵的基础知识 矩阵能描述任意线性变换.线性变换保留了直线和平行线,线性变换保留直线的同时,其他的几何性质如长度.角度.面积和体积可能被变换改变了.简单的说,线性变换可能“拉伸

FSM:游戏开发中的有限状态机(理论篇)转

游戏系统的本质是输入加输出.我们把游戏系统划分为多个不同状态,不同的状态在不同输入下产出不同输出.按照这种思想,我们可以把游戏中复杂的子系统,比如战斗系统,划分成多个不同状态,然后我们要做的只是,对于不同的战斗操作输入,转换相应状态,执行相应状态下的动作输出. 那么什么是有限状态机? 我们要说的状态机输入和输出都是离散的.有限的:在这个基础上,我们所说的有限状态机就是描述这一类问题:在有限的输入里,由于不同的输入时序产生的有限的输出组合的映射关系.要描述这种映射关系,有两种表达方式: 状态迁移表

手机游戏开发中如何选择适合的纹理格式

为毛要写这个 本来觉得像这样的问题,是无法归类的,因为不同的项目有不同的需求,但今天因为quick论坛中的一个技术疑问贴,钩起了我整理这篇文章的兴趣 http://www.cocoachina.com/bbs/read.php?tid=214811 于是,我决定尽力描述一下纹理格式选择方面的问题,一是起到一个科普的作用,因为目前没有发现十分完整的讲这方面的文章.二是整理一下自己的思路. 当然,这些东西肯定不是我自己凭空YY出来的,我也是参考了不少文章,也从项目中总结了一些问题.在此先列出一些链接

游戏开发中,图片资源的精简

在游戏开发中,包的大小总是与图片资源的大小密切相关,而图片资源中,大多为带有透明度信息的png图像. 那么,如何精简png图片资源呢? 1.图像压缩是一种方法,然而随着压缩率的增大.图片品质也越来越差.(舍弃) 2.我们另辟蹊径,采用png图像拆分.(近乎无损,资源精简) 一.原理:将png图像转化为两张jpeg图像进行存储 pngSplit下载 pngSplit使用说明 二.使用方法: 1.LibGdx中,通过Pixmap使用 // 如工程目录assets/texture/0_1.jpeg下:

&lt;游戏开发中的人工智能&gt; -- 阅读笔记

到家已经几天了, 休息了一阵, 是时候重新学习知识了. 接下去一段时间, 会啃<游戏开发中的人工智能>这本书, 顺便写写笔记. 马上就大三了, 想想自己选的游戏方向, 现在还蛋疼. 选了一个自己喜欢的方向, 但是确实最忙的一个,这也意味着少时间继续我的iOS学习. 也不知道是对是错. 既然选了,就学吧. 好不,不扯多了.接下去是该系列的笔记.(持续更新) 第一章: 游戏人工智能简介 1. 定性AI与非定性AI 定性行为或其表现是特定的,而且是可预测的,没有不确定性. 非定性行为有某种程度的不确

游戏开发中的一些基本方法

一.              检测对象变化的两种基本方式: 学过<微机原理>的人应该都了解这两种方式 1.       轮询 1) 每帧轮询 2) 定时轮询 按业务需求和性能问题选择 2.       中断(并非硬件中断,而是软件的事件通知方式) 两种模式: 1)       观察者模式 优点:① 扩展性强,事件发起接口不变,只需增加事件类型 ② 只通知对某件事有兴趣的对象,不会浪费性能 ③ 每种事件对应一种回调函数,对于回调函数,事件参数类型是固定的,MouseMove事件的参数类型肯定是