在用allegro開發flappy bird。遊戲雖然小,但是用到了allegro的方方面面,可以說是“麻雀雖小五臟俱全”。
1.physfs
這是一個跨平臺的讀寫文件的庫,可以直接讀取各種壓縮文件
想要讀文件,需要將文件所在目錄添加進physfs中,之後讀取文件只需給文件名。使用函數 int PHYSFS_addToSearchPath(const char *newDir, int appendToPath); 可以添加文件夾,也可以添加壓縮文件
想要寫文件,需要設置寫目錄,使用函數 int PHYSFS_setWriteDir(const char *newDir); 參數是文件夾路徑,暫時沒有測試壓縮文件能不能做爲寫目錄。
2.allegro的聲音播放
要使用allegro的聲音組件,首先要初始化。
al_init_acodec_addon();
al_install_audio();
al_reserve_samples(n);
allegro播放聲音採用三層結構: Voice->Mixer->Sample_Instance
在調用al_reserve_samples() 函數後會自動創建Voice並附加一個Mixer,這個Mixer將成爲默認的Mixer。使用Sample加載音樂,然後用Sample創建實例Sample_Instance,再把該Sample_Instance 附加到Mixer上,這樣就可以播放音樂了。
al_reserve_samples() 可以不調用,你可以自己創建Voice,Mixer,調用這個只是一種默認的方案。這個函數的參數表示了可以附加在這個函數創建的MIxer上的Sample_Instance數量。
3.MyGUI的委託機制
這個委託機制確實很好用,應該善加利用。比如在flappy bird中,鳥飛過了某個座標(或者說鋼管移過了某個座標),就可以使用委託機制,通知遊戲主類,分數增加一分。等等
4.MyGUI的ControllerPosition
MyGUI提供了三種漸變效果,透明度漸變,位置大小漸變和邊緣隱藏顯現。你也可以擴展爲自己的漸變效果重載 ControllerItem類即可。
ControllerPosition有三個設置目標位置大小的函數:setCoord()、setSize()和setPosition()。setCoord()是指每幀同時改變位置和大小,setSize()是指每幀只改變大小,setPosition()每幀只改變位置。
setFunction()和setAction()作用一樣,都是設置動作,即每幀怎麼移動。區別是setFunction()的參數是字符串,而setAction()的參數是FrameAction::IDelegate*。
5.flappy bird這種卷軸移動類遊戲的小技巧
如果讓小鳥一直移動,座標會越來越大,總有一種變量溢出的感覺,當然了,一般不會飛那麼遠。我們可以換一種思維,讓小鳥僅僅上下移動,而讓鋼管向左移動,這樣小鳥的橫座標永遠是那一個值。
另一個技巧是,當鋼管移出屏幕後,不要銷燬,而是把它存起來,到需要新鋼管的時候,再重新調用它。這樣避免了頻繁的new delete。