[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收到這個數據后,依據每個狀態的情況來開啟對應的光效,讓玩家點擊進入對應的系統的時候,才去拿對應的數據。
位運算經常使用的是狀態位、權限位、自己定義加密?
&位運算符號的應用
- 清零?
(321=0000 0001 0100 0001) &0=0000 0000 0000 0000= 0000 0000 0000 0000
- 獲取一個數據的指定位?
= 0000 0000 0100 0001
獲得整型數a=321的高八位數據的操作為a=a&0xFF00。
(321=0000 0001 0100 0001) & (0XFF00=1111 1111 0000 0000)
= 0000 0001 0000 0000
- 保留數據區的特定位 ?
(321=0000 0001 0100 0001) & (384=0000 0001 1000 0000)=0000 0001 0000 0000
版權聲明:本文博主原創文章,博客,未經同意不得轉載。
總結
以上是生活随笔為你收集整理的[C++基金会]位计算 游戏开发中的应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【HDOJ】3315 My Brute
- 下一篇: 条款33:避免遮掩继承而来的名称