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;
}