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

            cTrigger::get_trigger

            get_trigger is the function in the trigger class that you call every time the player’s character
            moves. get_trigger will take the coordinates of the character you are checking and
            return the identification number of the first trigger found at that location (if any). If
            no triggers are found at the specified location, get_trigger returns a value of zero.

            A great deal is going on in get_trigger, but things are not too complicated. As
            the linked list of triggers is scanned, each trigger in question is checked to
            see whether it and the specified coordinates share the same map space.

            If so, the trigger’s identification number is returned.

            CAUTION
            Never assign a value of zero to a trigger because the trigger class uses zero
            to signify that no trigger is found when the get_trigger function is called.

            long cTrigger::get_trigger(float x_pos, float y_pos, float z_pos)
            {
                
            for(sTrigger* trigger = m_root_trigger; trigger != NULL; trigger = trigger->next)
                {
                    
            if(! trigger->enabled)      // only bother if enabled
                        continue;

                    
            float x_diff, y_diff, z_diff, dist;

                    
            switch(trigger->type)
                    {
                    
            case TRIGGER_SPHERE:
                        
            // check distance from sphere (using radius)
                        x_diff = fabs(trigger->x1 - x_pos);
                        y_diff = fabs(trigger->y1 - y_pos);
                        z_diff = fabs(trigger->z1 - z_pos);

                        dist = x_diff * x_diff + y_diff * y_diff + z_diff * z_diff;

                        
            if(dist <= trigger->radius)
                            
            return trigger->id;

                        
            break;

                    
            case TRIGGER_BOX:
                        
            // check if inside box
                        if((x_pos >= trigger->x1 && x_pos <= trigger->x2) &&
                           (y_pos >= trigger->y1 && y_pos <= trigger->y2) &&
                           (z_pos >= trigger->z1 && z_pos <= trigger->z2))
                        {
                            
            return trigger->id;
                        }

                        
            break;

                    
            case TRIGGER_CYLINDER:
                        
            // first make sure within height bounds
                        if(y_pos >= trigger->y1 && y_pos <= trigger->y1 + trigger->y2)
                        {
                            
            // check distance from cylinder
                            x_diff = abs(trigger->x1 - x_pos);
                            y_diff = abs(trigger->y1 - y_pos);
                            z_diff = abs(trigger->z1 - z_pos);
                        
                            dist = x_diff * x_diff + y_diff * y_diff + z_diff * z_diff;

                            
            if(dist <= trigger->radius)
                                
            return trigger->id;
                        }

                        
            break;

                    
            case TRIGGER_TRIANGLE:
                        
            // first make sure within height bounds
                        if(y_pos >= trigger->y1 && y_pos <= trigger->y1 + trigger->y2)
                        {
                            
            // check if point in front of all lines

                            D3DXVECTOR2 norm_vec;
                            
                            
            // x1,z1 to x2,z2
                            D3DXVec2Normalize(&norm_vec, &D3DXVECTOR2(trigger->z2 - trigger->z1, trigger->x1 - trigger->x2));

                            
            if(D3DXVec2Dot(&D3DXVECTOR2(x_pos - trigger->x1, z_pos - trigger->z1), &norm_vec) < 0)
                                
            break;

                            
            // x2,z2 to x3,z3
                            D3DXVec2Normalize(&norm_vec, &D3DXVECTOR2(trigger->z3 - trigger->z2, trigger->x2 - trigger->x3));

                            
            if(D3DXVec2Dot(&D3DXVECTOR2(x_pos - trigger->x2, z_pos - trigger->z2), &norm_vec) < 0)
                                
            break;

                            
            // x3,z3 to xz,zz
                            D3DXVec2Normalize(&norm_vec, &D3DXVECTOR2(trigger->z1 - trigger->z3, trigger->x3 - trigger->x1));

                            
            if(D3DXVec2Dot(&D3DXVECTOR2(x_pos - trigger->x3, z_pos - trigger->z3), &norm_vec) < 0)
                                
            break;

                            
            return trigger->id;
                        }

                        
            break;
                    }
                }

                
            return 0;   // means no trigger found
            }

            At this point, you check a trigger that is enabled to see whether it intersects with
            the coordinates passed in the x_pos, y_pos, and z_pos arguments of the get_trigger function.
            Each trigger has a special way of determining whether the specified coordinates
            are within the trigger space, and by using a switch statement, the following
            code can determine how to process that intersection check:

            For spheres, you use a distance check. If the coordinates have a distance equal to
            or less than the radius of the sphere, the trigger is touched.

            Box triggers use typical bounding boxes to compare the coordinates of the opposing
            corners to the coordinates being checked to see whether they intersect.

            Cylinder triggers use a mixture of spheres and bounding boxes.

            The triangle trigger code shown here checks whether the coordinate in question
            is in front of all three edges of the triangle by using what’s called a dot-product. For
            each edge of the triangle, the dot-product is calculated and checked to see whether
            the coordinates in question are on the inside or the outside of the triangle.

            You can think of the dot-product as the distance of the coordinates in question
            from a triangle edge. A negative distance means that the coordinates in question
            are on the outside of the triangle, whereas a positive distance means that the coordinates
            in question are inside the triangle.

            If all three dot-product checks come up with positive values, the coordinates in question
            must be inside the triangle. You use one last test to determine whether the coordinates
            in question fall within the height range defined in the sTrigger structure.

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

            公告

            導航

            統計

            常用鏈接

            隨筆分類(178)

            3D游戲編程相關鏈接

            搜索

            最新評論

            久久精品国产精品青草app| 国产成人香蕉久久久久| 国产香蕉久久精品综合网| 久久99热这里只有精品66| 久久久久99这里有精品10| 精品久久久久久国产| 亚洲成人精品久久| 国产精品美女久久久久久2018| 久久精品国产精品亚洲| 国产美女久久精品香蕉69| 久久精品成人免费网站| 一级做a爰片久久毛片毛片| 久久久久久国产a免费观看不卡| 亚洲国产精品狼友中文久久久| 久久精品欧美日韩精品| 久久夜色精品国产网站| 久久精品青青草原伊人| 性做久久久久久久久| 久久99精品免费一区二区| 爱做久久久久久| 久久人人爽人人爽人人av东京热| 国产三级久久久精品麻豆三级| 性做久久久久久久久久久| 国产欧美一区二区久久| 精品国产乱码久久久久软件| 日本免费一区二区久久人人澡| 97超级碰碰碰碰久久久久| 伊人久久综合成人网| 亚洲国产精品无码久久SM| 午夜精品久久久久久中宇| 久久久久久av无码免费看大片| www久久久天天com| 精品国产乱码久久久久软件| 久久www免费人成精品香蕉| 91精品国产乱码久久久久久| 伊人久久大香线焦综合四虎| 亚洲精品美女久久久久99| 国产精品成人久久久| 欧美亚洲日本久久精品| 精品综合久久久久久88小说| 国产精品激情综合久久|