📄 game_game.cpp
字号:
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 + -