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

📄 gm_unit.cpp

📁 混乱竞技场的全套代码,客户端资源可以网上搜
💻 CPP
📖 第 1 页 / 共 2 页
字号:
  // 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 + -