ActionButton的处理流程 天龙packet

什么破博客,,,崩溃了就要重写也不带自动保存

参考http://blog.csdn.net/butwang/archive/2011/02/15/6185631.aspx

 
  
function Packet_OnUpdateShow()

szPacketName
= " base " ;

while i < j do
local theAction,bLocked = PlayerPackage:EnumItem(szPacketName, i - 1 );
PACKAGE_BUTTONS[k]:SetProperty(
" DragAcceptName " , " P " .. tostring (i));
-- PushDebugMessage("packet index= " .. k.. " pos="..i);
if theAction:GetID() ~= 0 then
PACKAGE_BUTTONS[k]:SetActionItem(theAction:GetID());
itemnum
= itemnum + 1 ;
else
PACKAGE_BUTTONS[k]:SetActionItem(
- 1 );
end

通过PlayerPackage:EnumItem的第二个参数 i-1获得index 在map里查表 得到second为

  这部分的理解见之前luaplus的帖子

 
  
INT PlayerPackage::EnumItem(LuaPlus::LuaState * state)
{
const static STRING s_strBaseName = " base " ; // 基本物品 0-19
const static STRING s_strMaterialName = " material " ; // 材料物品 20-39
const static STRING s_strQuestName = " quest " ; // 任务物品 40-59

LuaStack args(state);

// 检查参数
if ( ! (args[ 2 ].IsString()))
{
KLThrow(
" LUA: PlayerPackage::EnumItem Wrong Param1 " );
}
if ( ! (args[ 3 ].IsInteger()))
{
KLThrow(
" LUA: PlayerPackage::EnumItem Wrong Param2 " );
}

STRING strPakageType
= args[ 2 ].GetString();
INT nIndex
= args[ 3 ].GetInteger();

// 查询物品
INT nOffIndex = - 1 ;
if (strPakageType == s_strBaseName)
{
nOffIndex
= BASE_CONTAINER_OFFSET;
}
else if (strPakageType == s_strMaterialName)
{
nOffIndex
= MAT_CONTAINER_OFFSET;
}
else if (strPakageType == s_strQuestName)
{
nOffIndex
= TASK_CONTAINER_OFFSET;
}

if (nOffIndex >= 0 )
{
tActionItem
* pActionItem = CActionSystem::GetMe() -> EnumAction(nIndex + nOffIndex, 
NAMETYPE_PACKAGEITEM);
if (pActionItem)
{
LuaObject objReturn
= state->BoxPointer(pActionItem);
objReturn.SetMetaTable(
*CActionItem::s_pMetaTable);
objReturn.PushStack();

if(((tObject_Item*)pActionItem->GetImpl())->IsLocked())
state
->PushInteger(1);
else
state
->PushInteger(0);
return 2 ;
}
}

// 非法ActionItem
LuaObject objReturn = state -> BoxPointer( & (CActionItem::s_InvalidAction));
objReturn.SetMetaTable(
* CActionItem::s_pMetaTable);
objReturn.PushStack();


state
-> PushInteger( 0 );
return 2 ;
}
 
  
tActionItem * CActionSystem::EnumAction(INT nPosIndex, LPCTSTR szFilter)
{
std::map
< INT, CActionItem * > ::iterator it;

for (it = m_mapAllAction.begin(); it != m_mapAllAction.end(); it ++ )
{
if (_stricmp(it -> second -> GetType_String(), szFilter) == 0 )
{
if (it ->second->GetPosIndex() == nPosIndex)
{
return it -> second;
}
}
}

return NULL;
}
 
  
void LuaObject::SetMetaTable( const LuaObject & valueObj)
{
luaplus_assert(m_state);
lua_State
* L = GetCState(); ( void )L;
lua_lock(L);
luaT_setmetatable(m_state
-> m_state, & m_object, hvalue( & valueObj.m_object));
lua_unlock(L);
}

 
  
ActionButton::s_pMetaTable -> RegisterObjectFunctor( " SetActionItem "
  & ActionButton::Lua_SetActionItem);
===================================
INT ActionButton::Lua_SetActionItem(LuaPlus::LuaState
* pState)
{
LuaStack args(pState);
if ( ! (args[ 2 ].IsInteger())) return 0 ;

INT idItem
= (INT)args[ 2 ].GetInteger();

Update(idItem);
return 0 ;
}
 
  
VOID ActionButton::Update(INT idItem)
{
// 取得ActionItem
tActionItem * pActionItem = g_pActionSys -> GetAction(idItem);

// 断开和原来的Action的联系
if (m_pActionItem && pActionItem != m_pActionItem)
{
m_pActionItem
-> RemoveRefrence( this );
}

if (NULL == pActionItem)
{
// 如果逻辑项为空, 清空显示
BeDestroyed();
m_pWindow
-> setProperty( " ShowTooltip " , " True " );
return ;
}
// 不显示默认tooltip
m_pWindow -> setProperty( " ShowTooltip " , " False " );
// 设置有效无效标记
if (pActionItem -> IsEnabled())
{
Bright();
}
else
{
Gloom();
}

// 设置新的Action
((CEGUI::IFalagardActionButton*)(CEGUI::FalagardActionButton*)m_pWindow)->
 setLogicItemData((void*)(INT_PTR)pActionItem-> GetID());

m_pActionItem
= pActionItem;
LPCTSTR DragName
= ((CEGUI::FalagardActionButton * )m_pWindow) -> getDragAcceptName();

if (DragName[ 0 ] == ' M ' || DragName[ 0 ] == ' F ' )
{
pActionItem
-> AddReference( this ,TRUE);
}
else
{
pActionItem
-> AddReference( this ,FALSE);
}

const STRING strIconName =
CUISystem::GetMe()
-> GetIconManager() -> GetIconFullName(m_pActionItem -> GetIconName());

m_pWindow
-> show();
m_pWindow
-> setProperty( " Empty " , " False " );
if ( ! strIconName.empty())
{
m_pWindow
-> setProperty( " NormalImage " , strIconName);
}
}
 
  
tActionItem * CActionSystem::GetAction(INT id)
{
std::map
< INT, CActionItem* > ::iterator it;

it
= m_mapAllAction.find(id);
if ( it != m_mapAllAction.end() )
return it -> second;

return NULL;
}

总体流程应该是这样的:

  一开始初始化的时候,当前背包的物品 遍历一遍 每个执行 local theAction,bLocked = PlayerPackage:EnumItem(szPacketName, i-1)

m_mapAllAction这里面装了所有的action当前人物的包里的action 的位置posindex也被存在里面了

it->second->GetPosIndex() == nPosIndex

获得到cActionItem=theAction 的到id绑到button上

 rbclick的时候 调用 相应item的 doaction向服务器端发包 

  

什么破博客,,,崩溃了就要重写也不带自动保存

转载于:https://www.cnblogs.com/minggoddess/archive/2011/02/15/1955479.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值