• <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>

            天行健 君子當自強而不息

            Working with Maps and Levels(6)

            cTrigger::add_trigger

            add_trigger is the heart of all the other functions that add a trigger. This function
            allocates a sTrigger structure, sets its type, identification number, and enable flag,
            and then links the structure into the linked list of triggers. Once you allocate your
            program using the add_trigger function, the program can fill in the returned sTrigger
            structure with the coordinates, radius, height, or whatever other information the
            trigger needs to have defined.

            Keeping in mind that the add_trigger function allocates only a sTrigger structure and
            fills it with the minimal data as just mentioned.

             

            cTrigger::add_sphere, cTrigger::add_box, cTrigger::add_cylinder, cTrigger::add_triangle

            This group of functions adds a trigger of a specific type to the linked list of triggers.
            Each function has its own list of arguments to use for creation (you can
            check the comments preceding each function to see what each argument does).
            Regardless of the type of trigger, each function first calls the add_trigger function
            to get a sTrigger structure with which to work.

            Let’s start with the add_sphere function, which takes, in addition to the trigger’s identification
            number and default enabled state (as each of the four functions here
            do), the sphere’s radius and the X-, Y-, and Z-coordinates for the sphere.

            Short and to the point, the add_sphere function calls on the add_trigger function to
            allocate and link in a sTrigger structure to the linked list. Once created, the sTrigger
            structure instance is filled with the sphere trigger’s coordinates and radius.

            add_box, add_cylinder, and add_triangle operate in much the same way the add_sphere function
            does. The add_box function takes the identification number and default enabled
            state, as well as the coordinates for the opposing corners of the box.

            The add_cylinder function uses the lower-middle coordinates of the cylinder, the
            radius, and height for the trigger.

            Wrapping up the bunch is add_triangle, which takes the three pairs of X- and Zcoordinates
            that define each of the triangle’s three corners. The Y-coordinate to
            use for those three corners, as well as the height of the triangular trigger shape,
            follows.

            NOTE
            All functions that use a radius as an argument square the value when it is stored in the structure.This speeds
            up distance checks later on. How does the trigger class speed up distance checks? A standard distance check
            uses a sqrt call to calculate the correct distance. Tossing out the sqrt speeds up the engine, but then
            you must square the values to match the distance.

             

            cTrigger::remove and cTrigger::free

            These two functions remove triggers from the linked list by referring to the identification
            number of the trigger to remove in the remove function or by allowing the
            class to remove all triggers in the list using the free function.

            The remove function operates by scanning the entire linked list—for each trigger
            that shares the same identification number as the number passed in the ID argument,
            the remove function removes the structure from the linked list and frees the
            structure’s memory:

            void cTrigger::remove(long id)
            {
                sTrigger* trigger = m_root_trigger;

                
            // scan through list of triggers
                while(trigger != NULL)
                {
                    sTrigger* next_trigger = trigger->next;

                    
            if(trigger->id == id)
                    {
                        
            // remove from list

                        
            if(trigger->prev)
                            trigger->prev->next = trigger->next;
                        
            else
                            m_root_trigger = trigger->next;

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

                        trigger->next = NULL;
                        delete trigger;

                        m_num_triggers--;
                    }

                    trigger = next_trigger;
                }
            }

            At this point, the linked list of sTrigger structures is being scanned. Now you store
            a pointer to the next structure in the linked list and check the currently iterated
            sTrigger structure for a match in the identification number being removed.

            Once it is determined that a structure needs to be removed, the code
            alters the linked list’s pointers and releases the structure’s memory resources.

            From this point on, the number of triggers stored in the linked list is reduced and the
            loop that scans for structures to remove continues until all structures are scanned.

            Whereas the remove function removes triggers according to their identification numbers,
            the free function can skip all the hoopla and delete the entire linked list in
            one fell swoop.


            posted on 2007-12-10 10:58 lovedday 閱讀(173) 評論(0)  編輯 收藏 引用

            公告

            導航

            統計

            常用鏈接

            隨筆分類(178)

            3D游戲編程相關鏈接

            搜索

            最新評論

            人妻丰满?V无码久久不卡| 狠狠色婷婷久久综合频道日韩 | 区久久AAA片69亚洲| 亚洲国产成人乱码精品女人久久久不卡 | 久久人人爽人人爽人人AV| 青青国产成人久久91网| 久久福利资源国产精品999| 久久久久亚洲av无码专区导航 | 久久久WWW成人| 乱亲女H秽乱长久久久| 久久精品国产99久久久香蕉| 人妻精品久久久久中文字幕一冢本| 久久婷婷久久一区二区三区| 中文国产成人精品久久亚洲精品AⅤ无码精品 | 色妞色综合久久夜夜 | 色偷偷88888欧美精品久久久| 精品久久久久久无码国产| 亚洲国产另类久久久精品小说| 久久精品国产一区二区电影| 久久夜色精品国产网站| 思思久久99热只有频精品66| 亚洲精品高清久久| 国产精品久久毛片完整版| 国产aⅴ激情无码久久| 伊人久久大香线蕉精品不卡| 精品久久综合1区2区3区激情| 精品久久久无码人妻中文字幕豆芽| 久久一区二区免费播放| 久久精品亚洲精品国产欧美| 91精品国产91热久久久久福利| AAA级久久久精品无码片| 伊人久久大香线蕉av不变影院| 一本大道久久香蕉成人网| 欧洲国产伦久久久久久久| 久久无码国产| 亚洲精品无码久久不卡| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区 | 精品久久久久久国产免费了| 一本久久久久久久| 国内精品久久久久久久影视麻豆| 99精品久久精品一区二区|