⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 winmain.cpp

📁 Camera的源文件只是一部分Camera的源文件只是一部分
💻 CPP
📖 第 1 页 / 共 2 页
字号:

	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 + -