• 天龙源码分析 – 选择角色流程


    一 角色选择流程开始
    可能的一种情况是,客户端接到服务器发送的包(LCRetCharList)开始的,这个包里面有玩家角色的个数等信息
    UINT    LCRetCharListHandler::Execute(LCRetCharList* pPacket, Player* pPlayer )
    {
    __ENTER_FUNCTION

    if(pPacket&&(pPacket->GetResult() == ASKCHARLIST_SUCCESS))
    {

    int iCharacterCount = pPacket->GetCharNumber();
    // 保存角色的个数
    CGameProcedure::s_pProcCharSel->m_iCharacterCount = 0;

    if( iCharacterCount > 0)
    {
    DB_CHAR_BASE_INFO* pInfo = NULL;
    for(int i = 0; i < iCharacterCount; i++)
    {
    pInfo = pPacket->GetCharBaseInfo(i);
    if(pInfo)
    {
    // 添加一个角色
    CGameProcedure::s_pProcCharSel->AddCharacter(*pInfo);

    CGameProcedure::s_pProcCharCreate->m_iCamp = pInfo->m_Camp;
    }

    }

    }
    else
    {
    CGameProcedure::s_pProcCharCreate->m_iCamp = -1;
    }

    CGameProcedure::s_pEventSystem->PushEvent( GE_GAMELOGIN_CLOSE_SYSTEM_INFO);

    // 转换到人物选择界面。
    if(CGameProcedure::GetActiveProcedure() == (CGameProcedure*)CGameProcedure::s_pProcCharCreate)
    {
    if(CGameProcedure::s_pProcCharCreate->m_Status == CGamePro_CharCreate::CHAR_CREATE_CREATE_OK)
    {
    CGameProcedure::s_pProcCharCreate->ChangeToRoleSel();
    }
    }

    上面流程做了两件事:
    (1)在界面上显示玩家所有角色,通过AddCharacter方法执行,等下分析
    (2)把流程修改为角色选择,ChangeToRoleSel()

    二 AddCharacter
    服务器会发送玩家角色列表,角色信息保存在这个结构里面DB_CHAR_BASE_INFO,包括GUID,名字,等级,发型等。AddCharacter函数会根据上述信息,创建角色,而且所有角色都会一次创建完毕

    三 进入场景
    触发条件是脚本发送命令
    // 发送进入游戏消息
    INT CGameProduce_Login::SendEnterGameMsg(LuaPlus::LuaState* state)
    {

    LuaStack args(state);
    if (!(args[2].IsInteger()))
    {
    TDThrow(“LUA:GetBuffIconNameByIndex param parameter error”);
    }

    if(CGameProcedure::s_pProcCharSel)
    {
    int iRoleIndex = args[2].GetInteger();
    CGameProcedure::s_pProcCharSel->SendEnterGameMsg(iRoleIndex);

    }//

    return 0;
    }

    根据传下来的ID,发送进入游戏的包
    // 进入游戏
    int CGamePro_CharSel::SendEnterGameMsg(int iRoleIndex)
    {
    if((iRoleIndex < m_iCharacterCount)&&(iRoleIndex >= 0))
    {
    if(iRoleIndex < MAX_SHOW_IN_UI)
    {
    CLAskCharLogin msg;

    m_EnterGameGUID = m_CharacterInfo[iRoleIndex].m_GUID;
    msg.SetCharGuid(m_EnterGameGUID);

    // 删除角色
    CNetManager::GetMe()->SendPacket(&msg);
    CGameProcedure::s_pEventSystem->PushEvent( GE_GAMELOGIN_SHOW_SYSTEM_INFO_NO_BUTTON, “准备进入游戏…..”);
    return 0;
    }
    }

    CGameProcedure::s_pEventSystem->PushEvent( GE_GAMELOGIN_SHOW_SYSTEM_INFO, “请选择一个角色”);
    return 1;
    }

    三 经过上面的发包,客户端应当进入CGamePro_Enter流程(等待进入场景流程),不过暂时没有找到更新到这个状态的合理地方,有待进一步分析

  • 相关阅读:
    LeetCode刷题7——数字的补数
    Leetcode刷题6—不同路径
    Leetcode刷题5—最大子序和
    LeetCode刷题4——子集
    LeetCode刷题3——位1的个数
    LeetCode刷题2——颠倒二进制位
    小鸡啄米问题求解
    weavenet
    为系统守护进程预留计算资源
    PolicyRouting (ip rule)
  • 原文地址:https://www.cnblogs.com/dieangel/p/3326934.html
Copyright © 2020-2023  润新知