• <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游戲編程相關鏈接

            搜索

            最新評論

            久久久久噜噜噜亚洲熟女综合| 囯产极品美女高潮无套久久久| 国产精品18久久久久久vr| 久久噜噜电影你懂的| 久久青青草原精品国产不卡| 亚洲狠狠婷婷综合久久蜜芽| 国产精品久久久久无码av| 欧美精品福利视频一区二区三区久久久精品 | 色综合久久中文字幕综合网| 久久综合色老色| 国产精品成人久久久久三级午夜电影 | 久久精品aⅴ无码中文字字幕不卡 久久精品成人欧美大片 | 人人狠狠综合久久亚洲高清| 国产欧美一区二区久久| 狠狠色丁香久久婷婷综合蜜芽五月| 久久99国产精一区二区三区| 久久久受www免费人成| 91性高湖久久久久| 久久久久成人精品无码中文字幕| 久久久久亚洲av毛片大| 久久精品免费观看| 久久AV高清无码| 亚洲AV无码成人网站久久精品大| 久久久亚洲精品蜜桃臀| 久久av免费天堂小草播放| 欧美亚洲国产精品久久蜜芽| 久久99精品久久久久久| 国产精品久久网| 精品乱码久久久久久久| 伊人久久精品无码二区麻豆| 国产精品久久久久久久久软件| 久久久久久国产精品免费免费| 精品久久久久中文字幕一区| 99久久免费只有精品国产| 国产日韩久久免费影院| 久久福利片| 思思久久99热只有频精品66 | 99久久精品国内| 久久久青草久久久青草| 国产福利电影一区二区三区久久久久成人精品综合 | 久久久91精品国产一区二区三区|