📄 gm_unit.cpp
字号:
}
//ranged
inifile.GetString(str, 200, "resource", "ranged" );
if(str[0]!=0)
{
m_ani_ranged.SetGsEngine(m_pWorld->GetGsEngine());
m_ani_ranged.Create(str);
//m_ani_ranged.SetCache();
}
//spell
inifile.GetString(str, 200, "resource", "spell" );
if(str[0]!=0)
{
m_ani_spell.SetGsEngine(m_pWorld->GetGsEngine());
m_ani_spell.Create(str);
//m_ani_spell.SetCache();
}
//block
inifile.GetString(str, 200, "resource", "block" );
if(str[0]!=0)
{
m_ani_block.SetGsEngine(m_pWorld->GetGsEngine());
m_ani_block.Create(str);
//m_ani_block.SetCache();
}
//flinch
inifile.GetString(str, 200, "resource", "flinch" );
if(str[0]!=0)
{
m_ani_flinch.SetGsEngine(m_pWorld->GetGsEngine());
m_ani_flinch.Create(str);
//m_ani_flinch.SetCache();
}
//fidget
inifile.GetString(str, 200, "resource", "fidget" );
if(str[0]!=0)
{
m_ani_fidget.SetGsEngine(m_pWorld->GetGsEngine());
m_ani_fidget.Create(str);
//m_ani_fidget.SetCache();
}
//begin_walk
inifile.GetString(str, 200, "resource", "begin_walk" );
if(str[0]!=0)
{
m_ani_begin_walk.SetGsEngine(m_pWorld->GetGsEngine());
m_ani_begin_walk.Create(str);
//m_ani_begin_walk.SetCache();
}
//end_walk
inifile.GetString(str, 200, "resource", "end_walk" );
if(str[0]!=0)
{
m_ani_end_walk.SetGsEngine(m_pWorld->GetGsEngine());
m_ani_end_walk.Create(str);
//m_ani_end_walk.SetCache();
}
//walk
inifile.GetString(str, 200, "resource", "walk" );
if(str[0]!=0)
{
m_ani_walk.SetGsEngine(m_pWorld->GetGsEngine());
m_ani_walk.Create(str);
//m_ani_walk.SetCache();
}
//run
inifile.GetString(str, 200, "resource", "run" );
if(str[0]!=0)
{
m_ani_run.SetGsEngine(m_pWorld->GetGsEngine());
m_ani_run.Create(str);
//m_ani_run.SetCache();
}
//wait
inifile.GetString(str, 200, "resource", "wait" );
if(str[0]!=0)
{
m_ani_wait.SetGsEngine(m_pWorld->GetGsEngine());
m_ani_wait.Create(str);
//m_ani_wait.SetCache();
}
//death
inifile.GetString(str, 200, "resource", "death" );
if(str[0]!=0)
{
m_ani_death.SetGsEngine(m_pWorld->GetGsEngine());
m_ani_death.Create(str);
//m_ani_death.SetCache();
}
//death
inifile.GetString(str, 200, "resource", "arrow" );
if(str[0]!=0)
{
m_ani_arrow.SetGsEngine(m_pWorld->GetGsEngine());
m_ani_arrow.Create(str);
//m_ani_death.SetCache();
}
SetSprite(m_FlatX, m_FlatY, m_fHeight, &m_ani_wait);
SetFaceToAngle(m_degree_look_at, 0);
RunSpriteWait();
m_bRender = FALSE;
return TRUE;
}
/*
BOOL GM_Unit::CreateFromUnit(GM_Unit *pUnit, int x, int y, float h, float eyeshot, float seize, float tall, float face_to_degree )
{
Cleanup();
m_FlatX = x;
m_FlatY = y;
m_fHeight = h;
m_melee_radius = pUnit->m_melee_radius;
m_ranged_radius = pUnit->m_ranged_radius;
UpdateRoughPos();
if(eyeshot==0)
eyeshot = pUnit->m_eyeshot_x;
SetEyeshot(eyeshot);
if(seize==0)
seize = pUnit->m_seize_x;
SetSeize(seize);
if(tall<=0)
tall = pUnit->m_tall_rate;
m_tall_rate = tall;
m_alpha = 1.0f;
m_degree_look_at = face_to_degree;
m_walk_speed = pUnit->m_walk_speed;
m_run_speed = pUnit->m_run_speed;
if(pUnit->&m_ani_melee)
{
&m_ani_melee = pUnit->&m_ani_melee;
&m_ani_melee->AddUser();
}
if(pUnit->&m_ani_ranged)
{
&m_ani_ranged = pUnit->&m_ani_ranged;
&m_ani_ranged->AddUser();
}
if(pUnit->&m_ani_spell)
{
&m_ani_spell = pUnit->&m_ani_spell;
&m_ani_spell->AddUser();
}
if(pUnit->&m_ani_block)
{
&m_ani_block = pUnit->&m_ani_block;
&m_ani_block->AddUser();
}
if(pUnit->&m_ani_flinch)
{
&m_ani_flinch = pUnit->&m_ani_flinch;
&m_ani_flinch->AddUser();
}
if(pUnit->&m_ani_fidget)
{
&m_ani_fidget = pUnit->&m_ani_fidget;
&m_ani_fidget->AddUser();
}
if(pUnit->&m_ani_begin_walk)
{
&m_ani_begin_walk = pUnit->&m_ani_begin_walk;
&m_ani_begin_walk->AddUser();
}
if(pUnit->&m_ani_end_walk)
{
&m_ani_end_walk = pUnit->&m_ani_end_walk;
&m_ani_end_walk->AddUser();
}
if(pUnit->&m_ani_walk)
{
&m_ani_walk = pUnit->&m_ani_walk;
&m_ani_walk->AddUser();
}
if(pUnit->&m_ani_run)
{
&m_ani_run = pUnit->&m_ani_run;
&m_ani_run->AddUser();
}
if(pUnit->&m_ani_wait)
{
&m_ani_wait = pUnit->&m_ani_wait;
&m_ani_wait->AddUser();
}
if(pUnit->&m_ani_death)
{
&m_ani_death = pUnit->&m_ani_death;
&m_ani_death->AddUser();
}
&m_ani_death = NULL;
CGsSprite* pSprite = new CGsSprite;
pSprite->SetSprite(m_FlatX, m_FlatY, m_fHeight, &m_ani_wait, 1000);
pSprite->SetFaceToAngle(m_degree_look_at, 0, GSANI_ACT_COUNT_LOOP);
pSprite->RunSpriteWait();
m_apSprite.push_back(pSprite);
return true;
}
*/
VOID GM_Unit::Cleanup()
{
}
LONG GM_Unit::DoEndWalk()
{
if(m_ani_end_walk.IsReady())
{
SetArriveMeet();
SetSprite(&m_ani_end_walk);
RunSpriteWait( 0, 1);
return 0;
}
else
{
return -1;
}
}
LONG GM_Unit::DoWalk()
{
if(m_ani_walk.IsReady())
{
SetSprite(&m_ani_walk);
RunSprite( GSANI_FRAME_NOCHANGE, GSANI_ACT_COUNT_LOOP);
return 0;
}
else
{
return -1;//DoEndWalk();
}
}
LONG GM_Unit::DoDeath()
{
if(m_alpha>0)
{
m_alpha -= 0.1f*m_pWorld->GetGsEngine()->m_dwPassTime/5000.0f;
return 0;
}
else
{
return -1;
}
}
VOID GM_Unit::OnWait()
{
}
VOID GM_Unit::OnMove()
{
}
BOOL GM_Unit::CanMelee()
{
if(m_ani_melee.IsReady())
return true;
else
return false;
}
BOOL GM_Unit::CanRanged()
{
if(m_ani_ranged.IsReady() && m_ranged_radius>0.0f)
return true;
else
return false;
}
VOID GM_Unit::RunAI()
{
//碰撞检测
DoTestHit();
/*
GM_Unit* ptr_unit_aim = (GM_Unit*)m_pWorld->GetObject(m_aim_unit);
GM_Unit* ptr_unit_lead = (GM_Unit*)m_pWorld->GetObject(m_lead_unit);
if(ptr_unit_aim)
{
ptr_unit_aim;
if(TestRange(m_melee_radius, ptr_unit_aim))
{
if(CanMelee())//可以攻击
{
PlyMeleeTo(ptr_unit_aim->m_FlatX, ptr_unit_aim->m_FlatY, 1);
return;
}
else
{//逃跑
//PlyWalkTo((m_fPosX-m_pUnitEnemy->m_fPosX));
}
}
if(TestRange(m_ranged_radius, ptr_unit_aim))
{
if(CanRanged())//可以射击
{
PlyRanged(ptr_unit_aim->m_fPosX, ptr_unit_aim->m_fPosY-60);
//GS_Magic_ChainLighting* pChainLighting = new GS_Magic_ChainLighting(m_pScene, this, m_pUnitEnemy);
//pChainLighting->PlyCast();
return;
}
}
}
if(ptr_unit_aim)
{
//if(TestEyeshot(m_pUnitEnemy))
{//在视野范围内
if(CanMelee() || CanRanged())
{//靠近目标
PlyWalkTo(ptr_unit_aim->m_FlatX, ptr_unit_aim->m_FlatY);
DoTestHit();
}
}
//else
{//目标逃掉了
// m_pUnitEnemy = NULL;
// RunAI();
}
}
else
{//寻找目标
OBJ_MAP map;
m_pWorld->GetRangeDirectionObject(map, m_FlatX, m_FlatY, m_eyeshot_x, this);
OBJ_MAP::iterator it = map.begin();
while(it!=map.end())
{
if(it->second->IsUnit())
{
GM_Unit* pUnit = (GM_Unit*)it->second;
if((m_relation[pUnit->m_force] & GSRELATION_BASE) == GSRELATION_ENEMY)
{
ptr_unit_aim = pUnit;
m_aim_unit = ptr_unit_aim->GetID();
break;
}
}
it++;
}
map.clear();
}
switch(m_ai_type)
{
case UNIT_AI_NONE:
{
}
break;
case UNIT_AI_PASSIVE:
{
}
break;
case UNIT_AI_WARLIKE:
{
}
break;
default:
}
*/
}
VOID GM_Unit::DoTestHit()
{
//CGsAnimation* pAni = m_apSprite[0]->GetAnimation();
if(IsMoveing())
{
OBJ_MAP map;
m_pWorld->GetRangeAngleObject(map, m_FlatX, m_FlatY, m_seize_x, this);
if(map.size()!=0)
{
OBJ_MAP::iterator it = map.begin();
float fa = D3DXToRadian(GetFaceToDegree());
float fmin = fa;
float fmax = fa+const_2_PI;
while(it!=map.end())
{
float fb = const_PI_DIV_2 + it->first;
float fc = const_2_PI + it->first - const_PI_DIV_2;
if(fc<fmin)
{
fb += const_2_PI;
fc += const_2_PI;
}
else if(fb>fmax)
{
fb -= const_2_PI;
fc -= const_2_PI;
}
if(fmin < fb)
fmin = fb;
if(fmax > fc)
{
fmax = fc;
}
if(fmax<fmin)
{
PlyWait();
map.clear();
return;
}
//if(it->second->IsUnit())
//{
// GM_Unit* pUnit = (GM_Unit*)it->second;
//}
it++;
}
map.clear();
if(fmin - fa > fa + const_2_PI - fmax)
{
PlyWalk(D3DXToDegree(fmax));
}
else
{
PlyWalk(D3DXToDegree(fmin));
}
}
}
}
BOOL GM_Unit::IsWaiting()
{
if(m_pAnimation)
{
if(m_pAnimation==&m_ani_wait)
return TRUE;
}
return FALSE;
}
BOOL GM_Unit::is_death()
{
return m_pAnimation==&m_ani_death;
}
BOOL GM_Unit::is_melee()
{
return m_pAnimation==&m_ani_melee;
}
BOOL GM_Unit::is_fidget()
{
return m_pAnimation==&m_ani_fidget;
}
BOOL GM_Unit::is_wait()
{
return m_pAnimation==&m_ani_wait;
}
BOOL GM_Unit::is_flinch()
{
return m_pAnimation==&m_ani_flinch;
}
BOOL GM_Unit::is_walk()
{
return (m_pAnimation==&m_ani_walk||m_pAnimation==&m_ani_begin_walk||m_pAnimation==&m_ani_end_walk);
}
BOOL GM_Unit::is_ranged()
{
return m_pAnimation==&m_ani_ranged;
}
BOOL GM_Unit::is_spell()
{
return m_pAnimation==&m_ani_spell;
}
BOOL GM_Unit::is_block()
{
return m_pAnimation==&m_ani_block;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -