• <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 閱讀(219) 評論(0)  編輯 收藏 引用


            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            公告

            導(dǎo)航

            統(tǒng)計

            常用鏈接

            隨筆分類(178)

            3D游戲編程相關(guān)鏈接

            搜索

            最新評論

            久久r热这里有精品视频| 久久精品99久久香蕉国产色戒| 久久精品成人| 热re99久久精品国产99热| 九九热久久免费视频| 伊人久久综合无码成人网 | 亚洲国产另类久久久精品小说| 亚洲精品乱码久久久久久久久久久久| 一本一本久久A久久综合精品| 久久精品国产男包| 久久久91人妻无码精品蜜桃HD| 无码精品久久一区二区三区 | 久久国产免费观看精品3| 久久这里只有精品久久| 久久一区二区三区99| 国产精品一久久香蕉产线看| 久久久久亚洲精品男人的天堂| 久久天天躁夜夜躁狠狠躁2022| 久久国产精品成人影院| 欧美成人免费观看久久| 93精91精品国产综合久久香蕉 | 久久久久18| 久久精品国产亚洲AV麻豆网站 | 婷婷国产天堂久久综合五月| 久久亚洲精品人成综合网| 久久久高清免费视频| 93精91精品国产综合久久香蕉 | 久久91精品国产91久| 久久久久国产精品麻豆AR影院| 亚洲精品乱码久久久久久自慰| 精品多毛少妇人妻AV免费久久| 国产精品久久午夜夜伦鲁鲁| 久久精品国产99久久久| 午夜精品久久久久久毛片| 欧美一区二区久久精品| 亚洲伊人久久综合中文成人网| 久久精品亚洲欧美日韩久久| 久久婷婷久久一区二区三区| 国产精品久久国产精品99盘| 国内精品久久久久久99蜜桃| 久久精品九九亚洲精品|