模擬物理碰撞要解決的幾個問題:
1.怎樣模擬速度的變化?
設定乙個摩擦係數friction(0
2.怎樣模擬碰撞?
每個時間片處理過程中,判斷物體的邊緣座標加上dx與dy後有沒有超過螢幕邊緣,如果超過,則採取一定的策略重新設定物體座標讓其在正常範圍內,如x軸超過,則對dx取反;如y軸超過,則對dy取反.計算好座標之後再進行繪圖.
windows sdk視窗對此過程的模擬(僅摹仿了速度和碰撞等,對聲音的相關處理貌似比較複雜,還沒搞清楚怎麼寫.由於是做個簡單demo,並沒有加入多執行緒等技術,所以程式裡的座標等資料的同步並不精準,上,下,左,右鍵最好是短暫地點一下即鬆開,連著按的話會出現速度的突兀變化):
/**
* file : collision.cpp
* 功能 : 模擬乙個小球在乙個封閉區域內的碰撞等活動
* 作者 : mzlogin ( )
* 宣告 : 版權沒有 盜版不究
*/#include float x = 100.0f; // 球的中心點x座標
float y = 100.0f; // 球的中心點y座標
float speed = 10.0f; // 球響應按鈕後的初始速度
float friction = 0.99f; // 球與地面的摩擦係數
float dx = 0.0f; // x軸增量
float dy = 0.0f; // y軸增量
lresult callback mainwndproc(hwnd, uint, wparam, lparam);
int winapi winmain(hinstance hinstance, hinstance hprevinstance, pstr szcmdline, int ncmdshow)
100,
100,
800,
600,
null,
null,
hinstance,
null
);showwindow( hwnd, ncmdshow );
while( getmessage( &msg, null, 0, 0 ) )
return msg.wparam;
}lresult callback mainwndproc(hwnd hwnd, uint message, wparam wparam, lparam lparam)
break;
case wm_timer:
dx *= friction;
dy *= friction;
x += dx;
y += dy;
if (x > rect.right - nradius)
if (x < nradius)
if (y > rect.bottom - nradius)
if (y < nradius)
invalidaterect(hwnd, &rect, true);
break;
case wm_destroy:
killtimer(hwnd, 1);
deleteobject(hbrush);
postquitmessage(0);
return 0;
}return defwindowproc(hwnd, message, wparam, lparam);
}
HGE引擎學習筆記
1 framefunc 是每幀都將呼叫的函式,dt hge timer getdelta 則是一幀的持續時間,故跟dt有關的過程都受fps的影響。2 不可在framefunc 呼叫延時函式,如sleep 他將使程度停留在某一幀延時,改變fps。同樣renderfunc 也是每幀都會呼叫,不可在其中使...
PushButton引擎學習筆記1
1,理解pbe類。pbe類在pb引擎中就相當於我們程式中的main一樣,是一切pbe引起模組的起點。其下面的方法和屬性都是靜態的,一方面,pbe類作為引擎的啟動入口,另一方面,該類對引擎的各個模組有很好的組織作用,通過其靜態成員很好的管理著各個模組。如 inputmanager對按鍵等進行著監聽 l...
模擬電路學習筆記(1) 基本概念
1 半導體 導電性能位於可導電和不可導電之間,稱為半導體。常用的半導體 材料有矽。2 本徵半導體 純淨的半導體材料,沒有任何雜質的矽或者鍺等。其內部結構圖1,立體如圖2所示。圖 1 平面結構 圖 2 立體結構 本徵半導體受熱或者光照等外作用後,會讓內部電子逃離共價鍵,如圖3所示。圖 3 電子逃離共價...