📄 winmain.cpp
字号:
if(!TerrainCollision()) //地形碰撞
{
g_pSkinMesh->m_vPos.x = g_pSkinMesh->m_matWorld._41-=(g_pSkinMesh->m_vDirection.x*fMove);
g_pSkinMesh->m_vPos.y = g_pSkinMesh->m_matWorld._42-=(g_pSkinMesh->m_vDirection.y*fMove);
g_pSkinMesh->m_vPos.z = g_pSkinMesh->m_matWorld._43-=(g_pSkinMesh->m_vDirection.z*fMove);
g_pCamera->m_vLookat-=(g_pSkinMesh->m_vDirection*fMove);
g_pCamera->m_vEye-=(g_pSkinMesh->m_vDirection*fMove);
}
}
//角色的左右旋转
void RotationLeftRight(float fRot)
{
D3DXMATRIXA16 matRot;
D3DXMatrixRotationY(&matRot,fRot*g_fTime);
g_pSkinMesh->m_matWorld = matRot * g_pSkinMesh->m_matWorld;
D3DXVec3TransformCoord(&g_pSkinMesh->m_vDirection,&g_pSkinMesh->m_vDirection,&matRot);
}
void FrameMove()
{
g_pInput->UpdateInput(); //更新输入
if(g_pInput->GetKeyboard(DIK_W))
MoveFrontBack(1.0f);
else if(g_pInput->GetKeyboard(DIK_S))
MoveFrontBack(-1.0f);
else
g_pSkinMesh->SetAnimationName("stop");
if(g_pInput->GetKeyboard(DIK_A)) //角色左转
{
RotationLeftRight(-2.0f);
}
if(g_pInput->GetKeyboard(DIK_D)) //角色右转
{
RotationLeftRight(2.0f);
}
float dx,dy;
if(g_pInput->GetMouseButton(RBUTTON))
{
if(dx = g_pInput->GetMouseMove(MOUSE_X))
{
g_pCamera->ThirdPersonRotationY(dx*0.005f);
}
if(dy = g_pInput->GetMouseMove(MOUSE_Y))
{
g_pCamera->ThirdPersonRotationX(-dy*0.005f);
}
}
g_pd3dDevice->SetTransform(D3DTS_VIEW, g_pCamera->GetViewMatrix());
/// 创建投影矩阵
}
/**-----------------------------------------------------------------------------
* 创建光源
*------------------------------------------------------------------------------
*/
VOID SetupLights()
{
/// 创建材质(material)
/// 在设备中创建一个材质.
D3DMATERIAL9 mtrl;
ZeroMemory( &mtrl, sizeof(D3DMATERIAL9) );
mtrl.Diffuse.r = mtrl.Ambient.r = 1.0f;
mtrl.Diffuse.g = mtrl.Ambient.g = 1.0f;
mtrl.Diffuse.b = mtrl.Ambient.b = 1.0f;
mtrl.Diffuse.a = mtrl.Ambient.a = 1.0f;
g_pd3dDevice->SetMaterial( &mtrl );
/// 创建光源
//D3DXVECTOR3 vecDir; /// 方向光源(directional light)照射的方向
//D3DLIGHT9 light; /// 光源结构体
//ZeroMemory( &light, sizeof(D3DLIGHT9) ); /// 将结构体清零.
//light.Type = D3DLIGHT_DIRECTIONAL; /// 光源类型
//light.Diffuse.r = 1.0f; /// 光源的颜色和亮度
//light.Diffuse.g = 1.0f;
//light.Diffuse.b = 0.0f;
//vecDir = D3DXVECTOR3( 1, 1, 1 ); /// 光源的固定
//vecDir = D3DXVECTOR3(cosf(GetTickCount()/350.0f), /// 光源旋转
// 1.0f,
// sinf(GetTickCount()/350.0f) );
//D3DXVec3Normalize( (D3DXVECTOR3*)&light.Direction, &vecDir ); /// 光源的方向设定为单位向量.
//light.Range = 1000.0f; /// 光源能够照射到的最远距离
//g_pd3dDevice->SetLight( 0, &light ); /// 在设备设置0号光源
//g_pd3dDevice->LightEnable( 0, TRUE ); /// 打开0号光源
g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, TRUE ); /// 打开光源设置
g_pd3dDevice->SetRenderState( D3DRS_AMBIENT, 0x00909090 ); /// 设定环境光源(ambient light)的值
}
/**-----------------------------------------------------------------------------
* FPS(Frame Per Second)输出
*------------------------------------------------------------------------------
*/
void LogFPS(void)
{
static DWORD nTick = 0;
static DWORD nFPS = 0;
if( GetTickCount() - nTick > 1000 )
{
nTick = GetTickCount();
nFPS = 0;
return;
}
nFPS++;
}
/**-----------------------------------------------------------------------------
* 创建动画
*------------------------------------------------------------------------------
*/
VOID Animate()
{
AnimatTime();
/// 创建摄像机矩阵
FrameMove();
SetupLights();
static bool flag = false;
if(KEYDOWN('1'))
flag = true;
if(KEYDOWN('2'))
flag = false;
g_pd3dDevice->SetRenderState( D3DRS_FILLMODE, flag ? D3DFILL_WIREFRAME : D3DFILL_SOLID );
LogFPS();
}
/**-----------------------------------------------------------------------------
* 删除初始化对象
*------------------------------------------------------------------------------
*/
VOID Cleanup()
{
if( g_pTerrainMap != NULL)
delete [] g_pTerrainMap;
if( g_pSkinMesh != NULL )
delete g_pSkinMesh;
if( g_pSkyBox != NULL )
delete g_pSkyBox;
if( g_pTexHeight != NULL )
g_pTexHeight->Release();
if( g_pTexDiffuse!= NULL )
g_pTexDiffuse->Release();
if(g_pInput != NULL)
g_pInput->Release();
if( g_pIB != NULL )
g_pIB->Release();
if( g_pVB != NULL )
g_pVB->Release();
if( g_pd3dDevice != NULL )
g_pd3dDevice->Release();
if( g_pD3D != NULL )
g_pD3D->Release();
}
/**-----------------------------------------------------------------------------
* 绘制网格
*------------------------------------------------------------------------------
*/
void DrawTerrain()
{
g_pd3dDevice->SetTexture( 0, g_pTexDiffuse ); /// 在0号纹理层固定纹理(颜色图)
g_pd3dDevice->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR ); /// 0号纹理层的放大滤镜
g_pd3dDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
g_pd3dDevice->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0 ); /// 0号纹理:使用0号纹理索引
D3DXMATRIXA16 pMat;
D3DXMatrixIdentity(&pMat);
g_pd3dDevice->SetTransform( D3DTS_WORLD, &pMat );
g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) );
g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
g_pd3dDevice->SetIndices( g_pIB );
g_pd3dDevice->DrawIndexedPrimitive( D3DPT_TRIANGLELIST, 0, 0, g_cxHeight*g_czHeight, 0, (g_cxHeight-1)*(g_czHeight-1)*2 );
}
/**-----------------------------------------------------------------------------
* 绘图
*------------------------------------------------------------------------------
*/
VOID Render()
{
/// 后置缓冲和Z-缓冲初始化
g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(255,255,255), 1.0f, 0 );
Animate();
/// 开始渲染
if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
{
DrawTerrain(); //绘制地形
g_pd3dDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
g_pd3dDevice->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP);
g_pd3dDevice->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP);
g_pSkyBox->Render(g_fTime, &g_pSkyBox->m_matWorld); //绘制天空
g_pd3dDevice->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP);
g_pd3dDevice->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP);
g_pSkinMesh->Render(g_fTime, &g_pSkinMesh->m_matWorld); //绘制角色
g_pd3dDevice->SetRenderState(D3DRS_LIGHTING, TRUE);
/// 结束渲染
g_pd3dDevice->EndScene();
}
/// 显示后置缓冲的画面!
g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
}
/**-----------------------------------------------------------------------------
* 窗口过程
*------------------------------------------------------------------------------
*/
LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
switch( msg )
{
case WM_DESTROY:
PostQuitMessage( 0 );
return 0;
case WM_KEYDOWN :
switch( wParam )
{
case VK_ESCAPE :
PostMessage( hWnd, WM_DESTROY, 0, 0L );
break;
}
break;
}
return DefWindowProc( hWnd, msg, wParam, lParam );
}
/**-----------------------------------------------------------------------------
* 程序的起始地址
*------------------------------------------------------------------------------
*/
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
{
/// 注册窗口类
WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
"BasicFrame", NULL };
RegisterClassEx( &wc );
/// 创建窗口
HWND hWnd = CreateWindow( "BasicFrame", WINDOW_TITLE,
WS_OVERLAPPEDWINDOW, 100, 100, WINDOW_W, WINDOW_H,
GetDesktopWindow(), NULL, wc.hInstance, NULL );
g_hwnd = hWnd;
g_hinst = wc.hInstance;
/// Direct3D初始化
if( SUCCEEDED( InitD3D( hWnd ) ) )
{
ShowWindow( hWnd, SW_SHOWDEFAULT );
UpdateWindow( hWnd );
if( SUCCEEDED( InitGeometry() ) )
{
/// 显示窗口
/// 消息循环
MSG msg;
ZeroMemory( &msg, sizeof(msg) );
while( msg.message!=WM_QUIT )
{
/// 消息队列中有消息时,调用相应的处理过程
if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
else
/// 如果没有需要处理的消息,调用Render()函数
Render();
}
}
}
Cleanup();
/// 删除注册的类
UnregisterClass( "D3D Tutorial", wc.hInstance );
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -