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