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

📄 game_hero.cpp

📁 自己写的一个D3D游戏Dome。实现了基本的游戏功能
💻 CPP
📖 第 1 页 / 共 2 页
字号:
				float y=m_pGame_SkinMesh->GetYaw(*m_pGame_SkinMesh->GetPosition(),m_mouseCross);
				m_pGame_SkinMesh->m_fAngle=y;
				m_pGame_SkinMesh->m_destpoint=m_mouseCross;
				m_pGame_SkinMesh->m_MouseMove=true;
				m_bMousShow=true;
			}
			//D3DXVECTOR3 vMin,vMax;
			//vMin=m_pGame_SkinMesh->m_vMin;
			//vMax=m_pGame_SkinMesh->m_vMax;
			//BookSeller->m_pMesh->GetBoundingBox(&vMin,&vMax);
			for(vector<Game_EnemyNpc*>::iterator i=g_sGlobal.g_pGameApp->m_Game_EnemyNpc.begin();
				i!=g_sGlobal.g_pGameApp->m_Game_EnemyNpc.end();
				i++){
					Pick_Game_EnemyNpc(pt,(*i));
			}
			//Pick_Game_QuietMesh(pt,BookSeller);
		}
	}

	m_pGame_SkinMesh->Turn(dSide);
	m_pGame_SkinMesh->WalkFoward(dForward,m_pGame_Terrain);

	for(vector<Game_QuietMesh*>::iterator i=g_sGlobal.g_pGameApp->m_Game_QuietMesh.begin();
		i!=g_sGlobal.g_pGameApp->m_Game_QuietMesh.end();
		i++){
		if (CollisionTestAABB((*i))){
			m_pGame_SkinMesh->Back();
			m_pGame_SkinMesh->m_MouseMove=false;
			run=true;

			//if(BookSeller->m_pMesh->m_bThings){
			//	for(int i=0;i<5;i++){
			//		Shop[i]->m_pInterface->m_bShow=true;
			//	}
			//	for(int i=0;i<6;i++){
			//		Bag[i]->m_pInterface->m_bShow=true;
			//	}
			//	BookSeller->m_pMesh->m_bThings=false;
			//}
		}
	}
		
	//for(vector<Game_EnemyNpc*>::iterator i=g_sGlobal.g_pGameApp->m_Game_EnemyNpc.begin();
	//	i!=g_sGlobal.g_pGameApp->m_Game_EnemyNpc.end();
	//	i++){
	//		m_pGame_SkinMesh->Back();
	//		m_pGame_SkinMesh->m_MouseMove=false;
	//}

	g_sGlobal.g_pGameApp->m_pGame_Camera->SetLookAt(&(*m_pGame_SkinMesh->GetPosition()+D3DXVECTOR3(0,40,0)));

	return S_OK;
}

//碰撞不带骨骼MESH
LRESULT Game_Hero::CollisionTestAABB(Game_QuietMesh * pGame_QuietMesh){
	D3DXVECTOR3 A1,A2;
	D3DXVECTOR3 B1,B2;
	m_pGame_SkinMesh->GetBoundingBox(&A1,&A2);  
	pGame_QuietMesh->m_pMesh->GetBoundingBox(&B1,&B2);

	return (A1.x<B2.x && A2.x>B1.x
		&& A1.y<B2.y && A2.y>B1.y
		&& A1.z<B2.z && A2.z>B1.z);		
}
//碰撞不带骨骼MESH
LRESULT Game_Hero::CollisionTestAABB(Game_EnemyNpc * pGame_EnemyNpc){
	D3DXVECTOR3 A1,A2;
	D3DXVECTOR3 B1,B2;
	m_pGame_SkinMesh->GetBoundingBox(&A1,&A2);  
	pGame_EnemyNpc->m_pGame_SkinMesh->GetBoundingBox(&B1,&B2);

	return (A1.x<B2.x && A2.x>B1.x
		&& A1.y<B2.y && A2.y>B1.y
		&& A1.z<B2.z && A2.z>B1.z);		
}

BOOL Game_Hero::Pick_Game_Terrain(POINT p){
	RECT rc;
	int iWidth,iHeight;
	GetClientRect(g_sGlobal.g_hwnd,&rc);
	iWidth = rc.right - rc.left;
	iHeight = rc.bottom - rc.top;

	D3DXMATRIX   matWorld, matView, pmatProj, m;
	D3DXVECTOR3  vPickRayOrig, vPickRayDir;
	D3DXVECTOR3 vPickDir,vPickOrig;

	//获取当前设备的变换矩阵
	g_sGlobal.g_pDevice->GetTransform( D3DTS_WORLD, &matWorld );
	g_sGlobal.g_pDevice->GetTransform( D3DTS_VIEW, &matView );
	g_sGlobal.g_pDevice->GetTransform( D3DTS_PROJECTION, &pmatProj );
	//D3DXMatrixIdentity(&matWorld);
	//计算世界观察矩阵的逆矩阵
	D3DXMATRIX mWorldView =( m_pGame_Terrain->m_matWorld) * matView;
	//D3DXMATRIX mWorldView =(*g_sGlobal.g_pGameApp->m_pGame_Camera->GetViewMatrix()) * matView;
	D3DXMatrixInverse(&m,NULL,&mWorldView);

	//计算拾取射线的方向与原点

	//方向,x(-1,1),y(-1,1),z(0,1)
	D3DXVECTOR3 vTemp;
	vTemp.x =  ((( 2.0f * p.x ) / iWidth  ) - 1 ) / pmatProj._11;
	vTemp.y = -((( 2.0f * p.y ) / iHeight ) - 1 ) / pmatProj._22;
	vTemp.z =  1.0f;

	vPickRayDir.x  = vTemp.x*m._11 + vTemp.y*m._21 + vTemp.z*m._31;
	vPickRayDir.y  = vTemp.x*m._12 + vTemp.y*m._22 + vTemp.z*m._32;
	vPickRayDir.z  = vTemp.x*m._13 + vTemp.y*m._23 + vTemp.z*m._33;

	vPickDir = vPickRayDir;

	//射线原点
	vPickRayOrig.x = m._41;
	vPickRayOrig.y = m._42;
	vPickRayOrig.z = m._43;

	vPickOrig = vPickRayOrig;

	DWORD indexFace;
	FLOAT u,v;
	BOOL hit;
	D3DXIntersect(m_pGame_Terrain->m_pMesh,&vPickRayOrig,&vPickRayDir,&hit,&indexFace,&u,&v,NULL,NULL,NULL);
	m_indexFace=indexFace;
	m_u=u;
	m_v=v;

	return hit;
}

BOOL Game_Hero::Pick_Game_QuietMesh(POINT p,Game_QuietMesh*pGame_QuietMesh){
	RECT rc;
	int iWidth,iHeight;
	GetClientRect(g_sGlobal.g_hwnd,&rc);
	iWidth = rc.right - rc.left;
	iHeight = rc.bottom - rc.top;

	D3DXMATRIX   matWorld, matView, pmatProj, m;
	D3DXVECTOR3  vPickRayOrig, vPickRayDir;
	D3DXVECTOR3 vPickDir,vPickOrig;

	//获取当前设备的变换矩阵
	g_sGlobal.g_pDevice->GetTransform( D3DTS_WORLD, &matWorld );
	g_sGlobal.g_pDevice->GetTransform( D3DTS_VIEW, &matView );
	g_sGlobal.g_pDevice->GetTransform( D3DTS_PROJECTION, &pmatProj );
	//D3DXMatrixIdentity(&matWorld);
	//计算世界观察矩阵的逆矩阵
	D3DXMATRIX mWorldView =( pGame_QuietMesh->m_pMesh->m_matWorld) * matView;
	//D3DXMATRIX mWorldView =(*g_sGlobal.g_pGameApp->m_pGame_Camera->GetViewMatrix()) * matView;
	D3DXMatrixInverse(&m,NULL,&mWorldView);

	//计算拾取射线的方向与原点

	//方向,x(-1,1),y(-1,1),z(0,1)
	D3DXVECTOR3 vTemp;
	vTemp.x =  ((( 2.0f * p.x ) / iWidth  ) - 1 ) / pmatProj._11;
	vTemp.y = -((( 2.0f * p.y ) / iHeight ) - 1 ) / pmatProj._22;
	vTemp.z =  1.0f;

	vPickRayDir.x  = vTemp.x*m._11 + vTemp.y*m._21 + vTemp.z*m._31;
	vPickRayDir.y  = vTemp.x*m._12 + vTemp.y*m._22 + vTemp.z*m._32;
	vPickRayDir.z  = vTemp.x*m._13 + vTemp.y*m._23 + vTemp.z*m._33;

	vPickDir = vPickRayDir;

	//射线原点
	vPickRayOrig.x = m._41;
	vPickRayOrig.y = m._42;
	vPickRayOrig.z = m._43;

	vPickOrig = vPickRayOrig;

	BOOL hit;
	D3DXIntersect(pGame_QuietMesh->m_pMesh->m_pMesh,&vPickRayOrig,&vPickRayDir,&hit,NULL,NULL,NULL,NULL,NULL,NULL);
	if(hit){
		pGame_QuietMesh->m_pMesh->m_bThings=true;
	}

	return hit;
}

//拾取动态网格
BOOL Game_Hero::Pick_Game_EnemyNpc(POINT p,Game_EnemyNpc*pGame_EnemyNpc){
	RECT rc;
	int iWidth,iHeight;
	GetClientRect(g_sGlobal.g_hwnd,&rc);
	iWidth = rc.right - rc.left;
	iHeight = rc.bottom - rc.top;

	D3DXMATRIX   matWorld, matView, pmatProj, m;
	D3DXVECTOR3  vPickRayOrig, vPickRayDir;
	D3DXVECTOR3 vPickDir,vPickOrig;

	//获取当前设备的变换矩阵
	g_sGlobal.g_pDevice->GetTransform( D3DTS_WORLD, &matWorld );
	g_sGlobal.g_pDevice->GetTransform( D3DTS_VIEW, &matView );
	g_sGlobal.g_pDevice->GetTransform( D3DTS_PROJECTION, &pmatProj );
	//D3DXMatrixIdentity(&matWorld);
	//计算世界观察矩阵的逆矩阵
	D3DXMATRIX mWorldView =(pGame_EnemyNpc->m_pGame_SkinMesh->m_matWorld) * matView;
	//D3DXMATRIX mWorldView =(*g_sGlobal.g_pGameApp->m_pGame_Camera->GetViewMatrix()) * matView;
	D3DXMatrixInverse(&m,NULL,&mWorldView);

	//计算拾取射线的方向与原点

	//方向,x(-1,1),y(-1,1),z(0,1)
	D3DXVECTOR3 vTemp;
	vTemp.x =  ((( 2.0f * p.x ) / iWidth  ) - 1 ) / pmatProj._11;
	vTemp.y = -((( 2.0f * p.y ) / iHeight ) - 1 ) / pmatProj._22;
	vTemp.z =  1.0f;

	vPickRayDir.x  = vTemp.x*m._11 + vTemp.y*m._21 + vTemp.z*m._31;
	vPickRayDir.y  = vTemp.x*m._12 + vTemp.y*m._22 + vTemp.z*m._32;
	vPickRayDir.z  = vTemp.x*m._13 + vTemp.y*m._23 + vTemp.z*m._33;

	vPickDir = vPickRayDir;

	//射线原点
	vPickRayOrig.x = m._41;
	vPickRayOrig.y = m._42;
	vPickRayOrig.z = m._43;

	vPickOrig = vPickRayOrig;

	BOOL hit;

	D3DXIntersect(pGame_EnemyNpc->m_pGame_SkinMesh->m_pAABBMesh,&vPickRayOrig,&vPickRayDir,&hit,NULL,NULL,NULL,NULL,NULL,NULL);
	if(hit){
		//D3DXVECTOR3 vMin,vMax;
		//vMin=pGame_EnemyNpc->m_pGame_SkinMesh->m_vMin;
		//vMax=pGame_EnemyNpc->m_pGame_SkinMesh->m_vMax;
		//pGame_EnemyNpc->m_pGame_SkinMesh->GetBoundingBox(&vMin,&vMax);
		//m_mouseCross.y=pGame_EnemyNpc->m_pGame_SkinMesh->m_vMax.y;
		m_mouseCross.x=pGame_EnemyNpc->m_pGame_SkinMesh->m_vPos.x;
		m_mouseCross.z=pGame_EnemyNpc->m_pGame_SkinMesh->m_vPos.z;
	}

	return hit;
}

⌨️ 快捷键说明

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