• 项目中lua(基础)


    关于项目中lua任务(某些没弄懂,但lua上耗费时间有点长了不看了)
    
    这段时间看了lua语法和项目中lua应用
    1.在lua中注册c库,在lua5.2中好像都是注册c库,相当于在lua中定义一个table,key是函数名字,value是函数指针
    m_spLuaState->RegLib("game", funcs);
    
    2.加载项目中所有lua并执行
    刚开始不知道那个dofile具有执行lua的功能,结果是返回0表示成功,执行lua就是执行其中定义的一些函数和全局变量(普通变量,表等)
    这个过程后就可以使用lua中的变量了
    
    3.然后上线发送玩家人物信息,这个地方不得不提任务存储方法,跟天龙差不多
    //有一些技巧
    
            /**
         * @brief 任务项
         * @note    
         *      自定义参数 m_uParam可保存当前任务的执行条件的进度:
         *        e.g.    怪物A的杀敌数
         *                怪物B的杀敌数...
         *                物品A的收集量
         *                物品B的收集量...
         *  
         */
        struct RcvMissonItem
        {
            short           m_nIsOccupy;                                ///< 此数组位是否已被占用  返回 0 -- 表示为空 可以用 ,1 -- 表示 已被占用
            short           m_nIsOnTrack;                               ///< 是否正在追踪
            int                m_nMissionID;                                ///< 任务Id( 0 ~ MAX_MISSION_COUNT)
            int                m_ScriptId;                                    ///< 脚本Id            
            short            m_nMissionType;                                ///< 任务类型
            short            m_nMissionState;                            ///< 任务执行状态
    
            //这个主要是根据id去决定uParam的具体含义,在脚本中定义,如杀怪的个数和杀怪的bodyid
            unsigned int    m_uParam[MAX_MISSION_PARAM_NUM];            ///< 自定义参数
            /*
             m_SriptId用处:
                1、比如本任务是杀怪任务,当怪物被杀后,判断本任务类型是否是杀怪任务
                如果是,并且此怪物携带的被杀任务标记中任务Id是当前任务Id,则需执行奖励脚本;
                2、可有由脚本Id去决定m_uParam的具体参数实意;
             */
            bool IsInvaild()
            {
                return m_nIsOccupy == 0;
            }
        };
    
    
    
        struct MissionInfo_New
        {
            int                m_nMissionCount;                                ///< 已接受的任务数量
            int             m_nCurMainThreadId;                             ///< 正在执行的主线任务Id
            int             m_nCurBtanchThreadId;                           ///< 正在执行的支线任务Id
            RcvMissonItem    m_aMissionItem[MAX_MISSION_RCV_NUM];            ///< 任务背包中的任务项
            unsigned int    m_aMissionDoneFlag[MAX_MISSION_TYPE_NUM];        ///< 某项任务是否执行的标记
    
            //这个自定义数据没搞懂什么意思
            int                m_aMissionData[MAX_MISSION_DATA_NUM];            ///< 玩家自定义任务数据
    
            /*
              m_aMissionDoneFlag用法:
                 nMissionId 取值范围(0 ~ MAX_MISSION_COUNT)
                0xFFF
                1111111 11111
                type       count
                (0~127)  (0~31)
                ==> 128 * 32 = 4096
             */
    
             //主要理解这个其实和脏标记差不多,只是脏标记拿char存,而这个拿int存
            inline bool IsMissionDone(int nMissionId)
            {
                int nMissionIndex =  nMissionId >> 5;
                return !!(m_aMissionDoneFlag[nMissionIndex] & (1 << (nMissionId & 0x1F)));
            }
            inline void SetMissionDoneFlag(int nMissionId, bool bDone)
            {
                int nMissionIndex = nMissionId >> 5;
                if (bDone)
                    m_aMissionDoneFlag[nMissionIndex] |= (1 << (nMissionId & 0x1F));
                else
                    m_aMissionDoneFlag[nMissionIndex] &= ~(1 << (nMissionId & 0x1F));
            }
    
            /*
             m_aMissionData的用法:[索引值由任务配置表决定]
                玩家自定义任务数据,可常用于一些频繁的直线任务
                    e.g. 某种任务
                        ①需判断一共执行多少次
                        ②上次执行时间
                        ③当天执行了多少次
    
                至于主线任务往往有前置任务需执行完方可领取的条件(就需前置任务标记/Id),这可由
                任务配表中指定完成,用时只需按配表前置任务标记查询IsMissionDone判断是否Done过即可作判断。
                配表应该指定的都是任务固有条件,如:完成和接收需要条件指标。
             */
    
        };
    
    4.接下来就是lua执行和c库函数互调的过程,因lua要获得实时信息所有要调c函数
    至于为什么用lua,对于那些比较复杂的逻辑比如任务,活动记录的东西较多,用c++实现起来可以,但容易出错每次修改代码需要编译
    用lua不用编译写代码大大提高效率
    
    还有那个lua虚拟机到底是什么,我知道一个lua_state就可以是一个虚拟机,可以通过和lua传参交互,解释器又是什么意思
  • 相关阅读:
    T-sql 中 truncate 、delete与drop操作数据库的区别
    poj -3070 Fibonacci (矩阵快速幂)
    给定一个0-1串,请找到一个尽可能长的子串,其中包含的0与1的个数相等。
    最长的循环节
    大组合数取模
    n个点中求任意两点组成斜率的最大值
    csu
    csu
    poj
    hdu
  • 原文地址:https://www.cnblogs.com/zzyoucan/p/4340779.html
Copyright © 2020-2023  润新知