• <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(35)

            You're coming to the end of the long haul. You’ve finished the private data and
            functions, and the public functions are left:

            public:
                cCharController()
                {
                    ZeroMemory(
            thissizeof(*this));
                }

                ~cCharController()
                {
                    shutdown();
                }

                
            void free()
                {
                    delete m_root_char;
                    m_root_char = NULL;

                    m_num_char = 0;
                }

                
            void shutdown()
                {
                    free();

                    delete[] m_mesh_anim;
                    m_mesh_anim = NULL;
                    m_num_mesh_anim = 0;

                    delete[] m_char_anim;
                    m_char_anim = NULL;
                    m_num_char_anim = 0;

                    m_spell_controller    = NULL;
                    m_def_file[0]         = '\0';
                    m_weapon_mesh_path[0] = '\0';
                    m_texture_path[0]     = '\0';
                }
            ///////////////////////////////////////////////////////////////////////////////////////////////////

            void cCharController::init(ID3DXFont* font, PCSTR def_file,
                                       sItem* mil, sSpell* msl,
                                       
            long num_mesh_anim, PCSTR* mesh_names,
                                       PCSTR weapon_mesh_path, PCSTR texture_path,
                                       
            long num_char_anim, sCharAnimInfo* char_anims)
            {
                free();

                
            if(mesh_names == NULL || def_file == NULL)
                    
            return;

                m_font = font;

                strcpy(m_def_file, def_file);

                m_mil = mil;
                m_msl = msl;

                
            // copy over mesh path and texture path (or set default)
                strcpy(m_weapon_mesh_path, weapon_mesh_path ? weapon_mesh_path : ".\\");
                strcpy(m_texture_path, texture_path ? texture_path : ".\\");

                
            // get mesh names
                if((m_num_mesh_anim = num_mesh_anim) != 0)
                {
                    m_mesh_anim = 
            new sMeshAnim[num_mesh_anim];

                    
            for(long i = 0; i < m_num_mesh_anim; i++)
                        strcpy(m_mesh_anim[i].filename, mesh_names[i]);
                }

                
            // get animation data
                if((m_num_char_anim = num_char_anim) != 0)
                {
                    m_char_anim = 
            new sCharAnimInfo[m_num_char_anim];

                    
            for(long i = 0; i < m_num_char_anim; i++)
                        memcpy(&m_char_anim[i], &char_anims[i], 
            sizeof(sCharAnimInfo));
                }
            }

            In addition to the typical class constructor and destructor are the init and shutdown pair
            of functions. For the controller to operate, it must first be initialized with a call to init.
            When you’re done with the character controller class, a call to shutdown is in order.

            Somewhat similar in nature to shutdown, the free function completely
            removes all characters in the list of active characters. This function is useful for
            clearing the list when a character leaves a level and a whole new set of characters
            need to be added to the list.

            Speaking of adding characters to the list, here comes the function that does it all.

            With the add_char function, you need to provide a unique identification number, the MCL
            character definition number to use, the character’s type to assign (CHAR_PC, CHAR_NPC,
            or CHAR_MONSTER), the artificial intelligence to use, and the character’s coordinates and
            Y-axis angle used to point the character in a specific direction.

            Following add_char are two functions that remove a character in the list. The remove function
            takes a character’s unique identification number as an argument,
            and the remove_char function takes a pointer to the character structure.

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

            bool cCharController::add_char(long id, long def, long type, long ai,
                                           
            float pos_x, float pos_y, float pos_z,
                                           
            float direction)
            {
                FILE* fp;
                
            if((fp = fopen(m_def_file, "rb")) == NULL)
                    
            return false;

                sCharacter* character = 
            new sCharacter;

                character->def           = def;
                character->id            = id;
                character->type          = type;
                character->ai            = ai;
                character->pos_x         = pos_x;
                character->pos_y         = pos_y;
                character->pos_z         = pos_z;
                character->direction     = direction;
                character->update_enable = 
            true;
                character->charge        = rand()%101;

                sCharDef& char_def = character->char_def;

                fseek(fp, 
            sizeof(sCharDef) * def, SEEK_SET);
                fread(&char_def, 1, 
            sizeof(sCharDef), fp);
                fclose(fp);

                character->health_points = char_def.health_points;
                character->mana_points   = char_def.mana_points;

                
            // load character ics
                if(char_def.item_filename)
                {
                    character->char_ics = 
            new cCharIcs;
                    character->char_ics->load(char_def.item_filename);
                }

                sMeshAnim& mesh_anim = m_mesh_anim[char_def.mesh_index];

                
            // load mesh and animation if needed
                if(mesh_anim.count == 0)
                {
                    mesh_anim.mesh.load(mesh_anim.filename, m_texture_path);
                    mesh_anim.anim.load(mesh_anim.filename, &mesh_anim.mesh);
                    
                    
            for(long i = 0; i < m_num_char_anim; i++)
                        mesh_anim.anim.set_loop(m_char_anim[i].is_loop, m_char_anim[i].name);
                }

                character->
            object.create(&mesh_anim.mesh);
                mesh_anim.count++;

                
            // load and configure weapon (if any)
                if(m_mil && char_def.weapon != -1 && m_mil[char_def.weapon].mesh_filename)
                {
                    
            char path[MAX_PATH];
                    sprintf(path, "%s%s", m_weapon_mesh_path, m_mil[char_def.weapon].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");
                }

                
            // link into head of list
                if(m_root_char)
                    m_root_char->prev = character;

                character->next = m_root_char;
                m_root_char = character;

                
            return true;
            }

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

            void cCharController::remove_char(sCharacter* character)
            {
                
            if(character == NULL)
                    
            return;

                
            // decrease mesh count and release if no more

                sMeshAnim& mesh_anim = m_mesh_anim[character->char_def.mesh_index];

                
            if(--mesh_anim.count == 0)
                {
                    mesh_anim.mesh.free();
                    mesh_anim.anim.free();
                }

                
            // remove from list
                if(character->prev)
                    character->prev->next = character->next;
                
            else
                    m_root_char = character->next;

                
            if(character->next)
                    character->next->prev = character->prev;

                character->prev = character->next = NULL;
                delete character;
            }

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

            void remove(long char_id)
            {
                 
            return remove_char(get_char(char_id));
            }

            posted on 2007-12-04 17:27 lovedday 閱讀(222) 評論(0)  編輯 收藏 引用

            公告

            導航

            統計

            常用鏈接

            隨筆分類(178)

            3D游戲編程相關鏈接

            搜索

            最新評論

            国产精品国色综合久久| 久久久久综合网久久| 久久精品国产只有精品66| 伊人精品久久久久7777| 久久97精品久久久久久久不卡| 日韩欧美亚洲综合久久影院Ds| av无码久久久久久不卡网站 | 久久中文骚妇内射| 精品乱码久久久久久夜夜嗨 | 国产精品久久久久久久久久影院| 1000部精品久久久久久久久| 国产A三级久久精品| 亚洲国产精品无码久久九九 | 99久久精品免费看国产一区二区三区| 精品国产乱码久久久久久人妻| 久久国产精品免费| 久久久久亚洲AV片无码下载蜜桃 | 久久99热狠狠色精品一区| 久久久久国产精品麻豆AR影院| 亚洲中文精品久久久久久不卡| 国产精品99久久久久久猫咪 | 久久精品国产亚洲沈樵| 性做久久久久久久久浪潮| 久久久久亚洲AV成人网| 久久亚洲精品中文字幕| 久久一区二区三区免费| 色综合久久综精品| 国产精品久久久久久久久| 久久综合狠狠综合久久综合88 | 国产免费福利体检区久久| 国内精品久久久久久久97牛牛| 久久精品国产99久久久古代| 午夜视频久久久久一区 | 国内精品久久久久影院优 | 久久亚洲国产成人影院网站| 嫩草影院久久99| 色综合久久天天综合| 青青青青久久精品国产| 久久夜色tv网站| 国产免费久久精品99久久| 欧美精品福利视频一区二区三区久久久精品 |