天天看點

C++多小球非對心彈性碰撞(HGE引擎)

程式是一個月前完成的,之前一直沒正兒八經的來整理下這個程式,感覺比較簡單,不過即使簡單的東西也要跟大家分享下。

源碼下載下傳:

C++多小球非對心彈性碰撞(HGE引擎)

開篇

    開始上代碼之前我先說下我為啥寫的這個程式,大三的時候學習c#接觸過gdi+而發現原來做圖形界面的程式也可以這麼簡單。之後便開始用gdi+做起動畫、遊戲等,其中便有一個模拟多小球碰撞的,在csdn上有分享過(),不過現在回頭想想那個程式還是存在很多問題的,比如:沒考慮非對心碰撞問題,或者說是球體斜碰問題,幀率低問題,碰撞檢測精度不夠導緻小球粘連問題(使用的是球體像素整型)。說到這裡想必使用過gdi+的同學都會有一個想法就是gdi+用來做遊戲效率确實不行。于是呢轉戰c++,正好自己的畢設要寫一個c++

2d遊戲,是以在寫遊戲項目之餘,便花費一天時間寫了這個模拟球體“彈性斜碰”程式。至于為什麼要花這麼長時間,是因為大多數時間我都花在了這個“斜碰”問題上,這也是我要寫這篇部落格的主要原因,網上關于小球彈性斜碰的程式确實很少。不信可以百度下。

上代碼

模拟小球碰撞嘛,是以小球的實體類是必須的(ball.h)

從ball的類成員定義中可以看出來,球體的大概屬性基本包括全面了,不過多了個color這個屬性是用來設定球體顔色的,因為圖檔素材是純白實心圓,在使用color顔色進行頂點着色時候可直接設定獲得該顔色的圓。

下面依次說下各個成員方法的作用,部分有代碼。

構造方法cball(float _x,float _y,float ... ,float _density = 1.0f);對成員變量初始化,需要注意,密度預設是1.0f,而品質通過體積和密度的計算求得。【球體品質

m=ρ*v , v = 4/3*π*r^3】。

碰撞檢測,傳回目前對象時候與參數ball發生碰撞,dt是一幀的時間。

彈性正碰 void cball::collisionwith(cball *ball)根據動能定理和動量守恒定律得出公式

    //彈性正碰撞公式

    //v1‘ = [ (m1-m2)*v1 + 2*m2*v2 ] / (m1+m2)

    //v2‘ = [ (m2-m1)*v2 + 2*m1*v1 ] / (m1+m2)

碰撞後,兩小球的速度,方向,會發生改變。

彈性斜碰,文章的主角,由于計算比較複雜是以需要用到向量(vector)。

交換顔色,發生碰撞後的兩個小球進行顔色交換,純屬娛樂。

<code></code>

void cball::swapcolor(cball *ball)

小球移動,參數 _width,_height分别是視窗的寬高,因為這個方法内包含邊界碰撞的檢測和反彈。

主函數,使用hge引擎,看注釋吧這裡不詳細說了。

(hge是一個小型的2d遊戲引擎,基于directx8,相關學習資料下載下傳:)

結束語

大四快畢業了,現在才發現大學期間學的确實太少,玩的太多(dotaer哈哈),好多感慨,都化成兩個字“時間”。回想起當初剛上大一的時候,拿着書本照着上面一字不差的敲着c程式代碼,直到程式運作出來還不能了解程式是怎麼個原理,怎麼實作的,不過還好“時間”告訴了我。從大一學的枯燥的隻能用來acm的c/c++到大二終于見到圖形界面卻又笨拙而不适合圖形界面開發的java再到大三時讓圖形界面開發簡單至極卻又低效無法滿足遊戲開發的c#到最後又回到了最初那個高效而複雜的讓人抓狂的c++,就這樣走完了大學四年。同學現在有不少出去工作了的,不過給我的感覺就是大家好像都是一知半解,拿着剛好養活自己的工資,在不斷地學習着,不過期待同學們都能找到自己滿意的工作,也希望自己找工作能順利。寫這篇文章是還在考慮要不要參加藍橋杯的決賽,畢竟我都大四了,而且最近的事情會好多。不好意思思路有點斷篇。言歸正傳,畢設在做一個“仿《保衛蘿蔔》塔防遊戲”,架構基本上搭建差不多了,還有部分需要完善的地方,在此先發個不完整版,,架構僅供參考。畢竟我是菜鳥級的,很多東西都一知半解,是以程式有什麼不妥的地方還望不吝提出。先謝謝了!

程式源碼下載下傳:

繼續閱讀