程式是乙個月前完成的,之前一直沒正兒八經的來整理下這個程式,感覺比較簡單,不過即使簡單的東西也要跟大家分享下。
模擬小球碰撞嘛,所以小球的實體類是必須的(ball.h)
#pragma once從ball的類成員定義中可以看出來,球體的大概屬性基本包括全面了,不過多了個color這個屬性是用來設定球體顏色的,因為素材是純白實心圓,在使用color顏色進行頂點著色時候可直接設定獲得該顏色的圓。#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; //混合顏色
};
下面依次說下各個成員方法的作用,部分有**。
(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 指向函式成員的指標 宣告形式 資料型別 類名 成員指標名 形參列表 賦值形式 成員指標...