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


// CItem.h: interface for the CItem class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#ifndef CItem_h 
#define CItem_h 
 
 
#if _MSC_VER > 1000 
#pragma once 
#endif // _MSC_VER > 1000 
 
#include "CBaseSprite.h" 
#include "CES_CmdPool.h" 
#include "CPool.h" 
 
//物品的种类 
enum ITEM_TYPE 
{ 
	IT_ALL		= 0,				//所有种类 
 
//	具有随机属性的: 
	IT_ARMOR	= 1,				//衣服,装甲 
	IT_HAT		= 2,				//帽子 
	IT_SHOES	= 3,				//鞋子 
	IT_NECKLACE = 4,				//项链 
	IT_EARRING	= 5,				//耳环 
	IT_BANGLE	= 6,				//手镯 
	IT_RING		= 7,				//戒指 
	IT_AMULET	= 8,				//护身符 
	IT_WEAPON	= 9,				//武器 
	IT_SHIELD	= 10,				//盾牌 
 
//	具有固定属性的: 
	IT_DRUG		= 11, 
	IT_SPECIAL  = 12,				//特殊物品 
	IT_MAGE_CARD= 13,				//技能卡 
	IT_STONE	= 14,				//宝石 
	IT_TASK		= 15,				//任务物品 
	IT_GOLD		= 16,				//金币 
}; 
 
//物品的占位情况 
enum ITEM_HOLD_TYPE 
{ 
	IHT_1x1 = 0,					//一个格 
	IHT_2x2 = 1,					//2行2列 
	IHT_2x1	= 2,					//2行1列 
	IHT_1x2	= 3,					//1行2列 
	IHT_3x1	= 4,					//3行1列 
	IHT_3x2	= 5,					//3行2列 
}; 
 
//物品信息结构 
struct ITEM_INFO 
{ 
	ITEM_INFO(); 
	~ITEM_INFO(); 
	int GetWidth() { return m_GroundSurface->GetWidth();} 
	int GetHeight(){ return m_GroundSurface->GetHeight();} 
 
	bool operator == ( const ITEM_INFO &it ) 
	{ return memcmp( m_Name, it.m_Name, 32 ) == 0; } 
 
public: 
	ITEM_TYPE		m_ItemType;			//物品种类 
	ITEM_HOLD_TYPE	m_HoldType;			//占位方式 
	HERO_CLASS		m_HeroClass;		//职业限制 
	int				m_ItemLvl;			//物品的等级 
	int				m_ItemPrice;		//物品价值 
	int				m_ItemUseTime;		//可用次数 
 
	PSURFACE		m_BoxSurface;		//大箱子里的页面 
	PSURFACE		m_GroundSurface;	//在地上的页面 
 
	ES_CMD        *	m_CmdBuf;			//脚本命令数组(注意这里的脚本不能带字符串) 
	int				m_CmdNum;			//脚本命令数量 
 
	char		  * m_szInfoBuf;		//物品信息字符串 
	char			m_Name[32];			//物品名字 
}; 
 
//英雄物品结构 
struct HERO_ITEM 
{ 
	int	numCmd;					//属性个数 
	int	useTime;				//剩余使用次数 
	int	money;					//价格 
	RECT rect;					//包围盒 
	ITEM_HOLD_TYPE	holdType;	//占位方式 
}; 
 
//物品类 
class CItem : public CBaseSprite   
{ 
 
public: 
	CItem(); 
	~CItem(); 
	bool Init( ITEM_INFO *pInfo ); 
	bool Init( HERO_ITEM &heroItem ); 
 
	bool UpdateSprite(); 
	void DrawSprite(); 
 
	void DrawInBox( int box_x, int box_y ); 
	void DrawOnPick( int mx, int my ); 
 
	void OnDropDown( const POINT &base ); 
	void OnPickUp( int x, int y ); 
	void OnPickUp( const RECT &rcCell ); 
 
	ITEM_TYPE GetItemType() { return m_pItemInfo->m_ItemType; } 
	ITEM_HOLD_TYPE GetHoldType() { return m_pItemInfo->m_HoldType; } 
	ITEM_INFO *GetItemInfo() { return m_pItemInfo; } 
	void SetItemInfo( ITEM_INFO *pInfo ); 
 
	int GetItemLevel() { return m_pItemInfo->m_ItemLvl; } 
	HERO_CLASS GetHeroClass() { return m_pItemInfo->m_HeroClass; } 
 
	int GetNumAttribute() { return m_NumAttribute; } 
	int GetHalfWidth() { return m_pItemInfo->m_BoxSurface->GetWidth() >> 1;} 
	int GetHalfHeight(){ return m_pItemInfo->m_BoxSurface->GetHeight() >> 1;} 
	CES_CmdPool &GetCmdPool() { return m_CmdPool; } 
 
	int GetUseTime() { return m_UseTime; } 
	void SubUseTime() { m_UseTime--; m_Money = 1; } 
	bool OnUsed(); 
 
	void SetMoney( int n ) { m_Money = n; } 
	int GetMoney() { return m_Money; } 
	void AddPrice( int addValue ) { m_Money += addValue; } 
 
	void AddAttribute( const ES_CMD &cmd );		//增加附加属性 
 
private: 
	ITEM_INFO	*m_pItemInfo; 
	CES_CmdPool	m_CmdPool; 
	short		m_NumAttribute;		//附加属性数量 
	short		m_UseTime;			//使用次数 
	int			m_Money;			//如果是金钱,代表金钱数;否则代表物品价格 
}; 
 
//箱子种类 
enum BOX_TYPE 
{ 
	ITEM_BAG = 0,				//背包	 
	ITEM_TROUGH = 1,			//快捷使用栏 
	ITEM_EQUIPMENT = 2,			//装备栏 
	ITEM_STORAGE = 3,			//保管箱 
	ITEM_SHOP = 4,				//商店 
}; 
 
 
struct CELL_INFO				//装备栏的格子 
{ 
	RECT		m_Rect; 
	ITEM_TYPE	m_Type; 
	int			m_Hold;			//占位标志 
}; 
 
//////////////////////////////////////////////////////////////////////// 
//物品栏类 
//////////////////////////////////////////////////////////////////////// 
class CItemBox 
{ 
 
public: 
	CItemBox(); 
	~CItemBox(); 
 
	bool Init( int x, int y, int width, int height,  
				PSURFACE boxSurface, BOX_TYPE type ); 
	void Free(); 
 
	int	 HandleMouseMsg(); 
	void Draw(); 
 
	bool AddItem( CItem *pItem ); 
	void AddItem( CItem *pItem, int x, int y, ITEM_HOLD_TYPE holdType ); 
 
	BYTE GetCell( int row, int col ); 
	bool IsCellHold( int row, int col, ITEM_HOLD_TYPE HoldType ); 
	void HoldCell( int row, int col, ITEM_HOLD_TYPE HoldType, BYTE mask ); 
 
	void OpenBox() { m_IsOpen = true;} 
	void CloseBox(); 
	void MoveBox( int x, int y ); 
 
	void ChangeState() { m_IsOpen == true ? CloseBox() : OpenBox(); } 
 
	bool OnMouseDown(int mx, int my); 
	void OnMouseChange(); 
	void OnCloseEquipment(); 
 
	void UseItem( int row, int col ); 
 
	void EnableMouseMsg() { s_bMouseMsg = true; } 
 
	void SetCloseButtonRect( int l, int t, int r, int b ) 
	{ m_CloseButtonRect.left = l; m_CloseButtonRect.top = t; 
	  m_CloseButtonRect.right= r; m_CloseButtonRect.bottom=b;  
	} 
 
	int GetBoxWidth() { return m_BoxSurface->GetWidth(); } 
	int GetBoxHeight(){ return m_BoxSurface->GetHeight();} 
	bool IsOpen() { return m_IsOpen; } 
 
	bool UpdateEquipment( int rate );				//升级装备 
	bool AddItemAttribute( int index );				//为装备增加一项符加属性 
 
	CPool &GetItemPool() { return m_ItemPointerPool; } 
 
private: 
	void DeleteItemHelp( CItem *pItem ); 
	void UseItemHelp( CItem *pItem ); 
 
private: 
	BOX_TYPE	m_BoxType;				//箱子种类 
	int			m_Width; 
	int			m_Height;				//物品栏宽高,以格子为单位 
	RECT		m_Rect;					//在窗口客户区的RECT 
	POINT		m_MouseOffset;			//物品栏左上角与鼠标坐标的偏移 
	PSURFACE	m_BoxSurface;			//物品栏页面	 
	BYTE	  * m_CellArray;			//格子数组 
	bool		m_IsOpen;				//是否是打开状态 
	CItem	  * m_pCurSelItem;			//当前选择的物品 
	CPool	m_ItemPointerPool; 
 
	RECT		m_CloseButtonRect;		//关闭按钮的RECT 
	PSURFACE	m_MoneySurface;			//金钱页面 
 
	static CELL_INFO s_CellInfoArray[18];	//装备栏的格子信息数组 
	static CItem * s_pCurPickItem;		//当前拿起的物品 
	static bool	s_bMouseMsg;			//是否有鼠标消息	 
}; 
 
 
#endif