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

2022-01-10 22:08:33 字數 2134 閱讀 3395

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

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

#pragma once

#include #include "hge.h"

class cball

;public:

bool iscollision(cball *ball,float dt); //碰撞檢測

void collisionwith(cball *ball); //彈性正碰

void collisionwith2(cball *ball); //彈性斜碰

void swapcolor(cball *ball); //好玩點,加個交換顏色

void movenext(float dt,float _width,float _height);

//由於程式不大,方便起見所有就都public了

public:

float x; //x軸座標

float y; //y軸座標

float speed_x; //x軸方向速度

float speed_y; //x軸方向速度

float radius; //球體半徑

float density; //密度

float weight; //質量

dword color; //混合顏色

};

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

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

(1)構造方法cball(

float_x,

float_y,

float... 

,float_density =1

.0f);

對成員變數初始化,需要注意,密度預設是1.0f,而質量通過體積和密度的計算求得。【

球體質量 m=ρ*v , v = 4/3*π*r^3】。

(2)碰撞檢測,返回當前物件時候與引數ball發生碰撞,dt是一幀的時間。

bool cball::iscollision(cball *ball,float dt)

(3)彈性正碰voidcball::

collisionwith(cball 

*ball)

根據動能定理和動量守恆定律得出公式

//彈性正碰撞公式

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

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

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

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

void cball::collisionwith2(cball *ball)

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

voidcball:

:swapcolor(cball *ball)

(6)小球移動,引數 _width,_height分別是視窗的寬高,因為這個方法內包含邊界碰撞的檢測和**。

void cball::movenext(float dt,float _width,float _height)

主函式,使用hge引擎,看原始檔吧這裡不詳細說了。

大四快畢業了,現在才發現大學期間學的確實太少,玩的太多(dotaer哈哈),好多感慨,都化成兩個字「時間」。回想起當初剛上大一的時候,拿著書本照著上面一字不差的敲著c程式**,直到程式執行出來還不能理解程式是怎麼個原理,怎麼實現的,不過還好「時間」告訴了我。從大一學的枯燥

的,框架僅供參考。畢竟我是菜鳥級的,很多東西都一知半解,所以

程式有什麼不妥的地方還望不吝提出

。先謝謝了!

C 對C語言的非物件導向特性擴充 2

include int add int x,int y int main int add int x,int y 不過也可以採用簡潔的方式來宣告,如 int add add 都可以通過編譯 但是在c 裡,如果函式定義在後,呼叫在前,那函式原型的宣告必須是int add int x,int y 函式名...

對C 中指向類的非靜態成員的指標的認識

指標還可以指向類的非靜態成員,也就是資料成員和函式成員。1 指向資料成員的指標 宣告形式 資料型別 類名 成員指標名 賦值形式 成員指標名 類名 成員資料名 訪問形式 物件名.成員指標名 物件指標 成員指標名 2 指向函式成員的指標 宣告形式 資料型別 類名 成員指標名 形參列表 賦值形式 成員指標...