馮長(zhǎng)寶 佟鑫 賈騁
摘要
通常情況下,游戲中的對(duì)象會(huì)按照物理規(guī)律進(jìn)行移動(dòng),能體現(xiàn)重力、反作用力、加速度等物理特性,實(shí)現(xiàn)自由落體、拋物線運(yùn)動(dòng)、以及物理碰撞現(xiàn)象的模擬,給玩家?guī)?lái)更多“真實(shí)”的游戲體驗(yàn)。本文將介紹Egret引擎中物理引擎模塊1P2物理引擎,并將P2物理引擎的應(yīng)用進(jìn)行舉例分析。
【關(guān)鍵詞】Egret 物理運(yùn)動(dòng) P2物理引擎
游戲中很多的物理運(yùn)動(dòng)都是由物理引擎來(lái)完成的,我們可以把游戲引擎看成是汽車的發(fā)動(dòng)機(jī),它決定著汽車的性能和穩(wěn)定性,而汽車的速度、操作這些都是建立在引擎的基礎(chǔ)上的。游戲也是如此,在游戲中采用物理引擎,可以制作出賞心悅目的賽車游戲,還有血腥暴力的射擊游戲,有了物理引擎,可以最大限度的還原游戲的真實(shí)度。本文以創(chuàng)建一個(gè)P2物理項(xiàng)目為例,介紹在Egret引擎中使用P2物理引擎來(lái)完成對(duì)重力的模擬。
1 P2物理引擎介紹
國(guó)內(nèi)較成熟的物理引擎包括Box2D,還有今天的主題P2物理引擎。Box2D是一款基于C++語(yǔ)言編寫(xiě)的物理游戲引擎,被廣泛應(yīng)用在各類物理游戲中,比如風(fēng)靡一時(shí)的游戲《憤怒的小鳥(niǎo)》。雖然它給開(kāi)發(fā)者提供了簡(jiǎn)單友好的接口,但是在H5游戲平臺(tái)中,因?yàn)樾实南拗扑谋憩F(xiàn)沒(méi)有那么出色。來(lái)自斯德哥爾摩大學(xué)的Stefan Hedman,在基于Javascript的基礎(chǔ)上,開(kāi)發(fā)出了一款面向H5游戲的2D物理引擎P2。集成了各種復(fù)雜的物理公式和算法,可以幫助我們輕松地實(shí)現(xiàn)碰撞、加速、自由落體等物理現(xiàn)象的模擬。
2 創(chuàng)建P2物理項(xiàng)目
在Egret引擎中通過(guò)P2物理引擎來(lái)完成對(duì)物理運(yùn)動(dòng)的模擬,一般的過(guò)程如下:導(dǎo)入P2引擎庫(kù)->創(chuàng)建世界world->創(chuàng)建地面ground->創(chuàng)建剛體->創(chuàng)建調(diào)試模擬視圖,刷新世界。
P2引擎庫(kù)的導(dǎo)入要使用Egret提供的第三方庫(kù)集成方法,在項(xiàng)目的配置文件egretProperties.json中添加第三方庫(kù);將P2引擎以name命名為模塊,以path定義P2引擎庫(kù)的目錄路徑,應(yīng)當(dāng)注意的是P2引擎庫(kù)應(yīng)與項(xiàng)目目錄同級(jí);在IDE的終端面板中執(zhí)行egret build-e命令就會(huì)把P2引擎庫(kù)編譯到項(xiàng)目中,成功后就可以使用了。
世界對(duì)應(yīng)P2引擎庫(kù)中的World類,類似于渲染引擎中的stage舞臺(tái),該World對(duì)象有一個(gè)Vec2類型的屬性gravity,模擬重力加速度;它有兩個(gè)元素,水平x方向和垂直y方向的分量,以數(shù)組來(lái)表示。當(dāng)將gravity設(shè)置為[0,0]時(shí)表示為失重狀態(tài),[0,10]表示只有垂直方向的重力,如果將x、y都設(shè)置非。的數(shù)值后,重力將不再是垂直向下的,而是朝[x,y]方向。
形狀是物理游戲中進(jìn)行碰撞模擬的一個(gè)基礎(chǔ),地面ground的創(chuàng)建是由Plane平面形狀來(lái)完成,這是一個(gè)特殊的形狀,它沿y軸負(fù)方向無(wú)限擴(kuò)展,x軸的寬度也是無(wú)限的。Plane平面形狀需要添加到body剛體中,并通過(guò)調(diào)整剛體的angle角度,使平面朝向不同的方向,可以模擬墻體、地面。
接下來(lái)就是要?jiǎng)?chuàng)建游戲中的主角—body剛體了,剛體擁有速度、角度、質(zhì)量等物理屬性,通過(guò)形狀對(duì)象來(lái)表現(xiàn)出具體的形狀,常見(jiàn)的形狀有圓形、矩形、膠囊形狀、粒子、線段、多邊形等。分別創(chuàng)建body剛體對(duì)象和shape形狀對(duì)象,并通過(guò)使用addShpe()方法將形狀添加到剛體中;設(shè)置形狀的屬性,position可以設(shè)置形狀相對(duì)于剛體本地坐標(biāo)中心的偏移量,影響剛體的重心,angle設(shè)置形狀傾斜的角度,material設(shè)置形狀的材質(zhì),可以使形狀發(fā)生碰撞時(shí)表現(xiàn)出不同的特性。對(duì)于剛體對(duì)象來(lái)說(shuō),它本身也具有一定的屬性:速度、角度、質(zhì)量等。我們通過(guò)position屬性來(lái)對(duì)剛體進(jìn)行定位和移動(dòng),在進(jìn)行物理模擬的過(guò)程中,會(huì)刷新剛體坐標(biāo);velocity設(shè)置剛體的線性速度,它是一個(gè)Vec2類型的對(duì)象,用數(shù)組來(lái)表示,數(shù)組中第一個(gè)元素表示水平方向的速度,當(dāng)值>0時(shí)表示速度方向向右;第二個(gè)元素表示垂直方向的速度,當(dāng)值>0時(shí)表示速度方向向下。
剛體創(chuàng)建完成就要對(duì)它進(jìn)行形狀貼圖了,使剛體能夠以游戲圖像素材來(lái)顯示出來(lái)。貼圖的過(guò)程,就是要實(shí)時(shí)刷新圖像素材的坐標(biāo)和角度,使其能夠與剛體對(duì)應(yīng)上。為剛體添加自定義屬性u(píng)serData,保存對(duì)應(yīng)圖像素材的引用。world世界中所有的剛體都保存在bodies數(shù)組中,遍歷數(shù)組中的每一個(gè)剛體,如果其userData不為空,則實(shí)時(shí)更新對(duì)應(yīng)圖像素材的坐標(biāo)和角度。
模擬視圖通過(guò)p2DebugDraw類中的drawDebug()方法來(lái)實(shí)現(xiàn),應(yīng)用當(dāng)前world對(duì)象創(chuàng)建一個(gè)p2DebugDraw類對(duì)象,并添加egret.Event.ENTER FRAME事件偵聽(tīng),在事件偵聽(tīng)回調(diào)函數(shù)中,調(diào)用drawDebugo方法,繪制P2引擎中的所有剛體對(duì)象,對(duì)所有剛體實(shí)時(shí)刷新。
由于我們將world對(duì)象通過(guò)gravity屬性設(shè)置了重力加速度,當(dāng)剛體對(duì)象在舞臺(tái)上創(chuàng)建后,由于重力加速度將垂直向下進(jìn)行運(yùn)動(dòng),當(dāng)與plane平面形狀發(fā)生碰撞時(shí),由于每個(gè)剛體的material材質(zhì)屬性不同,發(fā)生碰撞后反彈的速度會(huì)不相同。
3 結(jié)論
本文從P2引擎的基本元素入手,分析探討了P2引擎庫(kù)的導(dǎo)入,如何去創(chuàng)建一個(gè)物理模擬世界,通過(guò)對(duì)world,剛體等對(duì)象進(jìn)行相應(yīng)的屬性設(shè)置,實(shí)時(shí)刷新視圖模擬,來(lái)實(shí)現(xiàn)一個(gè)模擬重力運(yùn)動(dòng)。
參考文獻(xiàn)
[1]張?chǎng)卫?Egret HTML5游戲開(kāi)發(fā)指南.北京:電子工業(yè)出版社,2016.
[2]認(rèn)識(shí)HTML5 2D物理引擎P2.ht tp://bbs.egret.com/thread-6950-1-1.html.