www.pudn.com > Game_11.rar > GameApp.cpp


// GameApp.cpp: implementation of the GameApp class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "GameApp.h" 
 
 
 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
LRESULT GameApp::Run() 
{ 
		MSG msg; 
		memset(&msg,0,sizeof(msg)); 
		while(msg.message!=WM_QUIT) 
		{	 
			if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) 
			{ 
				TranslateMessage( &msg ); 
				DispatchMessage( &msg ); 
			} 
			else 
			{ 
				Sleep(10); 
 
				FrameStart(); 
				Render(); 
			} 
		} 
		return msg.wParam; 
} 
LRESULT GameApp::FrameStart() 
{ 
	return D3D_OK; 
}  
GameApp::GameApp(HWND GameHwnd,HINSTANCE hInstance) 
{ 
	hwnd=GameHwnd; 
	mhInstance=hInstance; 
	InitGame();  
 
} 
 
 
GameApp::~GameApp() 
{ 
 
} 
HRESULT GameApp::Update() 
{	 
//	ProcessDI();  
	 
 
	return D3D_OK; 
} 
 
LRESULT GameApp::ProcessDI() 
{ 
 
	if(DI_OK!=m_pDInputKB->GetDeviceState(sizeof(m_strKeyState),m_strKeyState)) 
	//	MessageBox(NULL,"Failed to GetDeviceState","ERROR",MB_ICONERROR|MB_OK); 
	{ 
		if(	DI_OK!=m_pDInputKB->Acquire()) 
			return S_OK; 
		else return E_FAIL; 
		 
	 
	} 
	float dSide=0,dForward=0; 
	float mouseX,mouseY; 
	 
	if(m_strKeyState[DIK_A]			& 0x80)  dSide=-4; 
	else if(m_strKeyState[DIK_D]	& 0x80) dSide=4; 
 
 
	if(m_strKeyState[DIK_W] & 0x80) dForward=4; 
	else if(m_strKeyState[DIK_S] & 0x80) dForward=-4; 
     
  
	 
//	pWarrior->SetAnim(abs(vKeyMov.z)>5 || abs(vKeyMov.x)>5); 
	 
	m_pDInputMouse->GetDeviceState(sizeof(m_MouseState),&m_MouseState); 
	mouseX=m_MouseState.lX*D3DX_PI/720.0f;	//每移动一个点,方向改变1/4度 
	mouseY=m_MouseState.lY*D3DX_PI/720.0f; 
	m_pCursor->MoveRelative(m_MouseState.lX,-m_MouseState.lY,m_d3dsdBackBuffer.Width ,m_d3dsdBackBuffer.Height); 
 
	if(m_MouseState.rgbButtons[0]&0x80) 
	{ 
		D3DXVECTOR3 vPickedPos; 
		POINT p={m_pCursor->getX(),m_pCursor->getY()}; 
		if(m_pCursor->getY()getY() ) 
		{	//点击了面板 
					 
		 
 
		} 
		else if(m_pTerrain->Pick(p,&vPickedPos,m_d3dsdBackBuffer.Width, 
				m_d3dsdBackBuffer.Height)) 
		{	//点击了场景 
			vPickedPos.y=m_pTerrain->GetHeight(vPickedPos.x,vPickedPos.z);   
			m_pCursorIdicator->SetPosition(vPickedPos.x,vPickedPos.y,vPickedPos.z);  
			m_pHero->Goto(vPickedPos); 
			 
		} 
 
	} 
	 
	if(m_MouseState.rgbButtons[1]&0x80) 
	{ 
 
		m_pCamera->YawPitchAt(-mouseX,mouseY);  
	} 
		m_pCamera->Move(dSide,dForward);  
		D3DXVECTOR3 vPos=m_pHero->GetPosition(); 
		vPos.y+=15; 
		m_pCamera->MoveAtTo(&vPos);     
 
 
	return S_OK; 
 
 
} 
HRESULT GameApp::SetMatrices() 
{ 
	 
 
	return D3D_OK; 
 
 
} 
 
 
 
LRESULT GameApp::InitGame() 
{ 
	if(S_OK!=InitD3D()) return E_FAIL; 
	 
	InitDInput(); 
	 
	InitScene();  
	m_pSound=new CWaveMidi(hwnd); 
	m_pSound->LoadSound(".\\ASKUASKM.MID"); 
	m_pSound->Play(1);  
 
 
	return D3D_OK; 
}  
LRESULT GameApp::InitScene() 
{ 
	m_pCamera=new CCamera(m_pD3DDevice, &D3DXVECTOR3(0,200,0));  
	m_pTerrain=new CTerrain(m_pD3DDevice,D3DXVECTOR3(0,0,0)); 
	m_pTerrain->CreateTerrain("Terrain_128.bmp","terr_dirt-grass.jpg",20,200);   
	pCube=new CCube(m_pD3DDevice,D3DXVECTOR3(0,0,0)); 
	pCube->CreateCube(3000,"SummerSky.tga");  
	m_pCursor=new CScreenObject(m_pD3DDevice,"Cursor.bmp"); 
	m_pPanel=new CScreenObject(m_pD3DDevice,"Panel.bmp",m_d3dsdBackBuffer.Width,64); 
	//m_pPanel->MoveTo(-m_d3dsdBackBuffer.Width/2,-m_d3dsdBackBuffer.Height/2);  
	m_pPanel->MoveTo(-float(m_d3dsdBackBuffer.Width)/2, 
					-float(m_d3dsdBackBuffer.Height)/2+64); 
   
	m_pCursorIdicator=new CUnit(m_pD3DDevice,"Cone.x",m_pTerrain); 
	m_pCursorIdicator->SetPosition(-30,0,-400);   
 
	m_pHero=new CUnit(m_pD3DDevice,"Girl.x",m_pTerrain); 
	m_pHero->SetPosition(0,0,0);  
  
 
	LoadScene(".\\maps\\demo.map");  
 
 
 
	float fogstart=1.0f; 
	float fogend=1500.0f; //雾的开始范围和结束范围 
	m_pD3DDevice->SetRenderState(D3DRS_FOGENABLE, TRUE); //打开雾 
	m_pD3DDevice->SetRenderState(D3DRS_FOGCOLOR, 0x00F0F0FF);  
	//设置雾的颜色 
	//设置雾的衰减方式为线性 
	m_pD3DDevice->SetRenderState(D3DRS_FOGTABLEMODE, D3DFOG_LINEAR  ); 
	//设定雾的开始范围和结束范围 
	m_pD3DDevice->SetRenderState(D3DRS_FOGSTART, *((DWORD*)(&fogstart))); 
	m_pD3DDevice->SetRenderState(D3DRS_FOGEND,   *((DWORD*)(&fogend))); 
 
	return D3D_OK; 
 
}	 
 
 
LRESULT GameApp::InitD3D() 
{ 
	m_pD3D=Direct3DCreate9(D3D_SDK_VERSION); 
	D3DDISPLAYMODE	d3ddm; 
	m_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3ddm); 
 
	D3DPRESENT_PARAMETERS	d3dpp; 
	memset(&d3dpp,0,sizeof(d3dpp)); 
	d3dpp.BackBufferCount=1; 
	d3dpp.BackBufferFormat=d3ddm.Format; 
//    d3dpp.BackBufferWidth = d3ddm.Width; 
 //   d3dpp.BackBufferHeight = d3ddm.Height; 
 
	d3dpp.Windowed=TRUE; 
	d3dpp.hDeviceWindow=hwnd; 
	d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD; 
	d3dpp.AutoDepthStencilFormat=D3DFMT_D16; 
	d3dpp.EnableAutoDepthStencil=TRUE; 
	d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT; 
 
 
	if(D3D_OK!=m_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hwnd, 
		D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&m_pD3DDevice)) 
	{ 
		MessageBox(NULL,"创建设备失败!","ERROR",MB_OK|MB_ICONERROR); 
		return E_FAIL; 
	} 
 	m_pD3DDevice->SetRenderState(D3DRS_LIGHTING,FALSE); 
	m_pD3DDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_CCW); 
	m_pD3DDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE); 
 //   m_pD3DDevice->SetRenderState( D3DRS_AMBIENT, 0xffffffff ); 
	//m_pD3DDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_WIREFRAME); 
	m_pD3DDevice->SetSamplerState(0,D3DSAMP_MAGFILTER,D3DTEXF_LINEAR); 
	m_pD3DDevice->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_BLENDTEXTUREALPHA); 
	m_pD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); 
	m_pD3DDevice->SetRenderState(D3DRS_SRCBLEND,  D3DBLEND_SRCALPHA); 
	m_pD3DDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); 
 
        LPDIRECT3DSURFACE9 pBackBuffer = NULL; 
        m_pD3DDevice->GetBackBuffer( 0, 0, D3DBACKBUFFER_TYPE_MONO, &pBackBuffer ); 
        pBackBuffer->GetDesc( &m_d3dsdBackBuffer ); 
 
 
	return D3D_OK; 
 
} 
 
//#define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } }  
LRESULT GameApp::EndDInput() 
{ 
	SAFE_RELEASE(m_pDInputMouse); 
	SAFE_RELEASE(m_pDInputKB); 
	SAFE_RELEASE(m_pDInput); 
	return S_OK; 
} 
LRESULT GameApp::InitDInput() 
{ 
	if(DI_OK!=DirectInput8Create( mhInstance,DIRECTINPUT_VERSION, 
		IID_IDirectInput8,(LPVOID*)&m_pDInput,NULL)) 
		MessageBox(hwnd,"Create DirectInput Object Failed!","ERROR",MB_ICONERROR|MB_OK); 
//创建DirectInput8对象 
 
	if(DI_OK!=m_pDInput->CreateDevice(GUID_SysKeyboard,&m_pDInputKB,NULL)) 
		MessageBox(hwnd,"Create DirectInput Keyboard Device Failed!","ERROR",MB_ICONERROR|MB_OK); 
//创建键盘设备 
		 
 
	if(DI_OK!=	m_pDInputKB->SetDataFormat(&c_dfDIKeyboard))  
		MessageBox(hwnd,"Set Keyboard DataFormat Failed!","ERROR",MB_ICONERROR|MB_OK);  
//设置数据格式 
	m_pDInputKB->SetCooperativeLevel(hwnd,DISCL_NONEXCLUSIVE|DISCL_FOREGROUND);  
	if(DI_OK!=m_pDInputKB->Acquire()) 
		MessageBox(hwnd,"Acquire KeyBoard Failed!","Error",MB_OK|MB_ICONERROR); 
////////////////////////////////////////////////////////////// 
	if(DI_OK!=m_pDInput->CreateDevice(GUID_SysMouse,&m_pDInputMouse,NULL)) 
		MessageBox(hwnd,"Create DirectInput Mouse Device Failed!","ERROR",MB_ICONERROR|MB_OK); 
//创建鼠标设备 
	 
	if(DI_OK!=	m_pDInputMouse->SetDataFormat(&c_dfDIMouse))  
		MessageBox(hwnd,"Set Mouse DataFormat Failed!","ERROR",MB_ICONERROR|MB_OK);  
//设置数据格式 
	m_pDInputMouse->SetCooperativeLevel(hwnd,DISCL_EXCLUSIVE|DISCL_FOREGROUND);  
	if(DI_OK!=m_pDInputMouse->Acquire()) 
		MessageBox(hwnd,"Acquire Mouse Failed!","Error",MB_OK|MB_ICONERROR); 
 
//设置协调层级 
	 
	return TRUE; 
} 
LRESULT GameApp::ClearD3D() 
{ 
	SAFE_DELETE(m_pD3DDevice); 
	SAFE_DELETE(m_pD3D);  
	return D3D_OK; 
 
}  
LRESULT GameApp::Render() 
{ 
	static float fTimeLastFrame; 
	float fCurTime=timeGetTime();  
	float fTime=(fCurTime-fTimeLastFrame)/1000.0f; 
	fTimeLastFrame=fCurTime;  
 
	m_pD3DDevice->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,0),1.0f,0); 
	 
	m_pD3DDevice->BeginScene(); 
		Update(); 
 
		m_pCamera->Update3DMatrix();  
		m_pTerrain->Render();  
		ProcessDI(); 
		pCube->Render();  
		 
		UnitList::iterator i; 
		for (i=m_ObjList.begin();i!=m_ObjList.end();++i ) 
		{ 
			(*i)->Render(fTime); 
		 
		} 
		m_pHero->Render(fTime);   
		m_pCursorIdicator->Render(fTime);  
		m_pCamera->Update2DMatrix(m_d3dsdBackBuffer.Width  ,m_d3dsdBackBuffer.Height); 
 
		m_pPanel->Render();  
		m_pCursor->Render();   
	  
	m_pD3DDevice->EndScene(); 
	 
 
	m_pD3DDevice->Present(NULL,NULL,NULL,NULL); 
	return D3D_OK; 
} 
 
 
 
	BOOL GameApp::LoadScene(char *strMapFile) 
	 { 
		// 创建逻辑字体hLeftFont 
 
		HFONT hNewFont = CreateFont(20, 0, 0, 0, 0, 0, 0, 0,  
							ANSI_CHARSET, 0, 0, 0, 0, "Comic Sans MS");; 
 
		HFONT hOldFont; 
 
		HDC		hwndDC; 
		HDC		dcMem; 
		HBITMAP bmpMem; 
		LOGBRUSH logB={BS_SOLID|DIB_RGB_COLORS,RGB(255,0,0),HS_VERTICAL}; 
		HBRUSH	hbr=CreateBrushIndirect(&logB); 
		 
		hwndDC=GetDC(hwnd); 
		hOldFont=(HFONT)SelectObject(hwndDC,hNewFont); 
 
 
		dcMem=CreateCompatibleDC(hwndDC); 
		bmpMem=(HBITMAP)LoadImage(NULL,"logo.bmp",IMAGE_BITMAP, 
			m_d3dsdBackBuffer.Width,m_d3dsdBackBuffer.Height,LR_LOADFROMFILE); 
		SelectObject(dcMem,bmpMem); 
		BitBlt(hwndDC,0,0,m_d3dsdBackBuffer.Width,m_d3dsdBackBuffer.Height,dcMem,0,0,SRCCOPY);   
		SetBkMode(hwndDC,TRANSPARENT);  
 
		RECT rectRange=		{100,350,600,370}; 
		RECT rectProgress=	{101,351,599,369}; 
 
		int nLine=0; 
		long nObject=0; 
		 
 
		char strObjNames[1024]; 
		memset(strObjNames,0,sizeof(strObjNames)); 
		char *pStr=strObjNames; 
 
		char strMesh[64]; 
		char strNum[16]; 
		D3DXVECTOR3 vPos; 
		float x,y,z,s; 
		CUnit* pUnit; 
		 
		TextOut(hwndDC,20,nLine++*18,"开始加载地图\n",12); 
 
		GetPrivateProfileSectionNames(strObjNames,sizeof(strObjNames),strMapFile); 
		while(*pStr!=0) 
		{	//计算物体数量 
			pStr+=strlen(pStr)+1; 	nObject++;	 
		} 
 
		pStr=strObjNames; 
		while(*pStr!=0) 
		{	 
			GetPrivateProfileString(pStr,"mesh","InvalidObject.x",strMesh, 
				sizeof(strMesh),strMapFile);   
 
			GetPrivateProfileString(pStr,"pos.x","0",strNum,sizeof(strNum),strMapFile); 
			x=atof(strNum);   
			 
			GetPrivateProfileString(pStr,"pos.y","0",strNum,sizeof(strNum),strMapFile); 
			y=atof(strNum);   
			 
			GetPrivateProfileString(pStr,"pos.z","0",strNum,sizeof(strNum),strMapFile); 
			z=atof(strNum);   
 
			GetPrivateProfileString(pStr,"scale","1.0",strNum,sizeof(strNum),strMapFile); 
			s=atof(strNum);   
 
			if(y<1)	y=m_pTerrain->GetHeight(x,z); 	 
 
			pUnit=new CUnit(m_pD3DDevice,strMesh,m_pTerrain); 
 
			pUnit->SetPosition(x,y,z);  
			pUnit->SetScale(s);  
		 
			::Rectangle(hwndDC,	rectRange.left ,rectRange.top, 
								rectRange.right,rectRange.bottom);  
			rectProgress.right=rectProgress.left+ 
				(rectRange.right-rectProgress.left-2) *((nLine-1)/(float)nObject); 
			FillRect(hwndDC,&rectProgress,hbr); 
			TextOut(hwndDC,20,	nLine*20,pStr,	strlen(pStr)); 
			TextOut(hwndDC,200,	nLine++*20,strMesh,strlen(strMesh)); 
			OutputDebugString(strMesh); 
			OutputDebugString("\tLoaded\n"); 
 
		 
			pStr+=strlen(pStr)+1;  
			m_ObjList.insert(m_ObjList.end(),pUnit);   
		} 
 
		TextOut(hwndDC,20,nLine++*20,"初始化场景\n",10); 
		SelectObject(hwndDC,hOldFont); 
		DeleteObject(hNewFont); 
		DeleteObject(bmpMem); 
		DeleteObject(dcMem); 
		DeleteObject(hwndDC); 
		 
	  
		return TRUE;  
	 }