• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            天行健 君子當自強而不息

            Controlling Players and Characters(40)

            Things are winding down with the controller at this point. You use the following
            functions to equip, use, and drop an item:

            bool cCharController::equip(sCharacter* character, long item_index, long equip_type, bool equip_now)
            {
                
            if(m_mil == NULL || character == NULL)
                    
            return false;

                
            // make sure allow equiping of item
                if(! check_bit(m_mil[item_index].usage, character->char_def.class_index))
                    
            return false;

                
            // remove current item first and equip new one
                switch(equip_type)
                {
                
            case WEAPON:
                    character->char_def.weapon = -1;
                    character->weapon_mesh.free();

                    
            if(equip_now && m_mil[item_index].category == WEAPON)
                    {
                        character->char_def.weapon = item_index;

                        
            if(m_mil[item_index].mesh_filename)
                        {
                            
            char path[MAX_PATH];
                            sprintf(path, "%s%s", m_weapon_mesh_path, m_mil[item_index].mesh_filename);

                            character->weapon_mesh.load(path, m_texture_path);
                            character->weapon_object.create(&character->weapon_mesh);
                            character->weapon_object.attach_to_object(&character->
            object, "WeaponHand");
                        }
                    }

                    
            break;

                
            case ARMOR:
                    character->char_def.armor = -1;

                    
            if(equip_now && m_mil[item_index].category == ARMOR)
                        character->char_def.armor = item_index;

                    
            break;

                
            case SHIELD:
                    character->char_def.shield = -1;

                    
            if(equip_now && m_mil[item_index].category == SHIELD)
                        character->char_def.shield = item_index;

                    
            break;

                
            case ACCESSORY:
                    character->char_def.accessory = -1;

                    
            if(equip_now && m_mil[item_index].category == ACCESSORY)
                        character->char_def.accessory = item_index;

                    
            break;

                
            default:
                    
            return false;
                }

                
            return true;
            }

            ///////////////////////////////////////////////////////////////////////////////////////////////////

            void cCharController::use_item(sCharacter* owner, sCharacter* target, 
                                           
            long item_index, sCharItem* char_item)
            {
                
            if(owner == NULL || target == NULL || m_mil == NULL)
                    
            return;

                sItem* item = &m_mil[item_index];

                
            // make sure allow to use of item
                if(! check_bit(item->usage, target->char_def.class_index))
                    
            return;

                
            // use specified item
                switch(item->category)
                {
                
            case EDIBLE:
                
            case HEALING:   // alter health
                    target->health_points += item->value;
                    
            break;
                }

                
            // decrease quantity and remove object if needed
                if(check_bit(item->flags, USEONCE) && char_item)
                {
                    char_item->quantity--;

                    
            if(char_item->quantity <= 0 && owner->char_ics)
                        owner->char_ics->remove(char_item);
                }
            }

            ///////////////////////////////////////////////////////////////////////////////////////////////////

            bool cCharController::drop(sCharacter* character, sCharItem* char_item, long quantity)
            {
                
            if(char_item == NULL || m_mil == NULL || character == NULL)
                    
            return false;

                
            // make sure item can be dropped
                if(! check_bit(m_mil[char_item->item_index].flags, CANDROP))
                    
            return false;

                char_item->quantity -= quantity;

                
            // remove item from ics if no more left
                if(char_item->quantity <= 0 && character->char_ics)
                    character->char_ics->remove(char_item);

                
            return true;
            }

            With equip, you must specify the character to modify and the item number (from
            the MIL) of the item being equipped. You use the equip_type argument to specify which
            item type to equip (WEAPON, ARMOR, SHIELD, or ACCESSORY) and the equip_now flag to tell the
            controller to equip the specified item (set equip_now to true) or just to unequip the currently
            used item (by setting equip_now to false).

            As for the use item function (use_item), two characters are required: the owner of the
            item and the character on which the item is being used. In that way, one character
            can use a healing potion on another character. Specify the MIL item number being
            used, as well as a pointer to the owner’s ICS char_item structure so that the quantity
            of the item can be decreased.

            The next function is required to process the teleport spell effect on PCs. Whenever a
            teleport spell is used on a PC, the character controller calls the following function to
            handle the effects. Both the pointer to the target character and spell structure are
            passed:

            virtual bool pc_teleport(sCharacter* character, const sSpell* spell)
            {
              return true;
            }

            Finishing up the character controller class functions is the one that is responsible
            for preparing a character to perform an action. You use this function mostly when
            controlling your PC via the pc_update function:

                void set_char_action(sCharacter* character, long action, long action_timer)
                {
                    
            if(character == NULL)
                        
            return;

                    
            // make sure attack, spell, and item supporting charge.
                    if(action == CHAR_ATTACK || action == CHAR_SPELL || action == CHAR_ITEM)
                    {
                        
            if(character->charge < 100.0f)
                            
            return;
                    }

                    character->action = action;
                    play_action_sound(character);

                    
            long mesh_index = character->char_def.mesh_index;

                    
            // set action timer
                    if(action_timer == -1)
                        character->action_timer = 1;
                    
            else
                    {
                        
            ulong anim_length = m_mesh_anim[mesh_index].anim.get_time_length(m_char_anim[action].name);
                        character->action_timer = action_timer + anim_length * 30;
                    }
                }

            When a PC (or any character for that matter) does something, a matching action is
            performed. Walking is an action, attacking is an action, and so on. Previously, actions
            were defined as CHAR_IDLE, CHAR_MOVE, CHAR_ATTACK, and so on, for example. You need to
            set the action argument to one of those values in order to initiate a character action.

            For each action that a character can perform, there is a matching animation in the
            sCharAnimInfo structure array used to initialize the controller. When a character
            performs an action, the appropriate animation is set, as well as the action timer
            used to count down the time until the animation is complete. Remember that no
            further actions can be performed until the current action is complete.

            The last argument in the list, add_timer, is used to add additional milliseconds to the
            action timer. Specifying a value of -1 for add_timer, forces set_char_action to not use the
            action timer, which means that the action clears on the next update.

            posted on 2007-12-04 20:13 lovedday 閱讀(220) 評論(0)  編輯 收藏 引用

            公告

            導航

            統計

            常用鏈接

            隨筆分類(178)

            3D游戲編程相關鏈接

            搜索

            最新評論

            亚洲精品成人网久久久久久| 久久精品国产色蜜蜜麻豆| 久久精品国产精品青草| 国产精自产拍久久久久久蜜| 伊人久久大香线蕉无码麻豆| 久久精品www人人爽人人| 久久精品?ⅴ无码中文字幕| 影音先锋女人AV鲁色资源网久久| 狠狠久久亚洲欧美专区| 久久精品国产男包| 久久久久婷婷| 伊人色综合久久天天| 久久久亚洲欧洲日产国码aⅴ| 久久激情五月丁香伊人| 日韩精品久久无码中文字幕| 色婷婷综合久久久久中文字幕 | 久久久久久久精品成人热色戒| AV无码久久久久不卡蜜桃| 亚洲国产精品综合久久网络| 91精品无码久久久久久五月天| 色88久久久久高潮综合影院 | 亚洲国产精品久久久久婷婷老年| 久久99国产精品久久99小说 | 一级A毛片免费观看久久精品| 久久精品国产亚洲沈樵| 2020久久精品国产免费| 日韩久久久久久中文人妻| 99久久夜色精品国产网站| 久久天天躁狠狠躁夜夜躁2014| 亚洲国产成人久久一区久久| 久久99热这里只有精品国产| 亚洲国产精品婷婷久久| 国产精品毛片久久久久久久| 国产精品欧美久久久天天影视| 99麻豆久久久国产精品免费| 久久66热人妻偷产精品9| 2021精品国产综合久久| 国产精品久久久久久久午夜片| 国产精品美女久久久免费| 久久中文字幕视频、最近更新 | 五月丁香综合激情六月久久 |