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

            搜索

            最新評論

            91精品国产高清久久久久久国产嫩草 | 亚洲va久久久噜噜噜久久狠狠| 中文字幕精品无码久久久久久3D日动漫 | 国产L精品国产亚洲区久久| 国产免费久久久久久无码| 四虎影视久久久免费观看| 国内精品久久久久久99蜜桃| 久久国产精品一区| 亚洲va久久久噜噜噜久久狠狠 | 久久精品中文无码资源站 | 国内精品九九久久久精品| 99久久国产免费福利| 99久久国产精品免费一区二区| 久久综合久久综合九色| 男女久久久国产一区二区三区| 99久久亚洲综合精品网站| 人妻无码精品久久亚瑟影视| 日韩精品国产自在久久现线拍 | 国产成人精品久久一区二区三区av | 伊人色综合久久天天人守人婷| 久久精品国产影库免费看 | 国产一区二区精品久久岳| 久久久亚洲欧洲日产国码二区| 亚洲午夜无码久久久久小说| 伊人色综合久久| 国产精品无码久久综合 | 精品国产乱码久久久久久人妻| 国产精品gz久久久| 狠狠色婷婷综合天天久久丁香| 久久久久久午夜成人影院 | 三级片免费观看久久| 伊人色综合久久天天| 欧美一区二区精品久久| 亚洲成色999久久网站| 久久久久中文字幕| 99久久精品国产高清一区二区 | 日本久久中文字幕| 蜜桃麻豆www久久国产精品| 久久强奷乱码老熟女| 久久综合九色综合久99| 亚洲国产精品综合久久一线|