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

📄 game.cpp

📁 3D俄罗斯方块源码.rar
💻 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;
		}
//---------------字体设置--------------------
	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 );
//---------------字体设置--------------------
}
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:人数设定
	  *\param _align 位于窗口的位置
	  *\param _row 初始行数设定
	  *\param _level 初始级别设定
	  *\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
	  *设置键盘
	  */
void CGame::SetKey(int a,CControl *b)
{
		m_keyboard.SetKey(a,b);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -