『曲棍球』是碰撞算法最好演示,在遊戲中『球臺』寬300長500,並且有四條圍邊,確保『曲棍球』在『球臺』圍邊範圍內移動. 『球臺』會給『曲棍球』帶來『磨擦』後慢慢慢落來並最後停低.而『玩家球』則通過鼠標移動控制.通過與『曲棍球』相碰給『曲棍球』帶來動力.演示程式:下載.我會給出遊戲設計重點,並給出關鍵代碼
1.『冰球』運動核心是碰撞算法.你試想下當『冰球』高速運動時有可能會穿越圍邊(圍邊使用平面定義).所以你需要準確計算碰撞時間.碰撞代碼睇『碰撞時間』
2.控制『玩家角色』通過獲取滑鼠標偏移量與位置相加移動『玩家角色』.你需要通過DirectInput獲得滑鼠偏移量. 並且確保不要移出球臺圍邊.若與『冰球』則重新計算返射方向與速度
根據鼠標運動計算速度::Init_VECTOR3D(&player->velocity, diffX, 0, diffY);
計算位置player->position = player->position + player->velocity;
『玩家角色』與『冰球』碰撞使用『邊界球』進行檢測並重新計算返射方向與速度
puck->velocity = Reflection_VECTOR3D(&puck->velocity,&(puck->velocity ^ player->velocity)) + player->velocity*500;
3.設定『球臺』結構與『圍邊平面』
typedef struct TABLE_TPY {
TEXTURE texture;// 球臺紋理
VECTOR3D position;// 球臺位置
VECTOR3D corner[4];//球臺角落
PLANE3D wall[4];// 球臺圍邊平面
float width;// 寬度
float depth;// 深度
float height;// 高度
}TABLE,*TABLE_PTR;
球臺寬300*長500載入紋理Load_File_Texture()和綁定紋理Bind_Image_Texture().圍邊使用Init_PLANE3D()定義為平面
4.定義『冰球』結構
typedef struct PUCK_TPY {
VECTOR3D position;// 位置
VECTOR3D acceleration;// 加速度
VECTOR3D velocity;// 速度
float radius;// 半徑
}PUCK,*PUCK_PTR;
5.定義『玩家角色』結構
typedef struct PLAYER_TPY {
VECTOR3D position;// 位置
VECTOR3D velocity;// 速度
float radius;// 半徑
float mouseX, mouseY;
}PLAYER,*PLAYER_PTR;