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 |