本篇是創(chuàng)建游戲內(nèi)核(4)【接口與實現(xiàn)分離版】的續(xù)篇,關(guān)于該內(nèi)核的細節(jié)說明請參考創(chuàng)建游戲內(nèi)核(5),這個版本主要是按照功能劃分模塊的思想,并嚴格按照接口與實現(xiàn)相分離的原則來寫的,沒有用面向?qū)ο蟮乃枷雭韺懀瑳]有繼承沒有多態(tài)。大家可以對比兩個版本,比較優(yōu)劣。
接口:
void update_world_matrix(BOOL use_billboard, D3DXMATRIX* mat_world,
const D3DXMATRIX* mat_scale, const D3DXMATRIX* mat_rotation, const D3DXMATRIX* mat_translation,
const D3DXMATRIX* mat_combine1, const D3DXMATRIX* mat_combine2);
實現(xiàn):
//-------------------------------------------------------------------------
// Update world transformation matrix.
//-------------------------------------------------------------------------
void update_world_matrix(BOOL use_billboard, D3DXMATRIX* mat_world,
const D3DXMATRIX* mat_scale, const D3DXMATRIX* mat_rotation, const D3DXMATRIX* mat_translation,
const D3DXMATRIX* mat_combine1, const D3DXMATRIX* mat_combine2)
{
D3DXMATRIX _mat_view, _mat_transposed;
// setup billboarding matrix
if(use_billboard)
{
if(g_d3d_device)
{
g_d3d_device->GetTransform(D3DTS_VIEW, &_mat_view);
D3DXMatrixTranspose(&_mat_transposed, &_mat_view);
_mat_transposed._41 = _mat_transposed._42 = _mat_transposed._43 = 0.0;
_mat_transposed._14 = _mat_transposed._24 = _mat_transposed._34 = 0.0;
}
else
D3DXMatrixIdentity(&_mat_transposed);
}
// combine scaling and rotation matrices first
D3DXMatrixMultiply(mat_world, mat_scale, mat_rotation);
// apply billboard matrix
if(use_billboard)
D3DXMatrixMultiply(mat_world, mat_world, &_mat_transposed);
// combine with translation matrix
D3DXMatrixMultiply(mat_world, mat_world, mat_translation);
// combine with combined matrices (if any)
if(mat_combine1)
D3DXMatrixMultiply(mat_world, mat_world, mat_combine1);
if(mat_combine2)
D3DXMatrixMultiply(mat_world, mat_world, mat_combine2);
}