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

📄 game_game.cpp

📁 我做的毕业设计
💻 CPP
📖 第 1 页 / 共 3 页
字号:
#include "Game_User.h"
#include "Game_Npc.h"
#include "2DUIManger.h"
#include "3DUIManger.h"
#include "SmallMap.h"
#include "D3DSprite.h"


static int i=0;
CGame::CGame()
{
	m_pD3D					= NULL;					
	m_pd3dDevice			= NULL;	
	m_pTerrain				= NULL;
	m_pSkyBox				= NULL; 
	m_pCamera				= NULL;
	m_pInput				= NULL;
	m_pFont					= NULL;
	m_pRole					= NULL;
	m_pEnemy				= NULL;
	m_pEnemy1				= NULL;
	m_pEnemy2				= NULL;
	m_pEnemy3				= NULL;
	m_pTempler				= NULL;
	m_pGlyph				= NULL;
	m_pTree1				= NULL;
	m_pTree2				= NULL;
	m_pTree3				= NULL;
	m_pGrass				= NULL;
	m_pFire					= NULL;
	m_pCrystal				= NULL;
	m_pMagicPoPo			= NULL;
	m_pMagicZhen			= NULL;
	m_pBone					= NULL;
	m_pButterflyMesh1       = NULL;
	m_pParticle             = NULL;
	m_pCursor				= NULL;
	m_pPanelRole			= NULL;
	m_pPanelEnemy			= NULL;
	m_pRoleHP			    = NULL;
	m_pRoleMP				= NULL;
	m_pEnemyHP				= NULL;
	m_pEnemyMP				= NULL;
	m_pGameLoadBG			= NULL;
	m_pNpcBag				= NULL;
	m_p2DUI					= NULL;
	//m_p3DUI					= NULL;
	m_pNpc					= NULL;
	m_pSmallMap				= NULL;
	m_pMiNiMapBar			= NULL;;
	m_pJiNenglan			= NULL;
	m_pBackBuffer           = NULL;
	m_pShadowVolume			= NULL;
	m_IsWalk				= false;
	m_IsRun					= false;
	m_IsAABB				= false;	
	m_isMouseDown			= false;	
	m_bRenderVolume         = false;
	m_iGameState			= true;
	m_RoleHeight.x			= -1000.0f;
	m_RoleHeight.y			= 1.0f;
	m_RoleHeight.z			= 950.0f;
	m_CamToTer				= 0.0f;	
	m_i						= 0;
	m_nScreenWidth			= 800;
	m_nScreenHeight			= 600;
	m_MagicAttack			= false;
	m_bBag					= false;
	m_MagicPos				=D3DXVECTOR3(-1000.0f,25.0f,1110.0f);
}
CGame::~CGame()
{
	for ( m_v1iter = m_v1.begin( ); m_v1iter != m_v1.end( ); m_v1iter++ )
	{
		delete (*m_v1iter);
	}
	for(int i = 0; i < m_pNpcNum; i++)
	{
		SAFE_DELETE(m_presNpc[i]);
	}
	m_presNpc.clear();
	SAFE_DELETE(m_pParticle);
	SAFE_DELETE(m_pMagicPoPo);
	SAFE_DELETE(m_pMagicZhen);
	SAFE_DELETE(m_pButterflyMesh1);
	SAFE_DELETE(m_pSmallMap);
	SAFE_DELETE(m_pMiNiMapBar);
	SAFE_DELETE(m_pEnemyMP);
	SAFE_DELETE(m_pJiNenglan);
	SAFE_DELETE(m_pEnemyHP);
	SAFE_DELETE(m_pRoleMP);
	SAFE_DELETE(m_pRoleHP);
	SAFE_DELETE(m_pGameLoadBG);
	SAFE_DELETE(m_pNpcBag);
	SAFE_DELETE(m_p2DUI);
	//SAFE_DELETE(m_p3DUI);
	SAFE_DELETE(m_pPanelEnemy);
	SAFE_DELETE(m_pPanelRole);
	SAFE_DELETE(m_pNpc);
	SAFE_DELETE(m_pGlyph);
	SAFE_DELETE(m_pCursor);
	SAFE_DELETE(m_pTempler);
	SAFE_DELETE(m_pTree1);
	SAFE_DELETE(m_pTree2);
	SAFE_DELETE(m_pTree3);
	SAFE_DELETE(m_pGrass);
	SAFE_DELETE(m_pFire);
	SAFE_DELETE(m_pCrystal);
	SAFE_DELETE(m_pMP3);	
	SAFE_DELETE(m_pRole);
	SAFE_DELETE(m_pFont)
	SAFE_DELETE(m_pInput)
	SAFE_DELETE(m_pSkyBox);
	SAFE_DELETE(m_pCamera);
	SAFE_DELETE(m_pTerrain);
	SAFE_DELETE(m_pShadowVolume);
	SAFE_RELEASE(m_pd3dDevice);
	SAFE_RELEASE(m_pD3D);							
}

void CGame::RenderAABB(LPDIRECT3DDEVICE9 pDevice,D3DXVECTOR3 *pVmin,D3DXVECTOR3 *pVmax)
{
	/*	
	  0-----max
	 /      /|
	/	   / |
	3-----2  5
	|	  | /
	|  	  |/
   min----6
	*/
	VERTEX_BOUNDINGBOX VB[]
	={  
		{pVmin->x,pVmax->y,pVmax->z,0xffff0000},	//0 上表面
		{pVmax->x,pVmax->y,pVmax->z,0xffff0000},	//1 max
		{pVmax->x,pVmax->y,pVmin->z,0xffff0000},	//2
		{pVmin->x,pVmax->y,pVmin->z,0xffff0000},	//3


		{pVmin->x,pVmin->y,pVmax->z,0xffff0000},	//4 下边四条线
		{pVmax->x,pVmin->y,pVmax->z,0xffff0000},	//5
		{pVmax->x,pVmin->y,pVmin->z,0xffff0000},	//6
		{pVmin->x,pVmin->y,pVmin->z,0xffff0000},	//7 min
	};
	WORD	IB[]=
	{0,1,1,2,2,3,3,0,
	4,5,5,6,6,7,7,4,
	0,4,1,5,2,6,3,7};

	D3DXMATRIX matIdentity;
	D3DXMatrixIdentity(&matIdentity);

	m_pd3dDevice->SetTransform(D3DTS_WORLD, &matIdentity);
	m_pd3dDevice->SetTexture(0, NULL);  
	m_pd3dDevice->SetFVF(D3DFVF_CUSTOM_BOUNDINGBOX);
	m_pd3dDevice->DrawIndexedPrimitiveUP(D3DPT_LINELIST,0,24,12,IB,D3DFMT_INDEX16,
		VB,sizeof(VERTEX_BOUNDINGBOX));
}

bool CGame::Init(HWND hWnd, HINSTANCE hInst, UINT nHeight, UINT nWidth)
{
	if(InitD3D(hWnd, nHeight, nWidth))
	{
		if(InitGame(hWnd, hInst))
		{
			//SetMaterial();
			return SetLight();
		}
		else
		{
			return false;
		}
	}
	else
	{
		return false;
	}
	return true;
}

bool CGame::InitD3D(HWND hWnd, UINT nHeight, UINT nWidth)
{
	if( NULL == ( m_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
		return false;

	D3DDISPLAYMODE d3ddm;
	if( FAILED( m_pD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &d3ddm ) ) )
		return false;

	D3DPRESENT_PARAMETERS d3dpp; 
	ZeroMemory( &d3dpp, sizeof(d3dpp) );
	d3dpp.BackBufferHeight			 = d3ddm.Height;
	d3dpp.BackBufferWidth			 = d3ddm.Width;
	d3dpp.BackBufferFormat			 = d3ddm.Format;
	d3dpp.BackBufferCount			 = 1;
	d3dpp.Windowed					 = TRUE;
	d3dpp.hDeviceWindow				 = hWnd;
	d3dpp.MultiSampleType            = D3DMULTISAMPLE_NONE;
	d3dpp.SwapEffect				 = D3DSWAPEFFECT_DISCARD;	
	d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
	d3dpp.PresentationInterval		 = D3DPRESENT_INTERVAL_DEFAULT;
	d3dpp.AutoDepthStencilFormat	 = D3DFMT_D24S8;
	d3dpp.EnableAutoDepthStencil	 = TRUE;

	m_nScreenHeight					 = d3ddm.Height;
	m_nScreenWidth					 = d3ddm.Width;	
	
	D3DCAPS9 caps;
	m_pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps);

	if( FAILED( m_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
		D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &m_pd3dDevice ) ) )
	{
		return false;
	}
	
	m_pd3dDevice->SetRenderState(D3DRS_LIGHTING,FALSE);

	m_pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);

	m_pd3dDevice->SetRenderState(D3DRS_ZENABLE,TRUE);   

	m_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
	m_pd3dDevice->SetRenderState(D3DRS_SRCBLEND,  D3DBLEND_SRCALPHA);
	m_pd3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);

	m_pd3dDevice->SetSamplerState(0,D3DSAMP_ADDRESSU,D3DTADDRESS_MIRROR);
	m_pd3dDevice->SetSamplerState(0,D3DSAMP_ADDRESSV,D3DTADDRESS_MIRROR);
	m_pd3dDevice->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_BLENDTEXTUREALPHA);

	m_pd3dDevice->SetSamplerState(0, D3DSAMP_MAGFILTER,D3DTEXF_LINEAR);
	m_pd3dDevice->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);
	m_pd3dDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);


	//摄像机
	m_pCamera = new CCamera( m_pd3dDevice, &D3DXVECTOR3(0,200,100) );
	m_pCamera->Update2DMatrix();
	m_pCamera->SetYawPitch(D3DX_PI , -D3DX_PI / 6);

	//LOGO画面
	m_pGameLoadBG = new CPanel(m_pd3dDevice, 800.0f, 600.0f, m_nScreenWidth, m_nScreenHeight,-1);
	m_pGameLoadBG->SetTexture( ".\\UIimage\\MainMenuBG.jpg", D3DCOLOR_XRGB(0, 0, 0) );
	m_p2DUI = new C2DUIManger(m_pd3dDevice);
	return true;
}

bool CGame::SetLight()
{
	D3DLIGHT9 d3dLight;

	ZeroMemory(&d3dLight, sizeof(D3DLIGHT9));

	d3dLight.Type = D3DLIGHT_POINT;
	d3dLight.Diffuse.r = 1.0f;
	d3dLight.Diffuse.g = 1.0f;
	d3dLight.Diffuse.b = 1.0f;

	d3dLight.Ambient.r = 1.0f;
	d3dLight.Ambient.g = 1.0f;
	d3dLight.Ambient.b = 1.0f;

	d3dLight.Specular.r = 0.0f;
	d3dLight.Specular.g	= 0.0f;
	d3dLight.Specular.b	= 0.0f;

	d3dLight.Position.x = -200.0f;
	d3dLight.Position.y = 200.0f;
	d3dLight.Position.z = -500.0f;

	d3dLight.Attenuation0 = 0.9f; 
	d3dLight.Attenuation1 = 0.0f; 
	d3dLight.Attenuation2 = 0.0f; 

	d3dLight.Range = 100.0f;	

	m_pd3dDevice->SetLight(0, &d3dLight);
	
	m_pd3dDevice->LightEnable(0, TRUE);

	//根据光源位置更新阴影体
	m_pShadowVolume->UpdateShadowVolume( d3dLight.Position );
	
	m_pd3dDevice->SetRenderState(D3DRS_LIGHTING, TRUE);
	
	m_pd3dDevice->SetRenderState(D3DRS_AMBIENT, D3DCOLOR_XRGB(255, 255, 255));
	

	return true;
}
void CGame::SetMaterial()
{
	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;
	m_pd3dDevice->SetMaterial( &mtrl );
}

//Loading 界面渲染
LRESULT CGame::RenderLoad(float fState)
{
	m_pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,0),1.0f,0);
	if( SUCCEEDED( m_pd3dDevice->BeginScene() ) )
	{
		//m_pCamera->Update2DMatrix();

		//登陆界面
		m_pGameLoadBG->setSize(1000,780);
		m_pGameLoadBG->MoveTo(0,0);
		m_pGameLoadBG->Render();
		m_p2DUI->InitUI();
		m_p2DUI->UpdataLoading(fState);
		m_pd3dDevice->EndScene();

	}

	m_pd3dDevice->Present( NULL, NULL, NULL, NULL );
	return S_OK;
}

bool CGame::InitGame(HWND hWnd, HINSTANCE hInst)
{
	m_hWnd = hWnd;
	this->RenderLoad(0.1f);
	//地图
	m_pTerrain = new CTerrain( m_pd3dDevice, D3DXVECTOR3(0,0,0) );
	m_pTerrain->Initialize( ".\\Terrain\\Terrain_128_RGB1.bmp", ".\\Terrain\\skin2.jpg", 100, 2000, 100 ); 
	//天空盒
	m_pSkyBox = new CSkyBox( m_pd3dDevice, 15 );
	m_pSkyBox->LoadSkyBox( ".\\Sky\\World.cfg", "Antarctic" );  
	//输入设备
	m_pInput = new CGInput( hInst, hWnd );
	//摄像机
	//m_pCamera = new CCamera( m_pd3dDevice, &D3DXVECTOR3(0,0,0) );
	m_CamToHero = m_pCamera->GetDistance();

	this->RenderLoad(0.3f);
	//蝴蝶
	m_pButterflyMesh1 = new Mesh(m_pd3dDevice);	
	m_pButterflyMesh1->InitMesh(m_pd3dDevice);
	m_pButterflyMesh1->SetPos(-1000.0f,25.0f,1110.0f);
	//粒子
	m_pParticle=new CParticleSystem(m_pd3dDevice,NULL) ;
	m_pParticle->LoadFromFile(".\\Game\\Particle.cfg","Fire");
	m_pParticle->SetPosition(&D3DXVECTOR3(-2215,41,960));
	//鼠标
	m_pCursor = new CCursor( m_pd3dDevice );
	m_pCamera->SetCursor( m_pCursor );

	this->RenderLoad(0.4f);
	//角色
	m_pRole = new CSkinMesh( m_pd3dDevice );
	m_pRole->LoadFromXFile( ".\\Role\\enemy2.X", 0.5f, 0.5f );
	m_pRole->SetAnimationName( "ready" ); 
	m_pRole->SetPosition( -1000.0f, 1.0f, 950.0f );
	m_pRole->m_vTarget = m_pRole->m_vPos;
	m_pRole->m_speed1 = 150.0f;		//移动速度
	m_pRole->m_speed2 = 150.0f;		//旋转速度
	m_pRole->m_MAXHP  = 600.0f;
	m_pRole->m_CURHP  = 600.0f;
	m_pRole->m_MAXMP  = 100.0f;
	m_pRole->m_CURMP  = 100.0f;
	m_pRole->n=1.0f;			

	//魔法阵
	m_pMagicZhen = new CSkinMesh( m_pd3dDevice );
	m_pMagicZhen->LoadFromXFile( ".\\magic.x", 0.5f, 0.5f );
//	m_pMagicZhen->SetPosition( -1000.0f, 1.0f, 950.0f );
	m_pMagicZhen->m_pXangle=-D3DX_PI/2;

	//怪物NPC
	const int nn = 4;
	m_pNpcNum = nn;
	//m_nLiveNum+=m_iNPCNum;
	m_presNpc.reserve(m_pNpcNum);
	for(i = 0; i < m_pNpcNum; i++)
	{
		m_presNpc[i] = new CNPC(m_pd3dDevice);
	}
	m_presNpc[0]->LoadFromXFile( ".//pig.x", 0.5f,0.5f );
	m_presNpc[1]->LoadFromXFile( ".//bear.x", 0.5f,0.5f );
	m_presNpc[2]->LoadFromXFile( ".//bloodelf.x", 0.5f,0.5f );
	m_presNpc[3]->LoadFromXFile( ".//golem.x", 0.5f,0.5f );

	struct Npc_Attribute npc_attribute[nn] = 
	{
		//	posx	posy	posz	  speed1	speed2	 maxhp	  curhp		maxmp	curmp	scale	n
		{D3DXVECTOR3(-1500.0f, 0.0f,  -405.0f),	60.0f,  30.0f,   200.0f,   200.0f,	50.0f,	50.0f,	0.8f, 1.5f},
		{D3DXVECTOR3(-1500.0f, 0.0f,  -100.0f),	80.0f,  30.0f,	   200.0f,  200.0f,	100.0f,	100.0f,	0.4f, 1.5f},
		{D3DXVECTOR3(-1835.0f, 8.0f,  -1170.0f), 100.0f,  30.0f,  200.0f,   200.0f,	150.0f,	150.0f,	0.4f, 1.5f},
		{D3DXVECTOR3(-1500.0f, 0.0f,  200.0f),   110.0f,  30.0f,  200.0f,   200.0f,	200.0f,	200.0f,	0.4f, 1.5f}
	};

	m_pattNPC = new Npc_Attribute[nn];
	for(i = 0; i < m_pNpcNum; i++)
	{
		m_presNpc[i]->m_vPos=m_pattNPC[i].m_vPos = m_presNpc[i]->m_vbornPos=npc_attribute[i].m_vPos;
		m_presNpc[i]->m_speed1=m_pattNPC[i].m_speed1 = npc_attribute[i].m_speed1;
		m_presNpc[i]->m_speed2=m_pattNPC[i].m_speed2 = npc_attribute[i].m_speed2;
		m_presNpc[i]->m_MAXHP=m_pattNPC[i].m_MAXHP = npc_attribute[i].m_MAXHP;
		m_presNpc[i]->m_CURHP=m_pattNPC[i].m_CURHP = npc_attribute[i].m_CURHP;
		m_presNpc[i]->m_MAXMP=m_pattNPC[i].m_MAXMP = npc_attribute[i].m_MAXMP;
		m_presNpc[i]->m_CURMP=m_pattNPC[i].m_CURMP = npc_attribute[i].m_CURMP;
		m_presNpc[i]->m_fScale=m_pattNPC[i].m_fScale = npc_attribute[i].m_fScale;
		m_presNpc[i]->n=m_pattNPC[i].n = npc_attribute[i].n;
		m_presNpc[i]->SetPosition(&m_presNpc[i]->m_vPos);
		m_presNpc[i]->SetAnimationName("stand");
	}


	//商店NPC
	m_pNpc = new CSkinMesh( m_pd3dDevice );
	m_pNpc->LoadFromXFile( ".\\NPC\\npc.x", 0.5f,0.5f );
	m_pNpc->m_fScale=0.05f;
	m_pNpc->SetAnimationName( "idle" );
	m_pNpc->SetPosition( -2180.0f,5.0f, 940.0f );

	this->RenderLoad(0.6f);
	
	//建筑物
	m_pTempler = new CMesh( m_pd3dDevice, ".\\Construct\\templer.X" );

	//树
	m_pTree1 = new CMesh( m_pd3dDevice, ".\\bigtree.X" );
	m_pTree2 = new CMesh( m_pd3dDevice, ".\\bigtree.X" );
	m_pTree3 = new CMesh( m_pd3dDevice, ".\\Construct\\tree_2.X" );

	//草
	m_pGrass = new CMesh( m_pd3dDevice, ".\\cao.X" );

	//火堆
	m_pFire = new CMesh( m_pd3dDevice, ".\\Construct\\fire.x");

	//水晶
	m_pCrystal = new CMesh(m_pd3dDevice, ".\\Construct\\Crystal.X");

	//死骨
	m_pBone = new CMesh(m_pd3dDevice, ".\\Construct\\dead_cow.X");

	//雕像
	m_pGlyph = new CMesh( m_pd3dDevice, ".\\Construct\\lotharstatue.x" );

	//创建阴影体
	m_pShadowVolume = new CShadowVolume();	
	m_pShadowVolume->Create(m_pd3dDevice, m_pGlyph->GetMesh());

	//魔法技能
	m_pMagicPoPo = new CParticleSystem(m_pd3dDevice, ".\\Game\\Flare.tga");

	this->RenderLoad(0.7f);

	//字体
	m_pFont = new CFont( m_pd3dDevice, "新宋体" );

	//游戏中2D UI
	m_pPanelRole = new CPanel( m_pd3dDevice, 210.0f, 80.0f,m_nScreenWidth, m_nScreenHeight);
	m_pPanelRole->SetTexture( ".\\UIimage\\HPMP1.tga", D3DCOLOR_XRGB(0, 0, 0) );

	m_pPanelEnemy = new CPanel( m_pd3dDevice, 210.0f, 80.0f,m_nScreenWidth, m_nScreenHeight );
	m_pPanelEnemy->SetTexture( ".\\UIimage\\HPMP.tga", D3DCOLOR_XRGB(0, 0, 0) );	

	m_pRoleHP =  new CPanel( m_pd3dDevice, 20.0f, 10.0f,m_nScreenWidth, m_nScreenHeight );
	m_pRoleHP->SetTexture( ".\\UIimage\\UI_PLAYER_LIFE.bmp", D3DCOLOR_XRGB(0, 0, 0) );

	m_pRoleMP =  new CPanel( m_pd3dDevice, 15.0f, 10.0f ,m_nScreenWidth, m_nScreenHeight);
	m_pRoleMP->SetTexture( ".\\UIimage\\UI_PLAYER_MAGIC.bmp", D3DCOLOR_XRGB(0, 0, 0) );

	m_pEnemyHP =  new CPanel( m_pd3dDevice, 20.0f, 10.0f ,m_nScreenWidth, m_nScreenHeight);
	m_pEnemyHP->SetTexture( ".\\UIimage\\UI_PLAYER_LIFE.bmp", D3DCOLOR_XRGB(0, 0, 0) );

	m_pEnemyMP =  new CPanel( m_pd3dDevice, 15.0f, 10.0f ,m_nScreenWidth, m_nScreenHeight);
	m_pEnemyMP->SetTexture( ".\\UIimage\\UI_PLAYER_MAGIC.bmp", D3DCOLOR_XRGB(0, 0, 0) );

	this->RenderLoad(0.8f);

	m_pMiNiMapBar = new CPanel( m_pd3dDevice, 265.0f, 265.0f,m_nScreenWidth, m_nScreenHeight,-1);
	m_pMiNiMapBar->SetTexture( ".\\UIimage\\minimapFrame.tga", D3DCOLOR_XRGB(0, 0, 0) );

	m_pJiNenglan = new CPanel( m_pd3dDevice,800.0f, 60.0f,m_nScreenWidth, m_nScreenHeight,-1);
	m_pJiNenglan->SetTexture( ".\\UIimage\\UI_PANEL_JNL.png", D3DCOLOR_XRGB(0, 0, 0) );

	m_pNpcBag = new CPanel( m_pd3dDevice,180.0f, 232.0f,m_nScreenWidth, m_nScreenHeight,-1);
	m_pNpcBag->SetTexture( ".\\UIimage\\Bag2.png", D3DCOLOR_XRGB(255, 255, 255) );

	m_pSmallMap =new  CSmallMap(m_pd3dDevice);
	m_pSmallMap->Inint();

	//游戏3DUI
	//m_p3DUI=new C3DUIManger(m_pd3dDevice,m_hWnd,m_pRole);
	//m_p3DUI->Init();

	this->RenderLoad(0.9f);

	InitRect(m_pd3dDevice);
	this->RenderLoad(1.0f);
	return true;
}
void CGame::InitRect(LPDIRECT3DDEVICE9 m_pd3dDevice)
{
	//填充矩形顶点缓冲区
	m_pd3dDevice->GetBackBuffer( 0, 0, D3DBACKBUFFER_TYPE_MONO, &m_pBackBuffer );
	m_pBackBuffer->GetDesc( &m_d3dsdBackBuffer );
	float sx = (float)m_d3dsdBackBuffer.Width;
	float sy = (float)m_d3dsdBackBuffer.Height;	
	SHADOWVERTEX v[]=
	{
		{0, sy, 0.0f,1.0f,0xd0000000},
		{0,  0, 0.0f,1.0f,0xd0000000},
		{sx, sy,0.0f,1.0f,0xd0000000},
		{sx,  0,0.0f,1.0f,0xd0000000},

	};

	//创建矩形顶点缓冲区
	m_pd3dDevice->CreateVertexBuffer( 4*sizeof(SHADOWVERTEX),
		D3DUSAGE_WRITEONLY, D3DFVF_CUSTOM_SHADOWVERTEX,
		D3DPOOL_MANAGED, &m_pBigSquareVB, NULL );

	VOID* pVertices;
	m_pBigSquareVB->Lock( 0, sizeof(v), (void**)&pVertices, 0 ) ;
	memcpy( pVertices, v, sizeof(v) );
	m_pBigSquareVB->Unlock();
}

bool CGame::IntersectTriangle( const D3DXVECTOR3& orig,const D3DXVECTOR3& dir, const D3DXVECTOR3& v0,
					   const D3DXVECTOR3& v1, const D3DXVECTOR3& v2,FLOAT* t, FLOAT* u, FLOAT* v )
{
	D3DXVECTOR3 edge1 = v1 - v0;
	D3DXVECTOR3 edge2 = v2 - v0;
	// Begin calculating determinant - also used to calculate U parameter
	//交点p=edge1*u+edge2*v;
	D3DXVECTOR3 pvec;
	D3DXVec3Cross( &pvec, &dir, &edge2 );	//|a×b|=|a||b|sinθ
	// 如果det接近0,表明射线平行于三角形
	FLOAT det = D3DXVec3Dot( &edge1, &pvec );	//|a dot b|=|a||b|cosθ	
	D3DXVECTOR3 tvec;
	if( det > 0 )
	{
		tvec = orig - v0;
	}
	else
	{	
		//方向相反
		tvec = v0 - orig;
		det = -det;
	}

⌨️ 快捷键说明

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