• 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向服务器端发包 

      

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

  • 相关阅读:
    SIP穿越NAT SIP穿越防火墙-SBC
    安卓SAX解析XML文件
    C#进阶系列——WebApi 异常处理解决方案
    C#进阶系列——WebApi 接口返回值不困惑:返回值类型详解
    C#进阶系列——WebApi 接口参数不再困惑:传参详解
    C#进阶系列——WebApi 身份认证解决方案:Basic基础认证
    C#进阶系列——WebApi 跨域问题解决方案:CORS
    C#进阶系列——WebApi 接口测试工具:WebApiTestClient
    微信公众平台向特定用户推送消息
    JSONP跨域的原理解析
  • 原文地址:https://www.cnblogs.com/minggoddess/p/1955479.html
Copyright © 2020-2023  润新知