www.pudn.com > GameEngine_src.rar > CAliveSprite.h


#ifndef CAliveSprite_h 
#define CAliveSprite_h 
 
 
#include "CBaseSprite.h" 
 
 
class CMagic; 
 
 
//活动精灵的EPG 
struct ALIVE_SPRITE_EPG 
{ 
	union  
	{ 
		CPictureGroup *pPG; 
		int	NameIndex;			//在EPG未载入完成时,保存EPG名字的索引 
	}; 
	CPictureGroup *pSPG; 
}; 
 
//活动精灵的全部EPG 
struct AS_EPG_ARRAY 
{ 
	int GetLastFrame( int state )  
	{  
		return epg_array[state].pPG->GetFramePerDirection()-1; 
	} 
 
	int GetMiddleFrame( int state ) 
	{ 
		return epg_array[state].pPG->GetFramePerDirection() >> 1; 
	} 
 
	void Free() 
	{ 
		for ( int i = 0; i < 7; ++i ) 
		{ 
			epg_array[i].pPG->Free(); 
			epg_array[i].pPG = NULL; 
			epg_array[i].pSPG->Free(); 
			epg_array[i].pSPG= NULL; 
		} 
	} 
 
public: 
	union  
	{ 
		struct  
		{  
			ALIVE_SPRITE_EPG  epg_wait; 
			ALIVE_SPRITE_EPG  epg_idle; 
			ALIVE_SPRITE_EPG  epg_walk; 
			ALIVE_SPRITE_EPG  epg_hurt; 
			ALIVE_SPRITE_EPG  epg_dead; 
			ALIVE_SPRITE_EPG  epg_melee; 
			ALIVE_SPRITE_EPG  epg_spell; 
		}; 
		ALIVE_SPRITE_EPG  epg_array[7]; 
	}; 
}; 
 
//活动精灵的声音 
struct AS_SOUND_ARRAY 
{ 
	union { 
		struct { 
			PEASYSOUND walkSound; 
			PEASYSOUND hurtSound; 
			PEASYSOUND deadSound; 
			PEASYSOUND meleeSound; 
			PEASYSOUND spellSound; 
		}; 
		struct { 
			int walk_sound_id; 
			int hurt_sound_id; 
			int dead_sound_id; 
			int melee_sound_id; 
			int spell_sound_id; 
		}; 
		PEASYSOUND  asSound[5]; 
		int			soundId[5]; 
	}; 
}; 
 
////////////////////////////////////////////////////////////// 
//活动精灵基本属性 
////////////////////////////////////////////////////////////// 
struct AS_BASE_INFO 
{ 
	int		m_Xp;						//经验 
 
	union { 
		struct {  
			short	m_Level;					//等级 
			short	m_MaxLife;					//最大生命值 
			short	m_MaxMana;					//最大魔法值 
			short	m_Strength;					//力量 
			short	m_Agility;					//敏捷 
			short	m_Intelligence;				//智力 
			short	m_PoisonResistance;			//毒抗	 
			short	m_CurseResistance;			//诅抗 
			short	m_FireResistance;			//火抗 
			short	m_ColdResistance;			//水抗 
			short	m_ThunderResistance;		//电抗 
			short	m_Rev;						//保留 
		}; 
		short baseInfo[12]; 
		int	  IntInfo[6]; 
	}; 
}; 
 
////////////////////////////////////////////////////////////// 
//附加属性 
////////////////////////////////////////////////////////////// 
struct AS_PLUS_INFO 
{ 
	union { 
		struct { 
			short	m_Mana;				//魔法值	//1 
			short	m_Damage;			//物理伤害	//2 
			short	m_Armor;			//防御		//3 
			short	m_Resistance;		//回避率	//4 
			short	m_Accuracy;			//命中率	//5 
			short	m_Speed;			//速度 
			short	m_AddLife;			//生命恢复值 
			short	m_AddMana;			//魔法恢复值 
		}; 
		short plusInfo[8]; 
	}; 
}; 
 
/////////////////////////////////////////////////////////////// 
//活动精灵的魔法共用体 
/////////////////////////////////////////////////////////////// 
union AS_MAGIC 
{ 
	int magicID; 
	CMagic *pMagic; 
}; 
 
/////////////////////////////////////////////////////////////// 
//怪物种类结构,描述一种怪物的属性 
/////////////////////////////////////////////////////////////// 
struct MONSTER_CLASS 
{ 
	PSURFACE		NameSurface;	//名字页面 
	AS_EPG_ARRAY	EPGArray;		//动画指针数组 
	AS_SOUND_ARRAY	SoundArray;		//声音指针数组 
	AS_BASE_INFO	SpriteInfo;		//基本属性结构 
 
	AS_MAGIC	  *	MagicIDArray;	//魔法ID数组 
	int				NumMagic;		//魔法个数 
	int				MaxHeight;		//最大高度值,用于绘制名字和血条 
 
public: 
	MONSTER_CLASS(); 
	~MONSTER_CLASS(); 
}; 
 
/////////////////////////////////////////////////////////////// 
//有生命的精灵类,包括所有的怪物,人物,NPC 
//这一类精灵,一定有阴影 
/////////////////////////////////////////////////////////////// 
class CAliveSprite : public CBaseSprite 
{ 
public: 
	enum { NUM_PG = 7 }; 
 
	CAliveSprite(); 
	~CAliveSprite(); 
 
	bool Init( MONSTER_CLASS *pClass, const POINT &base, SPRITE_TYPE SpriteType ); 
	void Free(); 
 
	void DrawSprite(); 
	bool UpdateSprite(); 
	void DrawShadow(); 
 
	int GetDirection() { return m_Direction; } 
 
	int GetClassIndex() { return m_ClassIndex;} 
	void SetClassIndex(int i) {m_ClassIndex = i;} 
 
	bool SetState( enum SPRITE_STATE state ); 
	SPRITE_STATE GetState() { return m_State; } 
 
	void SetDirection( int i ) { m_Direction = i; } 
	void SetEnemy( CAliveSprite *enemy ) { m_pEnemy = enemy; } 
	void SetMagic( CMagic * pMagic ) { m_pMagic = pMagic; } 
 
	void Hurt( int damage, CAliveSprite *enemy );				//受到攻击 
	void MagicHurt( int magicClass, int damage, CAliveSprite *enemy ); 
 
	bool IsWalking() { return m_State == SS_WALK; } 
	bool IsWaiting() { return m_State == SS_WAIT; } 
	bool GetPath( CELL &dest ); 
	bool GetPath( const POINT &p ); 
 
	void GetNextDirection( const POINT &next ); 
	inline int GetRandomNum(int size); 
 
	int	GetInfo( int index );				//获取一项属性值 
	void AddInfo( int index, int value );	//改变一项属性值 
 
	void AddMagicState( MAGIC_STATE &ms ) { m_MagicStateArray.Add(ms); } 
	void AddMSE( MAGIC_STATE_EPG &mse ) { m_MSEArray.Add(mse); } 
	void DrawMSE(); 
	void ClearMagicState();					//删除所有魔法状态 
 
	void CalcInfo(); 
	void CalcMonsterInfo(); 
 
protected: 
	MONSTER_CLASS  *m_pClass;				//怪物种类指针 
	AS_PLUS_INFO	m_PlusInfo; 
 
	int				m_ClassIndex;			//怪物种类的索引 
	int				m_pg_frame;				//当前动画帧,控件PG动画的帧,而非逻辑帧 
	int				m_move_frame;			//移动帧,行走状态下的精灵在这一帧改变基点坐标 
	int				m_Direction;			//精灵逻辑方向(共8个方向,X正方向为1,然后顺时针类推) 
	int				m_Distance; 
	unsigned int	m_LastTime;				//上一次加血,加魔时间 
	SPRITE_STATE	m_State;				//精灵的状态			 
	CStaticStack	m_PathStack;	//精灵的行走路径 
	CELL			m_NextCell;				//下一步的地图坐标,单位像素 
	 
	CAliveSprite *  m_pEnemy;				//敌人指针 
	CMagic		  *	m_pMagic;				//一次攻击中所使用的魔法 
	 
	CDynamicArray	m_MagicStateArray;	//魔法状态数组 
	CDynamicArray	m_MSEArray;		//魔法状态动画数组 
}; 
 
 
#endif