[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的不同状态。client须要播放不同的动作。非常多同学立即联想到的是用枚举,然后就開始写代码,非常快就把程序写好了。这个时候。策划又提了一个新的需求,说攻击的时候可能会产生爆击,爆击的时候普通攻击和技能攻击都须要有不同的表现。
然后这个同学想了想,于是加了一个BOOL来记录这次攻击是否产生爆击,于是非常快又把代码写好了。策划又提一个需求,攻击的时候还有命中。
于是又加了一个BOOL来记录命中。假设还有BUFF效果,这就坑爹了!
真的是大部分刚招进来的同学都是这么干的,一个模块万多个BOOL,关键非常气人的是这些BOOL还用一个INT8的方式一个一个地发往client。
解决方式:
用状态位来记录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) //假设未命中目标
{
}
位运算 与 类似枚举 的操作,基本的差别在于位运算能够用一个变量来记录多种状态共同存在的情况。
位运算在游戏开发领域是用到的非常多的,比方在游戏中的奖励系统,游戏中有非常多种奖励,每日登录。排位赛。竞技场。公会奖励。在线奖励,签到奖励等,策划须要每一种奖励能够领取的时候,client在对应的功能button都须要光效表现来引起玩家注意。让玩家知道某某奖励如今是能够领取的。
我看到非常多开发者都是client把全部系统的数据都拿到了,然后再依据数据的对应情况来决定是否让这个button开启光效。事实上我们仅仅须要用一个整数,在server端算好每一种奖励能否够被领取,client收到这个数据后,依据每个状态的情况来开启对应的光效,让玩家点击进入对应的系统的时候,才去拿对应的数据。
位运算经常使用的是状态位、权限位、自己定义加密
&位运算符号的应用
- 清零
清零:高速对某一段数据单元的数据清零,即将其所有的二进制位为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
版权声明:本文博主原创文章,博客,未经同意不得转载。
[C++基金会]位计算 游戏开发中的应用的更多相关文章
- [Unity游戏开发]向量在游戏开发中的应用(三)
本文已同步发表在CSDN:http://blog.csdn.net/wenxin2011/article/details/51088236 在上一篇博客中讲了利用向量点乘在游戏开发中应用的几种情景.本 ...
- [Unity游戏开发]向量在游戏开发中的应用(二)
本文已同步发表在CSDN:http://blog.csdn.net/wenxin2011/article/details/50972976 在上一篇博客中讲了利用向量方向的性质来解决问题.这篇博客将继 ...
- [Unity游戏开发]向量在游戏开发中的应用(一)
本文已同步发表在CSDN:http://blog.csdn.net/wenxin2011/article/details/50810102 向量在游戏开发中是非常实用的,我们在学校学完向量的知识后,只 ...
- Cocos2d-x游戏开发中的消息机制:CCNotificationCenter的使用
在HTML5游戏开发中,js可以使用Event对象的addEventListener(添加事件监听).dispatchEvent(触发事件)实现监听机制,如果在coocos2d-x中,去实现这种机制该 ...
- 二、Cocos2dx概念介绍(游戏开发中不同的坐标系,cocos2dx锚点)
注:ccp是cocos2dx中的一个宏定义,#define ccp(__X__,__Y__)CCPointMake((float)__X__, (float)__Y__),在此文章中表示坐标信息 1. ...
- 在基于TypeScript的LayaAir HTML5游戏开发中使用AMD
在基于TypeScript的LayaAir HTML5游戏开发中使用AMD AMD AMD是"Asynchronous Module Definition"的缩写,意思就是&quo ...
- 借助AMD来解决HTML5游戏开发中的痛点
借助AMD来解决HTML5游戏开发中的痛点 游戏开发的痛点 现在,基于国内流行引擎(LayaAir和Egret)和TypeScript的HTML5游戏开发有诸多痛点: 未采用TypeScript编译器 ...
- 游戏开发中IIS常见支持MIME类型文件解析
游戏开发中IIS常见支持MIME类型文件解析 .apkapplication/vnd.android .ipaapplication/vnd.iphone .csbapplication/octet- ...
- C#游戏开发中快速的游戏循环
C#游戏开发中快速的游戏循环的实现.参考<精通C#游戏编程>一书. using System; using System.Collections.Generic; using System ...
随机推荐
- setOnClickListener报空指针异常
1.异常提示: 2.错误原因: 先看代码: public class MainActivity extends ActionBarActivity { private Button btn_test; ...
- 攻略三战的完美体验3Castle Fantisia阿兰·梅希亚战争艾伦西战记它包含重做版本(这是新的艾伦·梅希亚大战)
(城堡幻想曲3,纠正大家个错误哦,不是圣魔大战3,圣魔大战是城堡幻想曲2,圣魔大战不是个系列,艾伦西亚战记==艾伦希亚战记,一个游戏日文名:タイトル キャッスルファンタジア -エレンシア戦記-リニュー ...
- [iOS]简单的APP引导页的实现 (Swift)
在第一次打开APP或者APP更新后通常用引导页来展示产品特性 我们用NSUserDefaults类来判断程序是不是第一次启动或是否更新,在AppDelegate.swift中加入以下代码: func ...
- STL 之 queue、priority_queue 源代码剖析
/* * Copyright (c) 1994 * Hewlett-Packard Company * * Permission to use, copy, modify, distribute an ...
- [计算机基础]关于实体( Entity )和模型( Model )
实体与模型的浅析 在日常开发过程中经常看到Entity,Model,DataModel,它们之间到底有什么异同?下面是我个人的一些理解. 一.Entity,Model,它们是什么? 维基百科描述: 实 ...
- GNU GPL介绍
怎样在程序中使用GNU许可证 不管使用哪种许可证,使用时须要在每一个程序的源文件里加入两个元素:一个版权声明和一个复制许可声明.说明该程序使用GNU许可证进行授权.另外在声明版权前应该说明 ...
- MVC之国际化
MVC之国际化 前言 在项目中遇到国际化语言的问题是常有的事情,之前在做关于MVC国际化语言时,刚开始打算全部利用AngularJS来实现,但是渐渐发现对于页面Title难以去控制其语言转换,于是对于 ...
- Opencv各个版本的万能头文件
每次下载opencv的新版本时,都需要重新写头文件,更改链接库配置,很麻烦有木有?下面这个头文件是我在别人的代码中淘出来的,很不错,与大家分享~(具体作者忘记了,不好意思啊) 作者很巧妙地利用Open ...
- JNI生成so
软件:android-ndk-r8 推荐使用这个版本,可以直接不用安装Cygwin软件就可以编译. 然后在系统环境变量中path选项中添加安装路径,比如我的:C:\android-ndk-r8: 然后 ...
- LinkedHashMap相关信息介绍(转)
Java中的LinkedHashMap此实现与 HashMap 的不同之处在于,后者维护着一个运行于所有条目的双重链接列表.此链接列表定义了迭代顺序,该迭代顺序通常就是将键插入到映射中的顺序(插入顺序 ...