📄 gm_unit.cpp
字号:
// GM_Unit.cpp: implementation of the GM_Unit class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "GM_Unit.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
typedef std::map<KEY, CGsAnimation*> t_animation_map;
GM_Unit::GM_Unit(GM_World* pScene) : GM_Object(pScene)
{
m_dwActionTime = 0;
m_dwActionCount = 0;
m_tall_rate = 1.0f;
m_alpha = 1.0f;
m_degree_look_at = 0.0f;
m_ranged_radius = 0.0f;
m_melee_radius = 0.0f;
m_Flag = GSUNIT_NORMAL;
m_object_kind = GSOBJ_UNIT;
m_walk_speed = 70;
m_run_speed = 150;
// m_aim_unit = 0;
// m_lead_unit = 0;
// m_aim_station_x = 0;
// m_aim_station_y = 0;
m_ai_type = UNIT_AI_NONE;
}
GM_Unit::~GM_Unit()
{
}
VOID GM_Unit::GetPos(LONG& nX, LONG& nY)
{
nX = m_fPosX;
nY = m_fPosY;
}
VOID GM_Unit::AddAnimation(KEY key, CGsAnimation* pAni)
{
m_pAnimation = pAni;
// t_animation_map::iterator it = m_mapAni.find(key);
//
// if(it!=m_mapAni.end())
// {
// it->second = pAni;
// }
// else
// {
// m_mapAni.insert(t_animation_map::value_type(key, pAni));
// }
}
HRESULT GM_Unit::Render()
{
HRESULT hr;
LONG x, y;
m_pWorld->GetOriginal(x,y);
float rx = m_fPosX-x;
float ry = m_fPosY-y;
// float rw = 200*m_tall_rate;
// if(rx>-rw&&rx<rw+m_pWorld->GetViewWidthPix()
// &&ry>-rw&&ry<rw+m_pWorld->GetViewHeightPix())
{
if(m_pAnimation)
{
CGsTexture* pTex;
m_pWorld->GetGsEngine()->PreparePaint();
pTex = m_pAnimation->GetCurrentFrame();
if(pTex)
{
pTex->UpdateFromCache();
if(FAILED(hr = m_pWorld->GetGsEngine()->Render_PaintFast( rx, ry, pTex, m_fZbuf, m_tall_rate, m_tall_rate, m_current_alpha, m_color)))
return hr;
}
pTex = m_pAnimation->GetCurrentShadow();
if(pTex)
{
pTex->UpdateFromCache();
if(FAILED(hr = m_pWorld->GetGsEngine()->Render_PaintFast( m_FlatX-x, m_FlatY-y, pTex, m_fZbuf, m_tall_rate, m_tall_rate, m_current_alpha, m_color)))
return hr;
}
// if(pTex)
// if(FAILED(hr = m_pWorld->GetGsEngine()->Render_PaintFastFrame( rx, ry, pTex, false, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, m_fZbuf, m_tall_rate, m_tall_rate, m_current_alpha, m_color)))
// return hr;
// pTex = m_pAnimation->GetCurrentShadow();
// if(pTex)
// if(FAILED(hr = m_pWorld->GetGsEngine()->Render_PaintFastFrame( m_FlatX-x, m_FlatY-y, pTex, false, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, m_fZbuf, m_tall_rate, m_tall_rate, m_current_alpha, m_color)))
// return hr;
}
// m_particle_effect.Render(GPOINT(-x,-y));
}
return S_OK;
}
LONG GM_Unit::Update()
{
LONG nRet = 0;
if(m_pAnimation)
{
CGsAnimation* pAni = GetAnimation();
LONG ac = GM_Object::Update();
if(ac<0)
{
if(pAni==&m_ani_death)
{
m_Flag |= GSUNIT_DEATH;
nRet = DoDeath();
OnMove();
if(nRet==0)
goto exit;
return 0;
}
else if(pAni==&m_ani_begin_walk)
{
OnMove();
if(DoWalk()==0)
goto exit;
else if(DoEndWalk()==0)
goto exit;
}
else if(pAni==&m_ani_walk)
{
OnMove();
if(DoEndWalk()==0)
goto exit;
}
else if(pAni==&m_ani_melee)
{
OnMove();
if((ac&GSSPR_KEY_FRAME_MEET)!=GSSPR_KEY_FRAME_MEET)
{
goto exit;
}
}
else if(pAni==&m_ani_spell)
{
OnMove();
if((ac&GSSPR_KEY_FRAME_MEET)!=GSSPR_KEY_FRAME_MEET)
{
goto exit;
}
}
else if(pAni==&m_ani_ranged)
{
OnMove();
if((ac&GSSPR_KEY_FRAME_MEET)!=GSSPR_KEY_FRAME_MEET)
{
goto exit;
}
}
else if(pAni==&m_ani_flinch)
{
OnMove();
if((ac&GSSPR_KEY_FRAME_MEET)!=GSSPR_KEY_FRAME_MEET)
{
goto exit;
}
}
PlyWait();
}
else if(ac>0)
{
m_dwActionCount += ac;
if(pAni==&m_ani_walk)
{
OnMove();
}
else if(pAni==&m_ani_wait)
{
OnWait();
}
}
else
{
m_dwActionTime += m_pWorld->GetGsEngine()->m_dwPassTime;
// if(pAni==&m_ani_wait && m_dwActionTime>2000 && rnd()*100>80)
// nRet = DoFidget();
}
exit:
UpdateRoughPos();
m_fZbuf = 1.0f - m_FlatY/(float)m_pWorld->GetHeightPix();
if(m_fZbuf>1.0)
m_fZbuf=1.0f;
if(m_fZbuf<0)
m_fZbuf=0.0f;
}
// m_pWorld->PlaceObjectInPoint(this);
// GPOINT point(m_FlatX, m_FlatY);
// m_pWorld->GetGsEngine()->PickFlatGrid(point.x, point.y);
// if(is_point_in_rect( point, m_pWorld->GetGsEngine()->m_rcOriginalCell ))
// {
// m_bRender = true;
// }
// else
// {
// m_bRender = false;
// }
// HRESULT hr;
LONG x, y;
m_pWorld->GetOriginal(x,y);
float rx = m_fPosX-x;
float ry = m_fPosY-y;
float rw = 80*m_tall_rate;
float rh = 200*m_tall_rate;
if(rx>-rw&&rx<rw+m_pWorld->GetViewWidthPix()
&&ry>-rw&&ry<rh+m_pWorld->GetViewHeightPix())
{
if(m_bRender==FALSE)
{
OnChangeRenderFlag(TRUE);
}
m_bRender = TRUE;
m_bSelect = FALSE;
m_pWorld->PlaceObjectInPoint(this);
}
else
{
m_pAnimation->SetCurrentUse(FALSE);
if(m_bRender==TRUE)
{
OnChangeRenderFlag(FALSE);
}
m_bRender = FALSE;
}
return 0;
// m_pAnimation->Update(dwTime, 500);
}
void GM_Unit::SetRender(BOOL bRender)
{
if(bRender==TRUE)
{
if(m_bRender==FALSE)
{
OnChangeRenderFlag(TRUE);
}
m_bRender = TRUE;
m_bSelect = FALSE;
m_pWorld->PlaceObjectInPoint(this);
}
else
{
m_pAnimation->SetCurrentUse(FALSE);
if(m_bRender==TRUE)
{
OnChangeRenderFlag(FALSE);
}
m_bRender = FALSE;
}
}
void GM_Unit::PlyWalkTo(int x, int y)
{
m_dwActionTime = 0;
m_dwActionCount = 0;
if(m_ani_begin_walk.IsReady() && m_pAnimation!=&m_ani_walk && m_pAnimation!=&m_ani_end_walk)
{
// if(GetAnimation()==NULL || GetAnimation()!=&m_ani_begin_walk && GetAnimation()!=&m_ani_walk && GetAnimation()!=&m_ani_end_walk)
if(m_pAnimation==&m_ani_begin_walk)
{
RunSpriteMoveTo(x, y, m_walk_speed, TRUE, GSANI_FRAME_NOCHANGE, 1);
}
else
{
SetSprite(&m_ani_begin_walk);
RunSpriteMoveTo(x, y, m_walk_speed, TRUE, 0, 1);
}
}
else
{
DoWalk();
if(m_pAnimation==&m_ani_walk)
RunSpriteMoveTo(x, y, m_walk_speed, TRUE, GSANI_FRAME_NOCHANGE, GSANI_ACT_COUNT_LOOP);
else
RunSpriteMoveTo(x, y, m_walk_speed, TRUE, GSANI_FRAME_NOCHANGE, 1);
// if(GetAnimation()!=&m_ani_walk)
// SetSprite(&m_ani_walk);
//
// RunSpriteMoveTo(x, y, m_walk_speed, GSANI_FRAME_NOCHANGE, GSANI_ACT_COUNT_LOOP);
}
// DoTestHit();
// for(int i=0; i<m_apSprite.size(); i++)
// m_apSprite[i]->RunSpriteMoveTo();
}
VOID GM_Unit::PlyWalk(float degree, int act_count)
{
if(GetAnimation()!=&m_ani_walk)
{
m_dwActionTime = 0;
m_dwActionCount = 0;
SetSprite(&m_ani_walk);
}
RunSpriteMove(degree, m_walk_speed, TRUE, GSANI_FRAME_NOCHANGE, act_count);
// DoTestHit();
}
VOID GM_Unit::PlyMeleeTo(int x, int y, int act_count)
{
m_dwActionTime = 0;
m_dwActionCount = 0;
if(GetAnimation()==&m_ani_melee)
{
// m_apSprite[0]->AddActionCount(act_count);
return;
}
SetSprite(&m_ani_melee);
SetFaceToPoint(x-m_FlatX, y-m_FlatY);
RunSpriteWait(0, act_count);
}
VOID GM_Unit::PlyRanged(LONG posX, LONG posY)
{
if(!m_ani_ranged.IsReady())
return;
m_dwActionTime = 0;
m_dwActionCount = 0;
if(GetAnimation()==&m_ani_ranged)
{
// m_apSprite[0]->AddActionCount(act_count);
return;
}
SetSprite(&m_ani_ranged);
SetFaceToPoint(posX-m_FlatX, posY-m_FlatY);
RunSpriteWait(0, 1);
}
VOID GM_Unit::PlyDeath()
{
SetSprite(&m_ani_death);
RunSpriteWait(0,1);
}
VOID GM_Unit::PlyWait()
{
if(m_ani_wait.IsReady())
{
m_dwActionTime = 0;
m_dwActionCount = 0;
SetSprite(&m_ani_wait);
RunSpriteWait(GSANI_FRAME_NOCHANGE,GSANI_ACT_COUNT_LOOP);
}
else
{
}
}
VOID GM_Unit::PlyFidget()
{
if(m_ani_fidget.IsReady())
{
m_dwActionTime = 0;
m_dwActionCount = 0;
SetSprite(&m_ani_fidget);
RunSpriteWait(0,1);
}
else
{
PlyWait();
}
}
VOID GM_Unit::PlyFlinch()
{
if(m_ani_flinch.IsReady())
{
m_dwActionTime = 0;
m_dwActionCount = 0;
SetSprite(&m_ani_flinch);
RunSpriteWait(0,1);
//RunSparkGSCM(GSCM_PASTELS);
}
else
{
}
}
VOID GM_Unit::PlySpell(int x, int y, const char *spell)
{
m_dwActionTime = 0;
m_dwActionCount = 0;
if(m_ani_flinch.IsReady())
SetSprite(&m_ani_spell);
else if(m_ani_melee.IsReady())
SetSprite(&m_ani_melee);
SetFaceToPoint(x-m_FlatX, y-m_FlatY);
RunSpriteWait(0,1);
// RunSparkGSCM(GSCM_PASTELS);
// if(rnd()>0.5f)
// m_pWorld->GetGsEngine()->TriggerThunderPoint(x,y);
// else
// {
// CGsMissile* pSpell = new CGsMissile(m_pWorld->GetGsEngine(), this, NULL);
// pSpell->CreateFromProfile("spell\\fireball.ini");
// pSpell->PlyCastPoint(x, y, 0);
// }
}
VOID GM_Unit::SetEyeshot(float fEyeshot)
{
if(fEyeshot<m_pWorld->GetCellWidth())
{
fEyeshot = m_pWorld->GetCellWidth();
}
m_eyeshot_x = fEyeshot;
m_eyeshot_y = fEyeshot*m_pWorld->GetCellHeight()/m_pWorld->GetCellWidth()/2.0f;
}
BOOL GM_Unit::TestEyeshot(LONG nX, LONG nY)
{
m_pWorld->GridCenter(nX,nY);
float a = (m_FlatX-nX)/m_eyeshot_x;
float b = (m_FlatY-nY)/m_eyeshot_y;
return (a*a + b*b <= 1);
}
BOOL GM_Unit::TestEyeshot(GM_Object* pObject)
{
assert(NULL!=pObject);
LONG nX = pObject->m_gridX;
LONG nY = pObject->m_gridY;
m_pWorld->GridCenter(nX,nY);
float a = (m_FlatX-nX)/(m_eyeshot_x+pObject->m_seize_x);
float b = (m_FlatY-nY)/(m_eyeshot_y+pObject->m_seize_y);
return (a*a + b*b <= 1);
}
BOOL GM_Unit::Create(ID id, const char *szFile, float x, float y, float h)
{
CConfig inifile;//(szFile);
if(m_pWorld==NULL || m_pWorld->GetGsEngine()==NULL || !m_pWorld->GetGsEngine()->LoadConfig(inifile, szFile))
return FALSE;
Cleanup();
GM_Object::Create(id, szFile, x,y,h);
// m_FlatX = inifile.GetLong("position","pos_x");
// m_FlatY = inifile.GetLong("position","pos_y");
// m_fHeight = inifile.GetFloat("position","pos_h");
float fvalue;
fvalue = inifile.GetFloat("radius","eyeshot");
SetEyeshot(fvalue);
fvalue = inifile.GetFloat("radius","seize");
SetSeize(fvalue);
m_melee_radius = inifile.GetFloat("radius","melee");
m_ranged_radius = inifile.GetFloat("radius","ranged");
m_walk_speed = inifile.GetFloat("speed","walk");
m_run_speed = inifile.GetFloat("speed","run");
m_tall_rate = inifile.GetFloat("rate","tall");
m_alpha = inifile.GetFloat("rate","alpha");
m_sex = inifile.GetLong("main","sex");
m_degree_look_at = inifile.GetFloat("direction","look_at");
char str[200];
//melee
inifile.GetString(str, 200, "resource", "melee" );
if(str[0]!=0)
{
m_ani_melee.SetGsEngine(m_pWorld->GetGsEngine());
m_ani_melee.Create(str);
//m_ani_melee.SetCache();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -