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

📄 game_game.cpp

📁 我做的毕业设计
💻 CPP
📖 第 1 页 / 共 3 页
字号:

	if( det < 0.0001f )
		return FALSE;

	*u = D3DXVec3Dot( &tvec, &pvec );

	if( *u < 0.0f || *u > det )
		return FALSE; 

	D3DXVECTOR3 qvec;
	D3DXVec3Cross( &qvec, &tvec, &edge1 );

	*v = D3DXVec3Dot( &dir, &qvec );
	if( *v < 0.0f || *u + *v > det )
		return FALSE;

	*t = D3DXVec3Dot( &edge2, &qvec );
	FLOAT fInvDet = 1.0f / det;
	*t *= fInvDet;
	*u *= fInvDet;
	*v *= fInvDet;
	if(*t<0) 
		return false;
	return true;
};

//得到交点坐标的世界坐标
D3DXVECTOR3 CGame::GetMouseWorldPos(const D3DXVECTOR3& vPickRayOrig, const D3DXVECTOR3& vPickRayDir, float t)
{
	D3DXVECTOR3 IntersectPoint;
	//地形本地坐标系的交点坐标
	IntersectPoint = vPickRayOrig + vPickRayDir*t;
	//交点世界坐标
	D3DXVec3TransformCoord(&IntersectPoint, &IntersectPoint, &(m_pTerrain->m_matWorld));
	return IntersectPoint;
}
//鼠标拾取地面
bool CGame::PickTerrainMesh(CTerrain *m_pTerrain)
{	
		D3DXVECTOR3 vPickRayDir;//拾取光线方向
		D3DXVECTOR3 vPickRayOrig;//拾取光线起点
		m_pCamera->GetRayOrigDirFormTerrain(&vPickRayOrig, &vPickRayDir, m_pTerrain);
		BOOL bHit = false;
		DWORD dwFace;
		FLOAT fBary1, fBary2, fDist;
		D3DXIntersect(m_pTerrain->m_pMesh, &vPickRayOrig, &vPickRayDir, &bHit, 
			&dwFace, &fBary1, &fBary2, &fDist, NULL, NULL);
		if (bHit)
		{
			m_vPickRayOrig =vPickRayOrig;
			m_vPickRayDir=vPickRayDir;
			m_CamToTer=fDist;
			return true;
		}
		else
		return false;
}
//拾取建筑物
bool CGame::PickNodeMesh(CMesh *p_CMesh)
{	
	if(!m_pRole->m_isdead)
	{
		D3DXVECTOR3 vPickRayDir;//拾取光线方向
		D3DXVECTOR3 vPickRayOrig;//拾取光线起点
		m_pCamera->GetRayOrigDirFormMesh(&vPickRayOrig, &vPickRayDir, p_CMesh);
		BOOL bHit = false;
		DWORD dwFace;
		FLOAT fBary1, fBary2, fDist;
		D3DXIntersect(p_CMesh->m_pMesh, &vPickRayOrig, &vPickRayDir, &bHit, 
			&dwFace, &fBary1, &fBary2, &fDist, NULL, NULL);
		if (bHit)
		{
			m_pCursor->SetState(CURSOR_STOP);
			return true;
		}
		else
			m_pCursor->SetState(CURSOR_NORMAL);
	}
	return false;
}

//拾取SkinMesh
bool CGame::PickSkinMesh(CSkinMesh *p_SkinMesh)
{
	D3DXVECTOR3 vPickRayDir;//拾取光线方向
	D3DXVECTOR3 vPickRayOrig;//拾取光线起点
	D3DXVECTOR3 vMin;
	D3DXVECTOR3 vMax;
	m_pCamera->GetRayOrigDir(&vPickRayOrig, &vPickRayDir);
	p_SkinMesh->GetBoundingBox(&vMin, &vMax);
	D3DXVECTOR3 v1,v2,v3,v4,v5,v6,v7,v8;
	v1 = D3DXVECTOR3(vMin.x, vMax.y, vMax.z);	//上表面
	v2 = D3DXVECTOR3(vMax.x, vMax.y, vMax.z);
	v3 = D3DXVECTOR3(vMax.x, vMax.y, vMin.z);
	v4 = D3DXVECTOR3(vMin.x, vMax.y, vMin.z);

	v5 = D3DXVECTOR3(vMin.x, vMin.y, vMax.z);	//下表面
	v6 = D3DXVECTOR3(vMax.x, vMin.y, vMax.z);
	v7 = D3DXVECTOR3(vMax.x, vMin.y, vMin.z);
	v8 = D3DXVECTOR3(vMin.x, vMin.y, vMin.z);

	FLOAT u,v,t;
	if(IntersectTriangle(vPickRayOrig, vPickRayDir, v1, v2, v3, &t, &u, &v))
	{
		return true;
	}
	else if(IntersectTriangle(vPickRayOrig, vPickRayDir, v1, v3, v4, &t, &u, &v))
	{
		return true;
	}
	else if(IntersectTriangle(vPickRayOrig, vPickRayDir, v4, v3, v7, &t, &u, &v))
	{
		return true;
	}
	else if(IntersectTriangle(vPickRayOrig, vPickRayDir, v4, v7, v8, &t, &u, &v))
	{
		return true;
	}
	else if(IntersectTriangle(vPickRayOrig, vPickRayDir, v3, v2, v6, &t, &u, &v))
	{
		return true;
	}
	else if(IntersectTriangle(vPickRayOrig, vPickRayDir, v3, v6, v7, &t, &u, &v))
	{
		return true;
	}
	else if(IntersectTriangle(vPickRayOrig, vPickRayDir, v2, v1, v5, &t, &u, &v))
	{
		return true;
	}
	else if(IntersectTriangle(vPickRayOrig, vPickRayDir, v2, v5, v6, &t, &u, &v))
	{
		return true;
	}
	else if(IntersectTriangle(vPickRayOrig, vPickRayDir, v1, v4, v8, &t, &u, &v))
	{
		return true;
	}
	else if(IntersectTriangle(vPickRayOrig, vPickRayDir, v1, v8, v5, &t, &u, &v))
	{
		return true;
	}
	else
	{
		return false;
	}
}
bool CGame::RenderText(float m_tFrameTime)
{
	char *strInf[]=
	{
		"[F1] 线填充",
		"[F2] 取消线填充",
		"[F3] 显示AABB盒",	
		"[F4] 取消显示AABB盒",
		"[R]  跑",
		"[E]  走",
	};
	for(int i=0; i<6; i++)
	{	
		m_pFont->RenderFont(strInf[i], 0, i*20+300, 0xFF0000FF);
	}	
	static char str[256];	
	sprintf(str, " X: %0.0f  Y: %0.0f  Z: %0.0f", (m_pRole->m_vPos).x,(m_pRole->m_vPos).y,(m_pRole->m_vPos).z);
	m_pFont->RenderFont(str, 0, 160, 0xFF0000FF);

	char strInf2[64];
	static float FPS=0;
	if(m_tFrameTime!=0) 	FPS=FPS*0.95f+0.05f/m_tFrameTime;
	sprintf(strInf2," FPS:%0.2f",FPS);
	m_pFont->RenderFont(strInf2, 0, 120, 0xFFFF0000);
	return true;
}
//处理游戏中的所有碰撞
bool CGame::ProcessCollision()
{
	bool collision =  false;
	//与怪物碰撞检测
	for(i = 0; i < m_pNpcNum; i++)
	{
		if(m_pRole->CollisionTestAABB(m_presNpc[i])&&!m_presNpc[i]->m_isdead)
		{
			m_pRole->Back();									//如果产生碰撞就退回
			collision = true;
		}
	}
	//是否与宫殿碰撞
	if(m_pRole->CollisionTestAABB(m_pTempler,0.9f))
	{
		m_pRole->Back();
		collision = true;
	}
	//是否与雕像碰撞
	if(m_pRole->CollisionTestAABB(m_pGlyph,0.6f))
	{
		m_pRole->Back();
		collision = true;
	}
	//是否与树1碰撞
	if(m_pRole->CollisionTestAABB(m_pTree1,0.15f))
	{
		m_pRole->Back();
		collision = true;
	}
	//是否与树2碰撞
	if(m_pRole->CollisionTestAABB(m_pTree2,0.15f))
	{
		m_pRole->Back();
		collision = true;
	}
	//是否与树3碰撞
	if(m_pRole->CollisionTestAABB(m_pTree3,0.3f))
	{
		m_pRole->Back();
		collision = true;
	}
	//是否与火堆碰撞
	if(m_pRole->CollisionTestAABB(m_pFire,0.5f))
	{
		m_pRole->Back();
		collision = true;
	}
	//是否与死骨碰撞
	if(m_pRole->CollisionTestAABB(m_pBone,0.5f))
	{
		m_pRole->Back();
		collision = true;
	}
	//是否与NPC碰撞
	if(m_pRole->CollisionTestAABB(m_pNpc))
	{
		m_pRole->Back();
		collision = true;
	}
	if(collision)
		return true;
	else 
		return false;
}

bool CGame::FrameStart(float m_tFrameTime)
{		
	m_pInput->Update();								//更新键盘鼠标状态

	int nDirect = 0;     							//n = 1表示前后移动	
	float fYaw = 0, fPitch = 0;
	float dForward = 0, dSide = 0;
	static bool list=false;
	static Key_b=false;
	static float time;

	if(m_pRole->m_isdead)
	{
		m_pRole->m_isAttacking = false;
		static int Roledeadtime = 0;
		Roledeadtime++;
		if(Roledeadtime >= 500)
		{					
			m_pRole->m_CURHP = m_pRole->m_MAXHP;
			m_pRole->m_CURMP = m_pRole->m_MAXMP;
			m_pRole->SetAnimationName("wait");
			//设置位置
			m_pRole->SetPosition(0.0f, 1.0f, 0.0f);
			Roledeadtime = 0;
			m_pRole->m_isAttacking = false;
			m_pRole->m_isdead = false;
		}
	}
	else 
	{
		if( m_pRole->m_bLoop || ( !m_pRole->m_bLoop && m_pRole->m_bMoving == false ) )
		{
			m_pRole->m_bMoving = true;
			if(m_pRole->m_isAttacking && !m_pRole->m_isdead)
				m_pRole->SetAnimationName("attack");
			else
				m_pRole->SetAnimationName("wait");
		}
	}
	
	//主角没行动时旋转
	if(!m_pRole->m_isMoving && !m_pRole->m_isdead)
	{
		//通过键盘来控制主角
		if(0x80 & m_pInput->GetIsKeyDown(DIK_W)&&m_pRole->GetPosition().y<500.0f)		//人物行进
		{		
			if(m_IsWalk)
			{
				m_pRole->m_speed1 = 50.0f;
				m_pRole->SetAnimationName("walk"); 
			}
			else
			{
				m_pRole->SetAnimationName("run"); 
				m_pRole->m_speed1 = 120.0f;
			}
			dForward += m_pRole->m_speed1*m_tFrameTime;
			nDirect = 1;
			m_pRole->m_isAttacking = false;
		}
		else if(0x80 & m_pInput->GetIsKeyDown(DIK_S))
		{
			if(m_IsWalk)
			{
				m_pRole->SetAnimationName("walk"); 
				m_pRole->m_speed1 = 50.0f;
			}
			else
			{
				m_pRole->SetAnimationName("run"); 
				m_pRole->m_speed1 = 120.0f;
			}
			dForward -= m_pRole->m_speed1*m_tFrameTime;
			nDirect = 1;
			m_pRole->m_isAttacking = false;
		}	
	
		if(0x80 & m_pInput->GetIsKeyDown(DIK_A))			//左右旋转
			dSide -= 2*m_pRole->m_speed2*m_tFrameTime;
		else if(0x80 & m_pInput->GetIsKeyDown(DIK_D))
			dSide += 2*m_pRole->m_speed2*m_tFrameTime;
		dSide *= 60 * m_tFrameTime * D3DX_PI / 360;			//按一次转0.25弧度,大约15度

		if(m_pInput->GetIsKeyDown(MK_RIGHT))
		{
			fYaw = m_pInput->GetLX()*0.2f*D3DX_PI/180;
			fPitch = m_pInput->GetLY()*0.2f*D3DX_PI/180;
			m_pCamera->YawPitchAt(fYaw,fPitch);  
			m_pRole->Turn(fYaw+dSide);						//人物随摄像机一起旋转
			m_pCursor->m_oldPos = m_pCursor->GetPosition();
			m_isMouseDown = true;
			m_pRole->m_isAttacking = false;
		}
		else
		{
			m_pRole->Turn(dSide);
			m_pRole->m_isAttacking = false;
		}
	}
	else if(m_pInput->GetIsKeyDown(MK_RIGHT) && !m_pRole->m_isdead)  	//主角行动时旋转
	{
		fYaw = m_pInput->GetLX()*0.2f*D3DX_PI/180;
		fPitch = m_pInput->GetLY()*0.2f*D3DX_PI/180;
		m_pCamera->YawPitchAt(fYaw,fPitch);  		
		m_pCursor->m_oldPos = m_pCursor->GetPosition();
		m_isMouseDown = true;
		m_pRole->m_isAttacking = false;
	}
	//if(m_pInput->GetIsKeyDown(MK_RIGHT)& 0x80)
	//{
	//	static POINT	pt;
	//	GetCursorPos( &pt );
	//	ScreenToClient(this->m_hWnd ,&pt);
	//	//float x=0,y=0;
	//	if (m_p3DUI->IsPointIn(pt.x,pt.y))
	//	{
	//		if(m_p3DUI->corrent!=NULL&&m_p3DUI->corrent->p!=NULL)
	//			m_p3DUI->corrent->p(m_pRole);
	//		if (m_p3DUI->corrent!=NULL&&m_p3DUI->corrent->del)
	//		{
	//			delete (m_p3DUI->corrent);
	//			m_p3DUI->corrent=NULL;
	//		}
	//	}
	//}
	//if(m_pInput->GetIsKeyDown(MK_LEFT))
	//{
	//	//l=true;
	//	//m_pRoleMesh->m_isAttacking=false;
	//	static POINT	pt;
	//	//D3DXVECTOR3 mouseCross,temp;;
	//	//float dist=8000,td;
	//	GetCursorPos( &pt );
	//	//ScreenToClient(this->m_hWnd ,&pt);
	//	if (m_p3DUI->m_bIs||m_p3DUI->IsPointIn(pt.x,pt.y))
	//	{
	//		m_p3DUI->Moveto((float)pt.x,(float)pt.y);
	//	}
	//}
	//镜头缩放
	m_pCamera->MoveRelative(0, m_pInput->GetLZ()/10.0f);	//滚轮	
	if(m_pCamera->GetDistance()<m_CamToHero-50)		//控制摄像机在一定范围
		m_pCamera->SetDistance(m_CamToHero-50);
	else if(m_pCamera->GetDistance()>m_CamToHero+250)
		m_pCamera->SetDistance(m_CamToHero+250);

	//按键处理
	if(m_pInput->GetIsKeyDown(DIK_F1) & 0x80)
	{
		m_pd3dDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_WIREFRAME);
	}
	else if(m_pInput->GetIsKeyDown(DIK_F2) & 0x80)
	{
		m_pd3dDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_SOLID);
	}
	else if(m_pInput->GetIsKeyDown(DIK_F3) & 0x80)
	{	
		m_IsAABB = true;									//显示AABB盒
	}
	else if(m_pInput->GetIsKeyDown(DIK_F4) & 0x80)
	{	
		m_IsAABB = false;									//不显示AABB盒
	}
	else if(m_pInput->GetIsKeyDown(DIK_R) & 0x80)//跑
	{
		m_IsWalk =!m_IsWalk;		
	}
	else if(m_pInput->GetIsKeyDown(DIK_E) & 0x80)//走
	{
		m_IsWalk = true;
	}

	//拾取地形和建筑物
	if( !Attack())
	{	
		if (PickTerrainMesh( m_pTerrain))
		{
			m_pRole->m_isAttacking = false;
			//m_pRole->m_isSkill2ing = false;
			//m_pRole->m_isSkill1ing = false;
			if(m_pInput->GetIsKeyDown(MK_LEFT))
			{
				m_bBag=false;
				for(i = 0; i < m_pNpcNum; i++)
				{
					m_presNpc[i]->m_IsEnemyHPMP = false;
				}
				m_pRole->m_isAttacking = false;
			}
			if(m_pCursor->GetState() == CURSOR_NORMAL && m_pInput->GetIsKeyDown(MK_LEFT) 
				&& !m_pRole->m_isdead)
			{
				m_IntersectPoint = GetMouseWorldPos( m_vPickRayOrig, m_vPickRayDir, m_CamToTer );
				m_pRole->m_vTarget = m_IntersectPoint;
				if(m_IntersectPoint.y < 5500.0f)
				{
					m_pRole->m_isMoving = true;
					m_pRole->m_vTarget = m_IntersectPoint;
					fYaw = m_pRole->GetYaw( m_IntersectPoint,m_pRole->GetPosition());
					m_pRole->m_fAngle = fYaw;
				}	
				else
				{	m_pRole->m_isMoving =false;
					m_pCursor->SetState(CURSOR_STOP);
				}
			}
		}
		if (PickNodeMesh(m_pTempler))
		{
			m_pCursor->SetState(CURSOR_STOP);
			if(m_pInput->GetIsKeyDown(MK_LEFT))
			{
				m_bBag=false;
				for(i = 0; i < m_pNpcNum; i++)
				{
					m_presNpc[i]->m_IsEnemyHPMP = false;
				}
				m_pRole->m_isAttacking = false;
			}
		}
	}

	//拾取商店NPC
	if( PickSkinMesh(m_pNpc))
	{
		m_pCursor->SetState(CURSOR_SPEAK);
		if(m_pInput->GetIsKeyDown(MK_LEFT))
		{
			//m_pNpcBag->MoveTo(200,100);
			//m_pNpcBag->Render();
			m_bBag=true;
		}
	}
	

	for(i = 0; i < m_pNpcNum; i++)
	{
		//拾取怪物
		if( PickSkinMesh(m_presNpc[i]))
		{
			m_pCursor->SetState(CURSOR_ATTACK);
			if(m_pInput->GetIsKeyDown(MK_LEFT))
			{
				m_presNpc[i]->m_IsEnemyHPMP = true;
				m_presNpc[i]->m_selectAttack=true;
				m_pRole->m_isAttacking = false;
				m_MagicPos=m_pRole->m_vTarget = m_presNpc[i]->m_vPos;
				m_pRole->m_fAngle = m_pRole->GetYaw(m_presNpc[i]->m_vPos, m_pRole->m_vPos);
				m_i=i;
			}			
			if( m_pInput->GetIsKeyDown(MK_RIGHT) )
			{
				m_presNpc[i]->m_IsEnemyHPMP = true;
				//m_presNpc[i]->m_isAttacking=true;
				m_pRole->m_isMoving = true;
				m_pRole->m_isAttacking = true;			
				m_MagicPos=m_pRole->m_vTarget = m_presNpc[i]->m_vPos;
				m_pRole->m_fAngle = m_pRole->GetYaw(m_presNpc[i]->m_vPos, m_pRole->m_vPos);	
				m_i=i;
			}
			//鼠标右键开始攻击
			if( m_pRole->m_isAttacking && (m_pRole->DistanceOfTwoVec3(m_pRole->m_vPos, m_presNpc[i]->m_vPos) <= 50.0f)
				&& (m_pInput->GetIsKeyDown(MK_RIGHT)))
			{
				m_pRole->m_isMoving = false;
				m_pRole->m_fAngle = m_pRole->GetYaw(m_presNpc[i]->m_vPos, m_pRole->m_vPos);
				m_presNpc[i]->m_CURHP -= 0.1f;
				if(m_presNpc[i]->m_CURHP <= 0.0f)
				{
					if( m_presNpc[i]->m_bLoop )
					{	
						m_presNpc[i]->SetAnimationName( "die" );
					}
					//if(m_presNpc[i]->IsAnimEnd(m_tFrameTime))
					//{
					//	m_presNpc[i]->SetAnim(false);
					//}
					m_presNpc[i]->m_isdead = true;
					m_pRole->m_isAttacking = false;
				}		
			}	
		}	
	}

	if(m_pMagicPoPo->m_dwAttackNum)
	{
		m_presNpc[m_i]->m_CURHP -= m_pMagicPoPo->m_dwAttackNum * 10.0f;
		m_pMagicPoPo->m_dwAttackNum = 0;
		if(m_presNpc[m_i]->m_CURHP <= 0.0f)
		{
			if( m_presNpc[m_i]->m_bLoop)
			{	
				m_presNpc[m_i]->SetAnimationName( "die" );
			}
			if(m_presNpc[m_i]->IsAnimEnd(m_tFrameTime))
			{
				m_presNpc[m_i]->SetAnim(false);
			}
			m_presNpc[m_i]->m_isdead = true;
		}
	}
	for(i = 0; i < m_pNpcNum; i++)
	{
		if(m_presNpc[i]->m_CURHP <= 0.0f)
		{
			m_presNpc[i]->SetAnimationName( "die" );
			m_presNpc[i]->m_isdead = true;
			m_pRole->m_isAttacking = false;
		}

⌨️ 快捷键说明

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