基礎(chǔ) | 自治智能體----類鳥群(二)

本系列為筆者初學(xué)c/c++和游戲AI開發(fā)的學(xué)習(xí)過程,算法為主,不涉及到具體的游戲開發(fā)軟件學(xué)習(xí)(如unity,虛幻4等),若有錯(cuò)誤請(qǐng)?jiān)谠u(píng)論區(qū)留下批評(píng)意見。
語(yǔ)言:c/c++ (11及以上)
平臺(tái):macOS mojave
編譯器:vs Code / g++

一、構(gòu)建一個(gè)世界
1.1 SFML
? SFML是一個(gè)簡(jiǎn)單方便的第三方圖形庫(kù),?接口簡(jiǎn)潔,非常適合用來當(dāng)做簡(jiǎn)單的2D游戲引擎。詳細(xì)的安裝教程見這里。
? SFML同大多數(shù)圖形庫(kù)一樣,只需要幾行代碼就可以構(gòu)建出一個(gè)窗口,并檢測(cè)鍵盤和鼠標(biāo)事件。

1.2?創(chuàng)建Boids生活的環(huán)境
? 就像現(xiàn)實(shí)中的鳥群一樣,我們的Boids也需要一個(gè)可以自由飛翔的世界。
? 在這個(gè)世界里,我們就是上帝,只要點(diǎn)一點(diǎn)鼠標(biāo)左鍵,就可以憑空創(chuàng)造出一只飛鳥來。
? 我們通過一個(gè)類來實(shí)現(xiàn)這個(gè)想法,在這個(gè)類里定義世界的大小(屏幕的寬高),一個(gè)存儲(chǔ)Boids的動(dòng)態(tài)數(shù)組(存儲(chǔ)圖形),處理事件和渲染的方法,以及啟動(dòng)世界的開關(guān)。

??如圖3:
creBoid():接收一個(gè)坐標(biāo),并在這個(gè)坐標(biāo)上生成一個(gè)boid
creBoids():生成一群boid,并將其存儲(chǔ)在動(dòng)態(tài)數(shù)組shapes中。
render():用來渲染圖形
handleInput():處理鍵盤和鼠標(biāo)事件。
run():創(chuàng)建一個(gè)窗口,并在該窗口上執(zhí)行一系列操作
? 如圖4,初始化World類時(shí),設(shè)置個(gè)體boid的大小,并將窗口大小設(shè)置為當(dāng)前屏幕的大小。函數(shù)run()創(chuàng)建該窗口,生成Boids,并持續(xù)渲染圖形,監(jiān)測(cè)事件,直到窗口被關(guān)閉。

? 如圖5,handleInput()監(jiān)測(cè)兩個(gè)事件,一是退出窗口事件,二是鼠標(biāo)左鍵點(diǎn)擊事件。當(dāng)點(diǎn)擊鼠標(biāo)左鍵,會(huì)在鼠標(biāo)當(dāng)前位置生成一個(gè)boid個(gè)體。render()渲染圖形,將其顯示在窗口內(nèi)。

? 如圖6,調(diào)用creBoids函數(shù)生成指定數(shù)量的類鳥群,調(diào)用creBoid生成單個(gè)個(gè)體,并將其存儲(chǔ)在動(dòng)態(tài)數(shù)組shapes中。

? 最后,我們?cè)谥骱瘮?shù)中運(yùn)行這個(gè)世界:??

? 到這里,我們需要?jiǎng)?chuàng)建三個(gè)文件World.h 、World.cpp 和 main.cpp,并通過makefile文件來編譯程序。
? makefile定義了一系列的規(guī)則來指定,哪些文件需要先編譯,哪些文件需要后編譯,哪些文件需要重新編譯,是一個(gè)自動(dòng)化編譯工具。

? 最后,當(dāng)程序運(yùn)行正確的時(shí)候,應(yīng)該會(huì)得到以下的畫面:


? 現(xiàn)在的Boids還是只有“肉體”,而沒有“靈魂”,我們需要賦予每個(gè)boid行動(dòng)和簡(jiǎn)單思考的能力?;叵胍幌轮皩W(xué)到的有限狀態(tài)機(jī),如果將兩者結(jié)合起來,一定會(huì)發(fā)生很有趣的事情。

參考:
《游戲人工智能編程案例精粹》
SFML? ??https://www.sfml-dev.org/tutorials/2.5/
這個(gè)頻道的主播用unity實(shí)現(xiàn)了書中所有的項(xiàng)目,有需要的小伙伴可以自行觀看https://www.youtube.com/watch?v=XrxhwgyQa_Q&t=8300s