最近我們的cocos2d-x遊戲項目已經進入了正式開發的階段了,幾個dev都辛苦碼代碼。cocos2d-x還是一套比較友善的api的,什麼action啊、director啊、ccpoint啊都蠻便捷的。但是我看到幾個dev有時候會很不知道用它們,還是首先自己去寫函數……
用一些比較原始、低效率的方法……
甚至是copy / paste……
…………。
……。
這不科學啊!你不能這麼勤勞啊!你這麼勤勞要出事的啊!每年有多少程式員過勞死啊!程式員一定要是懶骨頭才是正道啊!
首先第一個,看到有問題,要寫很多代碼處理問題,自己動手,豐衣足食——不是一條好路,是一條革命的老路。我們前面有那麼多前任程式員的屍體,要學會翻爛它們……然後本文也是菜筆寫的,僅簡整理一下自己用的比較多一些cocos2d-x的util,幫助大家提高效率,要變懶,會偷懶,沒有最懶,隻有更懶。
1.數學類
cocos2d-x 裡使用最多的數學類型是ccpoint,一個點,本質上也是一個向量,對于向量和向量之間有很多的數學操作要做,oh我知道要幹什麼,也許我知道怎麼求一個值但是不知道怎麼求得高效(或者不知道),怎麼辦我能偷懶嗎?那當然可以。這其實并不是一個懶的标準,因為有一些方法寫多了也可能确實稍微有那麼點麻煩,是以自然cocos2d提供了一套ccp系列來幫助我們完成很多的工作,也顯示一下庫程式員照顧開發程式員的懶惰精神(當然他們自己也用,他們也很懶)。
那我們首先建立向量
有了ccp很多人就覺得自己已經夠懶了,因為c++是可以用ccpoint()建立臨時變量的,就是喜歡少打幾個字吧。寫個ccp(v1.x + v2.x, v1.y + v2.y)也不長……但是,有沒有稍微再懶一點的?
——這個可以有。
基本的加法、減法、取負、數乘


不錯,但是這個寫法不是那麼符合我們原生c++程式員的習慣,向量運算符呢?可惜cocos2d原本是一套objc的api,沒有操作符重載,cocos2d-x也沒有像一些原生的c++數學庫一樣直接重載向量運算符。不過重載一下還是很友善的,我們的項目裡聲明了一個數學頭檔案,也就幾行代碼就好了:


順便還重載了等号和不等号,這樣就可以直接用+、-來進行向量加減法,*、 / 進行數乘,==、!=判斷是否相等了。程式員,這樣才夠懶!
什麼,你說還有 +=、 -=、 /=、 *= 沒重載?哦,改那些必須得修改到cocos2d-x的源代碼了,改完還得重新編譯一遍,略微有點懶得改吧,至少ccpoint還是能用 = 指派的。我們還是看看cocos2d-x還提供了什麼數學方法吧。
取中點!本來也就一 ccpmult(ccpadd(v1,v2), 0.5f) 的事,開發者說不要,我就是要少打幾個字,好吧庫程式員就給了一個方法
點乘、叉乘、投影
喜聞樂見求長度、距離和各自的平方值(在僅需要比較兩個長度大小時使用長度平方,因為省去了開方這一步,效率要高不少,這就不光是程式員的懶了,懶得要有效率)


旋轉、逆時針90度、順時針90度(90度的效率當然是更快的。。。同樣懶得有效率)


上面說到ccprotate,配套的有向量和弧度的轉換向量,還有一些角度相關的


線段相交的檢測,哦天哪原來庫程式員把這些事情都幹了!我還在傻傻地想線段相交算法!實在是太勤奮了!


數學方法沒有列全,更多請直接查頭檔案ccpointextension.h。基本該有的都有了。
當然數學不隻有向量,還有一些其他的……這些也很經常用到。小懶一下。
2.語句宏
常用的,首先第一個,斷言。
在這之後,也非常常用的,有周遊ccarray、ccdictionary的宏。


ccarray和ccdictionary都沒有實作模版,取得的周遊元素之後還需要強制轉換,假如說,嗯,通常數組裡的元素都是同一類型的,比如這樣


總覺得我好像多定義了一個ccobject* _object,因為它沒什麼用似的?而且我也懶得多寫一句強制轉換,可以嗎?首先看看ccarray_foreach怎麼定義的


看到那句 (__object__) = *arr 了嗎?好,要直接強制轉換,就提供一個類型,在這裡開刀!


然後用這個ccarray_tforeach宏,這樣我們的周遊就可以做得更懶一點


舒坦,偷懶改造,完。
在定義類型的時候,經常需要定義一些getter setter,有cocos2d從objc帶來的cc_property 和 cc_synthesize。


需要注意的是
1.cc_property更适用于快速聲明一個值屬性,而cc_synthesize更适用于聲明一個對象。因為cc_synthesize提供的預設set沒有任何合法性檢查對于值屬性來說太不實用。
2.這些方法的聲明全部都是virtual的,即便是内聯,聲明為virtual的方法也不會産生内聯函數,是以不管是cc_property還是cc_synthesize,他們的效率都是不高的。
3.cc_property的get方法都沒有對函數體聲明const修飾符,這意味着對const對象,并不能調用cc_property聲明的get方法(我怎麼覺得這是個cocos2d-x的bug……)。
4.在cc_synthesize方法之後直接聲明函數或者變量都會變成public:……注意,嗯。
不好用?跳過去看下定義,自己去定義一個呗……懶得看那就算了。
然後還有快捷的create_func,自動生成一個預設的靜态create方法。這實在友善了


而且這也是建議的c++構造函數和init方法的使用規範,先配置設定空間之後立刻初始化,并且由初始化結果确定能否傳回一個可用的對象。在定義特定參數的create方法時也應當這樣。
說到初始化,就不得不說到析構,還有一些析構相關的宏。我要release一堆對象,挨個都得判斷對象是不是null?還要把release後的東西指派null?程式員懶得寫這麼多行代碼……


順便還有交換兩個變量的時候,可以都喜歡懶,寫個 void swap(int& a, int &b)什麼的、再寫void swap(float& a, float& b)什麼的,再寫個 void swap(string& a, string& b)什麼的……總感覺你懶都沒人家庫程式員懶的懶……這裡有個cc_swap的宏……


什麼?你說你不服?你說你連type都不想聲明……?你居然這麼懶那你怎麼辦你怎麼能做到這麼懶的啊!你說你用模版?
好吧你赢了……
還有cocos2d庫開發人員很喜歡用的cc_break_if,這個宏有什麼特别的含義嗎?難道其實不就是一行的 if(???) break; ?嗯,就是……沒差別。但是你不覺得cc_break_if( ??? );懶地比人家高端嗎?現在的ide都能自動tab出宏耶!還有可以用下面的while(0)循環寫還能代替一些if(???) return false;耶!


……積小懶,成大懶啊!可見有一些人,是真的真的很懶很懶……
還能更懶一點嗎?答案是肯定的。每當寫一個.h時,cocos2d的庫程式員都要寫一個 namespace cocos2d {...} 吧;每當寫一個cpp的時候,你也總是要用到using namespace吧?。。他們都懶得多打這幾個字母。。
哦什麼?你看到程式員用'ns_cc_end' —— 9個字元串代替了原來的 '{'—— 一個字元!天哪這還是懶到骨頭裡的程式員嗎?難道偷懶也能本末倒置?
其實,嗯,不是這樣的,程式員是需要懶惰的,但是有時候,也還是要有節操的,隻有一個begin沒有end,怎麼說,也太看不過去了,懶也要懶得優雅、整潔、高端……
是以懶可以沒有極限,但是不能沒有節操……
……是以有沒有覺得懶一點還是不錯的?
沒有……?
那我懶得接着寫了。
原文:http://www.cnblogs.com/buaashine/archive/2012/11/12/2765691.html