使用C++ OpenGL開發簡單貪吃蛇小游戲


程序截圖、編譯好的程序以及源碼可以在這里找到:https://github.com/Melonl/SnakeGame_OpenGL

這是我接觸OpenGL這么久一段時間以來第一次嘗試開發小游戲,很多問題的解決方法都是我自己臨時想出來的,可能與最優解相差甚遠,這個項目算是一次嘗試,同時也算是給后面的小伙伴的一個參考吧,下面開始進入正文。

OpenGL的語法、api什么的這里就不講了,百度一搜 learn opengl一大堆教程,所以這里直接說重點的:項目中我主要寫了三個類,分別是處理整個游戲邏輯的Level類、蛇Snake類和食物Food類,Level類主要的工作是啟動線程,每隔一段時間更新一下蛇的狀態,並且處理食物的隨機生成、蛇吃到食物后的增長 這些事情。Snake類主要是儲存每個蛇身方塊的坐標和提供繪制蛇的方法,Food類幾乎只是儲存坐標和提供渲染方法,此外,Snake和Food類內都各有一個我自己封裝的Shader類,Shader類里封裝了一些瑣碎的shader創建過程。我用了兩個Shader Program分別渲染蛇和食物,各自兩個shader文件,一共四個,在源碼里能找到。

Snake類我用了一個stl的vector容器來儲存蛇身對象,這個蛇身對象其實就是一個Cube類,Cube類只包含x 和 y值,就是代表這個蛇身方塊所在的坐標,網上很多類似的貪吃蛇游戲都用鏈表來儲存蛇身坐標,我(至少目前)覺得不夠合適,(如果出於學習、練手的目的那就沒什么好說的),對於蛇身來說繪制的次數要遠遠多於增加長度的次數(也就是吃到食物蛇身增長),眾所周知(單)鏈表的遍歷效率是很低的,基於這個原因,並且出於方便考慮,我選用了儲存空間連續的vector容器。

蛇的渲染涉及到的OpenGL知識非常淺,就是畫多幾個矩形僅此而已,唯一比較麻煩的地方就是頂點數據的計算,在Snake類的draw()里可以看到這個極其繁瑣的計算過程,大體思路就是根據蛇身包含的方塊個數動態構建頂點數組,並且把顏色屬性也一並構建進去,然后再動態構建頂點索引數組、傳遞給gpu繪制。這里再提一下蛇的移動算法,我的思路是程序接受並記錄用戶按下的上下左右方向鍵,然后根據四種方向分四個case移動蛇頭,在蛇頭移動之前,先把每個蛇身的坐標分別賦值為它前一個蛇身的坐標,例如蛇的坐標是0 1 2,0代表蛇頭,那么在蛇頭移動之前,蛇身先變化,就變成 0 0 1,然后蛇頭再移動,變成 -1 0 1,這樣就解決了蛇的移動問題。 至於蛇吃到食物后的增長算法,其實就是在蛇身移動前記錄下蛇尾方塊的坐標,在蛇移動后再往vector里添加這個蛇尾方塊。

另,整個畫布大小是600*600,在OpenGL空間里坐標都被映射為[-1.0,1.0],不管是蛇身還是食物方塊,都是0.05寬。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM