?? game.cpp
字號:
//--------------------------------------------------------------
/**\!File
*
*File name:GAME.h
*
*His:add by honghaier @2004/2/17
*
*Desc:游戲類
*/
//---------------------------------------------------------------
#include "Game.h"
#include "BASIC.h"
#include <windows.h>
//---------------------------------------------------------------
CGame::CGame()
{
m_stop=false;
m_pD3D = NULL;
m_pD3DDevice = NULL;
m_wood=NULL;
m_skybox=NULL;
for(int i=0;i<WOODROW;i++)
for(int j=0;j<WOODCOW;j++)
{
m_wooddata[i][j]=0;
}
//---------------字體設(shè)置--------------------
lstrcpy( m_strFont, _T("Arial Black") );
m_dwFontSize = 18;
m_pFont1 = new CD3DFont( m_strFont, m_dwFontSize );
lstrcpy( m_strFont, _T("Arial Black") );
m_dwFontSize = 12;
m_pFont2 = new CD3DFont( m_strFont, m_dwFontSize );
//---------------字體設(shè)置--------------------
}
CGame::~CGame()
{
SAFE_DELETE(m_pFont1);
SAFE_DELETE(m_pFont2);
SAFE_DELETE(m_wood);
SAFE_DELETE(m_skybox);
SAFE_RELEASE(m_pD3DDevice);
SAFE_RELEASE(m_pD3D);
}
bool CGame::Initialise(HWND hWnd, UINT nWidth, UINT nHeight)
{
if(SUCCEEDED(InitialiseD3D(hWnd, nWidth, nHeight)))
{
m_hWnd=hWnd;
}
else
{
return false;
}
return true;
}
/**!\brief
*\param _p1:人數(shù)設(shè)定
*\param _align 位于窗口的位置
*\param _row 初始行數(shù)設(shè)定
*\param _level 初始級別設(shè)定
*\param _isshownext 是否顯示下一個
*\param _isaddrow 玩法模式
*/
bool CGame::InitialiseGame(int _p1,int _align,int _row,int _level,bool _isshownext,bool _isaddrow)
{
m_pMusicManager=new CMusicManager();
if(FAILED(m_bgmusic.init(m_hWnd,m_pMusicManager)))return false;
if(FAILED(m_keyboard.initKeyboard(m_hWnd)))return false;
m_pSoundManager=new CSoundManager();
if(FAILED(m_sound[0].init(m_hWnd,m_pSoundManager)))return false;
if(FAILED(m_sound[1].init(m_hWnd,m_pSoundManager)))return false;
if(FAILED(m_sound[2].init(m_hWnd,m_pSoundManager)))return false;
if(FAILED(m_sound[3].init(m_hWnd,m_pSoundManager)))return false;
if(FAILED(m_sound[4].init(m_hWnd,m_pSoundManager)))return false;
//-----------------------------
m_personnum=_p1;
m_row=_row;
m_isshownext=_isshownext;
m_level=_level;
m_align=_align;
if(_isaddrow==false)
{
m_type=1;
}
else
{
m_type=2;
}
m_end=false;
//-----------------信息-----------------
if(FAILED(m_Msg.Init(m_pD3DDevice,&m_sound[4])))return false;
//-----------------字體-----------------
m_pFont1->InitDeviceObjects(m_pD3DDevice);
m_pFont1->RestoreDeviceObjects();
m_pFont2->InitDeviceObjects(m_pD3DDevice);
m_pFont2->RestoreDeviceObjects();
//------------------場景------------------
m_wood=new CCuboid(m_pD3DDevice);/**墻體 */
m_wood->SetTexture("tex\\back.jpg");
m_wood->SetSize(10,10,0.0);
m_skybox=new CCuboid(m_pD3DDevice);/**天空 */
srand(timeGetTime());
if(rand()%2)
{
m_skybox->SetTexture("tex\\SPACE.bmp");
}
else
{
m_skybox->SetTexture("tex\\sky.jpg");
}
m_skybox->SetSize(800,800,1000);
for(int i=0;i<WOODROW;i++)
for(int j=0;j<WOODCOW;j++)
{
if(i<=5||i>=26)
{
m_wooddata[i][j]=1;
}
if(j<=3||j==14||j==15||j>=26)
{
m_wooddata[i][j]=1;
}
}
switch(_p1)
{
case 1:
if(_align==1)
{
m_person1.SetKeyBoard(&m_keyboard);
if(FAILED(m_person1.SetPerson(1,m_hWnd,&m_sound[0],&m_sound[1])))return false;
if(FAILED(m_person1.Start(m_row,m_level,m_isshownext,m_pD3DDevice)))return false;
}
else
{
m_person2.SetKeyBoard(&m_keyboard);
if(FAILED(m_person2.SetPerson(2,m_hWnd,&m_sound[2],&m_sound[3])))return false;
if(FAILED(m_person2.Start(m_row,m_level,m_isshownext,m_pD3DDevice)))return false;
}
break;
case 2:
m_person1.SetKeyBoard(&m_keyboard);
m_person2.SetKeyBoard(&m_keyboard);
if(FAILED(m_person1.SetPerson(1,m_hWnd,&m_sound[0],&m_sound[1])))return false;
if(FAILED(m_person2.SetPerson(2,m_hWnd,&m_sound[2],&m_sound[3])))return false;
if(FAILED(m_person1.Start(m_row,m_level,m_isshownext,m_pD3DDevice)))return false;
if(FAILED(m_person2.Start(m_row,m_level,m_isshownext,m_pD3DDevice)))return false;
break;
}
char musicfilename[50];
wsprintf(musicfilename,"mus\\%d.mid",m_level);
if(SUCCEEDED(m_bgmusic.Load(musicfilename)))
{
m_bgmusic.Play();
}
if(FAILED(m_EndPart.init(m_hWnd,m_pD3DDevice,240,200)))return false;
return true;
}
void CGame::EndGame(bool _isend)
{
m_end=_isend;
}
D3DFORMAT CGame::CheckDisplayMode(UINT nWidth, UINT nHeight, UINT nDepth)
{
UINT x;
D3DDISPLAYMODE d3ddm;
for(x = 0; x < m_pD3D->GetAdapterModeCount(0); x++)
{
m_pD3D->EnumAdapterModes(0, x, &d3ddm);
if(d3ddm.Width == nWidth)
{
if(d3ddm.Height == nHeight)
{
if((d3ddm.Format == D3DFMT_R5G6B5) || (d3ddm.Format == D3DFMT_X1R5G5B5) || (d3ddm.Format == D3DFMT_X4R4G4B4))
{
if(nDepth == 16)
{
return d3ddm.Format;
}
}
else if((d3ddm.Format == D3DFMT_R8G8B8) || (d3ddm.Format == D3DFMT_X8R8G8B8))
{
if(nDepth == 32)
{
return d3ddm.Format;
}
}
}
}
}
return D3DFMT_UNKNOWN;
}
HRESULT CGame::InitialiseD3D(HWND hWnd, UINT nWidth, UINT nHeight)
{
m_pD3D = Direct3DCreate8(D3D_SDK_VERSION);
if(m_pD3D == NULL)
{
return E_FAIL;
}
D3DDISPLAYMODE d3ddm;
d3ddm.Format = CheckDisplayMode(nWidth, nHeight, 32);
if(d3ddm.Format != D3DFMT_UNKNOWN)
{
d3ddm.Width = nWidth;
d3ddm.Height = nHeight;
}
else
{
d3ddm.Format = CheckDisplayMode(nWidth, nHeight, 16);
if(d3ddm.Format != D3DFMT_UNKNOWN)
{
d3ddm.Width = nWidth;
d3ddm.Height = nHeight;
}
else
{
return E_FAIL;
}
}
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.Windowed = FALSE;
d3dpp.BackBufferCount = 1;
d3dpp.BackBufferFormat = d3ddm.Format;
d3dpp.BackBufferWidth = d3ddm.Width;
d3dpp.BackBufferHeight = d3ddm.Height;
d3dpp.hDeviceWindow = hWnd;
d3dpp.SwapEffect = D3DSWAPEFFECT_COPY_VSYNC;
d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
d3dpp.FullScreen_PresentationInterval = D3DPRESENT_INTERVAL_ONE;
if(m_pD3D->CheckDeviceFormat(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, d3ddm.Format, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_SURFACE, D3DFMT_D32) == D3D_OK)
{
d3dpp.AutoDepthStencilFormat = D3DFMT_D32;
d3dpp.EnableAutoDepthStencil = TRUE;
}
else if(m_pD3D->CheckDeviceFormat(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, d3ddm.Format, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_SURFACE, D3DFMT_D24X8) == D3D_OK)
{
d3dpp.AutoDepthStencilFormat = D3DFMT_D24X8;
d3dpp.EnableAutoDepthStencil = TRUE;
}
else if(m_pD3D->CheckDeviceFormat(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, d3ddm.Format, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_SURFACE, D3DFMT_D16) == D3D_OK)
{
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
d3dpp.EnableAutoDepthStencil = TRUE;
}
else
{
d3dpp.EnableAutoDepthStencil = FALSE;
}
if(FAILED(m_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &m_pD3DDevice)))
{
return E_FAIL;
}
m_pD3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
m_pD3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
m_pD3DDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);
return S_OK;
}
LPDIRECT3DDEVICE8 CGame::GetDevice()
{
return m_pD3DDevice;
}
void CGame::GameLoop()
{
MSG msg;
BOOL fMessage;
PeekMessage(&msg, NULL, 0U, 0U, PM_NOREMOVE);
while(msg.message != WM_QUIT)
{
fMessage = PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE);
if(fMessage)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
DoMusic();
Render();
}
}
}
void CGame::DoMusic()
{
if(m_personnum==1)
{
if(m_align==1)
{
if(m_level<m_person1.m_map.m_level)
{
m_level=m_person1.m_map.m_level;
char musicfilename[50];
wsprintf(musicfilename,"mus\\%d.mid",m_person1.m_map.m_level);
if(SUCCEEDED(m_bgmusic.Load(musicfilename)))
{
m_bgmusic.Play();
}
}
}
else
{
if(m_level<m_person2.m_map.m_level)
{
m_level=m_person2.m_map.m_level;
char musicfilename[50];
wsprintf(musicfilename,"mus\\%d.mid",m_person2.m_map.m_level);
if(SUCCEEDED(m_bgmusic.Load(musicfilename)))
{
m_bgmusic.Play();
}
}
}
}
else
{
if(m_person1.m_map.m_level>m_person2.m_map.m_level)
{
if(m_level<m_person1.m_map.m_level)
{
m_level=m_person1.m_map.m_level;
char musicfilename[50];
wsprintf(musicfilename,"mus\\%d.mid",m_person1.m_map.m_level);
if(SUCCEEDED(m_bgmusic.Load(musicfilename)))
{
m_bgmusic.Play();
}
}
}
else
{
if(m_level<m_person2.m_map.m_level)
{
m_level=m_person2.m_map.m_level;
char musicfilename[50];
wsprintf(musicfilename,"mus\\%d.mid",m_person2.m_map.m_level);
if(SUCCEEDED(m_bgmusic.Load(musicfilename)))
{
m_bgmusic.Play();
}
}
}
}
}
void CGame::Render()
{
if(m_pD3DDevice == NULL)
{
return;
}
m_pD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
m_pD3DDevice->BeginScene();
SetupCamera();
RenderWood();
RenderTile();
if(m_end==false)
{
if(m_stop==false)
{
RenderPerson(m_personnum);
}
else
{
m_Msg.Show();
}
}
else
{
m_EndPart.Render();
}
RenderFont();
m_pD3DDevice->EndScene();
m_pD3DDevice->Present(NULL, NULL, NULL, NULL);
}
void CGame::SetupCamera()
{
D3DXMATRIX matView;
D3DXMatrixLookAtLH(&matView, &D3DXVECTOR3(115.1f,-120.0f,-350.0f), //Camera Position
&D3DXVECTOR3(115.1f,-120.0f, 0.0f), //Look At Position
&D3DXVECTOR3(0.0f, 1.0f, 0.0f)); //Up Direction
m_pD3DDevice->SetTransform(D3DTS_VIEW, &matView);
D3DXMATRIX matProj;
D3DXMatrixPerspectiveFovLH(&matProj, D3DX_PI/4, 1.0f, 1.0f, 1500.0f);
m_pD3DDevice->SetTransform(D3DTS_PROJECTION, &matProj);
}
void CGame::RenderWood()
{
for(int i=0;i<WOODROW;i++)
for(int j=0;j<WOODCOW;j++)
{
if(m_wooddata[i][j]==1)
{
D3DXMATRIX matWorld;
D3DXMatrixIdentity(&matWorld);
D3DXMatrixTranslation(&matWorld,-30+j*10.0,20+(-10.0)*i,-5.0);
m_pD3DDevice->SetTransform( D3DTS_WORLD, &matWorld);
m_wood->Render();
}
}
}
void CGame::RenderTile()
{
D3DXMATRIX matWorld;
D3DXMatrixIdentity(&matWorld);
D3DXMatrixTranslation(&matWorld,150,-150,0.0);
m_pD3DDevice->SetTransform( D3DTS_WORLD, &matWorld);
m_skybox->Render();
}
void CGame::RenderPerson(int _personnum)
{
switch(_personnum)
{
case 1:
if(m_align==1)
{
m_person1.Render();
}
else
{
m_person2.Render();
}
break;
case 2:
m_person1.Render();
m_person2.Render();
if(m_type==2)
{
if(m_person1.m_map.m_addrow)
{
if(m_person2.m_map.m_finish==false)
{
m_person2.m_map.AddToMap(m_person1.m_map.xiaorownum);
m_person1.m_map.m_addrow=false;
}
}
if(m_person2.m_map.m_addrow)
{
if(m_person1.m_map.m_finish==false)
{
m_person1.m_map.AddToMap(m_person2.m_map.xiaorownum);
m_person2.m_map.m_addrow=false;
}
}
}
break;
}
}
bool CGame::SetNum(int _num)
{
m_personnum=_num;
return true;
}
void CGame::RenderFont()
{
if(m_personnum==1)
{
if(m_align==1)
{
char szInfo[100];
wsprintf(szInfo,"Player1 ");
m_pFont1->DrawText(85, 10, D3DCOLOR_ARGB(255,255,255,255),szInfo);
char szInfo2[100];
wsprintf(szInfo2,"score:%d level:%d",m_person1.m_map.m_score,m_person1.m_map.m_level);
m_pFont2->DrawText(85, 40, D3DCOLOR_ARGB(255,0,255,0),szInfo2);
char szInfo3[100];
wsprintf(szInfo3,"Last Tile");
m_pFont2->DrawText(200, 10, D3DCOLOR_ARGB(255,255,255,0),szInfo3);
if(m_person1.m_map.m_finish==true)
{
char szInfo4[100];
wsprintf(szInfo4,"GAME OVER");
m_pFont1->DrawText(160,400, D3DCOLOR_ARGB(255,255,0,0),szInfo4);
m_pFont1->DrawText(110,480, D3DCOLOR_ARGB(255,0,255,0),"Enter F1 to ReDo!");
}
}
else
{
char szInfo[100];
wsprintf(szInfo,"Player1 ");
m_pFont1->DrawText(440, 10, D3DCOLOR_ARGB(255,255,255,255),szInfo);
char szInfo2[100];
wsprintf(szInfo2,"score:%d level:%d",m_person2.m_map.m_score,m_person2.m_map.m_level);
m_pFont2->DrawText(440, 40, D3DCOLOR_ARGB(255,0,255,0),szInfo2);
char szInfo3[100];
wsprintf(szInfo3,"Last Tile");
m_pFont2->DrawText(630, 10, D3DCOLOR_ARGB(255,255,255,0),szInfo3);
if(m_person2.m_map.m_finish==true)
{
char szInfo4[100];
wsprintf(szInfo4,"GAME OVER");
m_pFont1->DrawText(490,400, D3DCOLOR_ARGB(255,255,0,0),szInfo4);
m_pFont1->DrawText(450,480, D3DCOLOR_ARGB(255,0,255,0),"Enter F2 to ReDo!");
}
}
}
else
{
char szInfo[100];
wsprintf(szInfo,"Player1 ");
m_pFont1->DrawText(85, 10, D3DCOLOR_ARGB(255,255,255,255),szInfo);
char szInfo2[100];
wsprintf(szInfo2,"Player2 ");
m_pFont1->DrawText(440, 10, D3DCOLOR_ARGB(255,255,255,255),szInfo2);
char szInfo3[100];
wsprintf(szInfo3,"score:%d level:%d",m_person1.m_map.m_score,m_person1.m_map.m_level);
m_pFont2->DrawText(85, 40, D3DCOLOR_ARGB(255,0,255,0),szInfo3);
char szInfo4[100];
wsprintf(szInfo4,"score:%d level:%d",m_person2.m_map.m_score,m_person2.m_map.m_level);
m_pFont2->DrawText(440, 40, D3DCOLOR_ARGB(255,0,255,0),szInfo4);
char szInfo5[100];
wsprintf(szInfo5,"Next Tile");
m_pFont2->DrawText(300, 10, D3DCOLOR_ARGB(255,255,255,0),szInfo5);
char szInfo6[100];
wsprintf(szInfo6,"Next Tile");
m_pFont2->DrawText(630, 10, D3DCOLOR_ARGB(255,255,255,0),szInfo6);
if(m_person1.m_map.m_finish==true)
{
char szInfo11[100];
wsprintf(szInfo11,"GAME OVER");
m_pFont1->DrawText(160,400, D3DCOLOR_ARGB(255,255,0,0),szInfo11);
m_pFont1->DrawText(110,480, D3DCOLOR_ARGB(255,0,255,0),"Enter F1 to ReDo!");
}
if(m_person2.m_map.m_finish==true)
{
char szInfo22[100];
wsprintf(szInfo22,"GAME OVER");
m_pFont1->DrawText(490,400, D3DCOLOR_ARGB(255,255,0,0),szInfo22);
m_pFont1->DrawText(450,480, D3DCOLOR_ARGB(255,0,255,0),"Enter F2 to ReDo!");
}
}
}
void CGame::Stop()
{
m_stop=!m_stop;
m_Msg.SetMsg(1);
}
void CGame::ReLife(int _which)
{
if(_which==1)
{
m_person1.ReLife();
}
else
{
if(m_personnum==2)
{
m_person2.ReLife();
}
}
}
void CGame::SetType(int _type)
{
m_type=_type;
}
/**!\brief
*設(shè)置鍵盤
*/
void CGame::SetKey(int a,CControl *b)
{
m_keyboard.SetKey(a,b);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -