當前位置:遊戲中心平台 - 遊戲盒子 - 如何用Box2D庫制作2D實體遊戲

如何用Box2D庫制作2D實體遊戲

作者:胡安·費利佩·貝隆·佩雷斯

從最熱遊戲排行榜和flash遊戲網站可以看出什麽?許多2D遊戲有出色的物理和藝術設計。現在我們要學習那些遊戲用的是什麽物理,如何用Box2D制作。

除了知道是什麽,更重要的是知道怎麽做。首先想問讀者壹個問題:如果要復制實體遊戲的機制或行為,需要哪些技術和方法?

壹年前,我問過自己同樣的問題,答案是6維。這個遊戲是壹個創意盒子,每壹面都包含壹套由Box2D物理和視覺美學技術制作的不同遊戲機制。在這裏,我將與妳分享這個遊戲。我做這個遊戲是為了改進遊戲引擎Codea(由Crabitron開發),我寫這個教程是為了介紹現實的物理、藝術和遊戲設計…共同提高我們的遊戲開發水平。

在我的遊戲裏,我設計了六張臉。抱著同樣的想法,我給大家介紹壹下我從其他遊戲中抄襲了哪些物理,機制,美術手法。

1,形狀

托馬斯壹個人,憤怒的小鳥,蠟筆物理。

蠟筆物理學(來自gamasutra)

蠟筆物理,可以用手指或鼠標在屏幕上畫,比如圓形、三角形、矩形等。當妳松開鼠標/移開手指時,線條會變成三維的物理對象(在虛擬世界中)。

這是怎麽做到的?

其實挺簡單的。妳需要保存鼠標/手指繪制路徑從開始到結束的坐標點。當釋放事件發生時,可以調用Box2D的壹個函數根據這些點生成多邊形:

local body = physics.body(多邊形,解包(點) )

妳得先知道Box2D裏有什麽形狀:

多邊形(POLYGON):

用於封閉基本幾何圖形(非圓形)等形狀,它使用壹系列頂點(x,y)按照每個API指定的順序排列。

圓形(圓形):

妳可以做球、水滴、星星等等。

邊緣:

用於制作只有起點和終點的墻壁、地板和線段。

鏈條(鏈條):

與邊相同,但可以閉合(像多邊形但不是凸多邊形)或不閉合(像邊但有2個以上的點)。

知道了剛體的形狀(body shape),還需要了解它們不同的行為,或者叫做體型:

靜態:顧名思義,這個剛體會在指定的x,y(地面、墻壁、柱基礎或繩基礎等)上保持靜止。).

動態:它與其他物體碰撞並移動。

運動學:碰撞不隨動態對象移動。妳只能通過改變它的x,y,給它壹個線速度或者對它施加力來讓它移動。

真正的意義要在API的執行中去理解。我在本文中使用它,因為它是我能找到的最簡單的代碼。但是把代碼改成任何語言都很簡單。Box2D幾乎擁有所有語言版本(Flash as3、c++、objc、java、javascript、Java+處理等。).

您必須將該函數的結果保存為用戶定義的變量,如body.position(位置)、body.radius(半徑)、body.linearVelocity(線速度)、body.angularVelocity(角速度)、body.mass(質量)等。

當創建壹個剛體時,妳可能想要為它定義壹些屬性,例如恢復,重力比例,阻尼等。這些屬性可以賦予處於彈跳或浮動狀態的物理對象。

當然,Box2D的復雜程度不止於此,其他采用這種物理遊戲機制的遊戲(魔筆)也更加復雜。在魔筆裏,妳可以畫出看起來像“節點”的東西,但開發者稱之為“關節”。它們用於連接剛體。有好幾種,看妳想要的機制。它還可以用於在連接的剛體之間產生行為:

物理.關節(旋轉,身體a,身體b)

剛體繞錨旋轉。

比如:汽車的輪子,蠟筆物理和魔筆裏的紅色節點。

物理連接(棱形、主體a、主體b、錨固、方向)

在剛體的各個固定點之間保持固定的距離。兩個關節之間的初始距離取決於虛擬空間中兩個固定點之間的初始距離。為關節設置頻率率和阻尼率可以使其產生軟彈簧行為。

物理.關節(距離、身體a、身體b、錨a、錨b)

旋轉關節迫使兩個剛體在兩個固定點之間沿軸移動。允許伸縮運動,但兩個剛體之間的相對轉動是有限的。

物理連接(焊縫、車身a、車身b、錨固)

接合關節限制了兩個剛體之間的運動和相對旋轉,實際上使它們成為壹個剛體。由於求解器的叠代性質,當置於壓力下時,關節可能變形;當力太大或幾個關節連接成壹個更大的物體時,關節可能會完全失效。

物理連接(繩子,身體a,身體b,錨a,錨b,最大長度)

繩索接頭限制了兩個剛體之間的最大距離。

例如,《割斷繩子》中的繩子。

概述:

1)創建壹個有觸點或任何其他多邊形幾何形狀(壹組2D點:x,y)的剛體或盒子,並設置我們需要的物理屬性(如托馬斯獨自壹人時的不同行為)。比如剛體是靜態的,我們可以設置它的質量,密度,重力等等。

2)可選屬性:附加到另壹個剛體。比如可以將壹個剛體附加到另壹個設置為傳感器的靜態剛體上(不影響遊戲世界的物理,但是有碰撞事件),然後激活REVOLUTE關節的enableMotor屬性,同樣需要motorSpeed、maxmotorque和maxMotorForce。

3)視覺藝術:當妳有了壹個剛體之後,如果妳想把它畫出來,不是作為壹個形狀,而是作為壹個有顏色或紋理的實體,妳要把這些點三角化,生成壹個多邊形的網格模型,並為它設置顏色和粘貼材質。

示例:

Box2D _多邊形(來自gamasutra)

托馬斯是壹個人盒子(來自gamasutra)

對於《Thomas Was Alone》中盒子的行為,可以設置壹個簡單的“果汁”系統動畫(由“中間幀”演化而來),這樣當妳選中盒子並按下跳轉鍵(或者它與其他不同的物理剛體發生碰撞)時,就會觸發“果汁命令=動畫”命令——產生擠壓、晃動等動畫效果,以及每壹個動作。

方框示例(來自gamasutra)

對於憤怒的小鳥,可以通過定義盒子的不同屬性來做關卡,繪制不同的子圖或者用不同的材質做網格,這樣在發生碰撞的時候,盒子的剛體會更加生動,通過改變盒子的紋理(碎木頭,碎玻璃等)來和當前的狀態更加和諧。).

可以使用簡單的剛體applyForce(vec2(x,y))函數發射壹只鳥。各種鳥也有自己的質量,衰減等屬性...

2.水體

《我的水在哪裏?》、《灑金沙》……

當妳問網上的編碼員如何讓水物理像上面的遊戲壹樣,他們會和妳聊Metaball:

Metaball_contact_sheet(來自gamasutra)

但是在遊戲中使用Metaball技術比較麻煩,也不容易,而且需要大量的計算,除非妳找到壹些技巧,在上面附上壹些藝術素材。

這也是為什麽使用水物理的遊戲很少的原因。幾個月前我談到了這個問題,由於很多人的幫助,我得到了壹個非常棒的水的物理模型。在那個模型中,我用Box2D lib中的圓形剛體做了壹個動態球。

模型的代碼很容易理解。球是物理剛體,這些剛體具有使它們的行為像水滴壹樣的參數,例如估計、摩擦、阻尼和線速度。然後,我們使用著色器(GLSL)的技術和材料來繪制這些球,這需要壹個網格,就像ripple fx或其他使用材料的GLSL著色器樣本壹樣。

網格:addRect(寬度/ 2,高度/ 2,寬度,高度)

這樣我們就可以用每個球的位置(x,y)在虛擬空間裏把它們畫出來,每個球都有漸變的紋理效果。

對於k,b在ipairs(balls)中做

精靈(球紋理,b.x,b.y)

結束

然後,妳必須使用額外的扭曲模式來添加材料到這些彩色球中,並將其與背景混合。

示例:

Box2D _水物理學(來自gamasutra)

正如我所說的,每個球都有壹個紋理(由程序生成的漸變),可以使用低級過濾器與其他球材質混合。

我的水在哪裏

《我的水在哪裏?》

妳可以對各種行為使用不同的圖層,或者把所有的液體或者所有的動態地形都放到同壹個圖層裏做同樣的水fx,然後改變濾鏡值和顏色(水,巖漿等。)在著色器中。

比如兩個剛體碰撞,妳必須檢查bodyA和bodyB是什麽樣的剛體。如果壹個是氣體(gravityScale/mass/density值其實是0,所以會浮起來),壹個是“冰”,那麽妳可以把這個球變成水...

再比如,如果bodyA是巖漿,那麽bodyB就變成氣體了...就像改變球的屬性壹樣簡單,所以它會改變box2d中的響應,妳要重畫遊戲狀態。

地形示例:

靜態地形可以是多邊形剛體,由讀取整個地形圖像並建立壹系列不透明像素的x,y (vec2)的函數制成,然後返回給box2d函數。

動態地形可以只是壹個網格。當妳觸摸它時,妳將移除坐標X和Y上的觸點,並且妳必須用新的網格再現物理剛體。

例如,當水滴(物理剛性圓)濺到鴨子(帶有激活傳感器的物體剛體)上時,您必須刪除水滴,更改鴨子的動畫,使新的狀態出現,直到它完全充滿水,然後刪除鴨子並記錄結果。

水滴有細小的痕跡,這些痕跡是用線速度和角速度特性畫出來的。妳可以得到方向和速度,這樣妳就可以計算出痕跡的角度和距離。

其實妳想做什麽都可以。

spruce _ islands _ boss(來自gamasutra)

在spruce Ilsands中,水著色器與我們研究的不同。除了使用粒子特效,它還具有線性速度的屬性。但是行為可能還是壹樣的。當水球(剛性圈)碰到火災感應器,火就會熄滅,海中的水網也會熄滅。至於巖石,妳可以添加壹些細節如紋理效果。

在這壹邊,我們找不到任何關節,這就是為什麽它可能是不必要的。在spruce Ilsands中,軟管是壹根繩子,這是我們將在下壹面分析的內容。

3.橡皮筋

戰鬥日,割斷繩子,水果忍者

我花了壹個月的時間做了上面這個遊戲的繩子原型,但是做完繩子之後,我覺得柔軟的剛體很好做,因為我更了解關節。

要制作壹個真實的繩子,妳必須創建壹組剛體(圓形或多邊形)並將它們附加到靜態剛體上作為基礎。用於組合這些繩索的接頭有兩種,距離式或回轉式,但動態連接的靜態端的接頭只能是制作彈性繩索的繩索接頭。通過休止符和頻率屬性調整響應/阻尼/彈性。

示例:

Box2D _ ElasticRopes(來自gamasutra)

為了做壹個軟剛體,妳要在另壹個中心剛體(可以是靜態的,也可以是動態的)周圍做壹系列的圓形剛體,這當然會影響到其他剛體。如果改變關節類型,會發現這個剛體會自動變形,必須用網格畫出整組剛體。

Contre-Jour(來自gamasutra)

《對抗日》

在這個遊戲中,妳可以找到柔軟的剛體:可變形的地形;兩種類型的繩子:彈性繩和固定繩。這些固定繩使用了比彈性繩更先進的技術。

snotDiagram(來自gamasutra)

js繩索分段(來自gamasutra)

割斷繩子

割斷繩子(來自gamasutra)

這是Box2d物理做繩子最好的案例。遊戲中的繩子也是動態的。妳可以看到沿著底座到球的網格,球的壹端連接著糖果。

妳可以像上壹個例子壹樣做這個繩子,設置球(糖果)的物理屬性——質量、密度、重力刻度,可以做出泡泡效果。妳可以在多層混合模式下繪制氣泡。還有壹種方法是把壹個剛體變成傳感器,靠妳自己的引力算法來移動,但是這個技術我們是第五面才學會的。

如果泡泡-剛體-球與青蛙或蜘蛛相撞,或者玩家觸摸到泡泡,泡泡就會爆炸。出於這個原因,您應該將爆炸動畫添加到氣泡中,並再次更改糖果的物理屬性...

案例代碼:

if (vec2:distance( bFrog_Mouth,bCandy)& lt;最大距離)

把青蛙動畫從“閑”改成“吃”

–暫停輸入

-補間並觸發遊戲結束動畫

結束

4.重力

在這方面,我們可以找到很多用武力對抗重力的遊戲,但這是壹種玩法。例如,您可以基於box2d的正弦函數生成壹個簡單的地形,它將返回壹個鏈或邊形狀的靜態剛體。

小翅膀2(來自gamasutra)

妳可以用Box2d制作妳自己的小翅膀。基本原理是球(圓形剛體)在重力作用下下落,妳可以通過觸摸屏幕來增加下落的線速度。當在山坡的適當位置釋放觸摸時(您可以檢查正弦函數的高度),下落速度將會增加...另壹種方法是只使用武力。

示例:

Box2D_JumpRun(來自gamasutra)

為了畫壹個循環,給拾音器,加熱狀態等添加壹個粒子效果。材質可以用程序生成隨機的彩色圖像,用高斯噪聲添加細節和邊界等等...

Jetpack-Joyride(來自gamasutra)

《噴氣背包之旅》

妳能看出這個遊戲的特點嗎?如果妳看過前面的例子,那麽妳應該知道角色剛性球也有同樣的行為,妳必須對抗重力,各種飛行器,導彈,各種交通工具的不同物理屬性等等。

《瘋狂海岸》、《火箭雞》、《鯨跡》等遊戲都是如此。

但是這個平面上還有其他機制,比如行星物理和引力。

可以用壹個簡單的公式來模擬零重力physics.gravity(0,0),線量的引力如下圖所示:

Box2D_Forces_Gravity(來自gamasutra)

功能星球:吸引(m)

–力的方向

局部力= self . body . position–m . body . position

local d = force:len()—= m . body . position:dist(self . body . position)

force = force:normalize()

局部方向= vec2(自身質量/身體質量,self.mass/m.body.mass)

–力的大小

局部強度=(重力*自身質量* m.body.mass)/(d*d)

力=力*強度

m.body:應用力(力)

筆畫((1+math . floor(force . y))* 110,(1+math . floor(force . x))* 110,10,255)

–在吸引器/移動器之間畫線

line(m.body.x+force.x,m.body.y+force.y,(self.body.x),(self.body.y))

結束

這個功能會讓角色球圍繞星球旋轉。

5.線和面

保存種子,蠟筆物理...

只有線:通過繪制線,妳可以使剛體的形狀類鏈和剛體類靜態或動態。

對於關卡設計,障礙也是靜態的,可以是邊或多邊形……...

保存-種子-高清-塗鴉-物理-截圖(來自gamasutra)

有了這種結構,妳就可以復制壹個像保存種子這樣的遊戲。

Box2D_Lines(來自gamasutra)

代碼和第壹個壹樣,但是妳必須改變遊戲規則。妳應該從懸掛的物理引擎開始,然後繪制並生成鏈的靜態形狀。當玩家按下開始鍵,遊戲必須生成玩家的球(以及恢復、重力、質量等參數),重啟物理引擎,只需要壹個指令(物理)就可以完成。暫停()和物理。resume())。

它只停留在遊戲循環中,用於確認碰撞和線性速率,改變遊戲狀態...

妳可以通過打開或關閉重力來改變整個遊戲的現實,就像托馬斯獨自壹人或ibb和obb壹樣。

6.交通設施

小輪車冒險,登山比賽

如果妳看到了這個,那就做壹個關於瘋狂運輸的遊戲吧。

做交通工作,只要把關節和車輪想象成壹個圓形剛體,把多邊形(汽車、自行車等的形狀)連接起來。)通過用正確的定位點旋轉關節。

用紋理網格繪制自行車/汽車的主剛體和車輪的子圖。除非妳用軟剛體來做到這壹點,添加痕跡,粒子fx等。

代碼生成的示例:

Box2D_BezierRampage(來自gamasutra)

對於道路,使用壹些噪聲或正弦,可以是靜態的或動態的。可以用貝塞爾曲線。

代碼示例(來自gamasutra)

小輪車大冒險

我會知道這個遊戲和它的物理原理,這要感謝看了某人的壹篇文章。

但是作者並沒有提到任何關於Box2D的東西,不過我猜這款遊戲只是用了Cocos2d(和Corona SDK)。總之,現在妳知道如何制作車輛和橫沖直撞的效果。

在Canvas Rider中,有兩種自行車模型,妳可以在遊戲中改變它們。妳會發現自行車的剛體是允許壹定阻尼的關節結構。當妳換自行車時,動態剛體被破壞,然後遊戲生成壹個新的自行車類型。

另外,妳的自行車在遊戲中能碰到的線是靜態鏈。當妳設計道路時,鼠標接觸X,Y …就像我們之前做的那樣。

以上。希望妳能用Box2D做出點成績。

當然,使用Box2D的不同方法制作的遊戲還是很多的,不過可能會綜合使用上面提到的,比如《時空幻境》、《超級食肉男孩》等。,並且它們可以由合適的剛體、機構和著色器制成。

  • 上一篇:王者榮耀有哪些昵稱?
  • 下一篇:遊戲關卡設計:如何制作遊戲
  • copyright 2024遊戲中心平台