青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

天行健 君子當自強而不息

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


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


公告

導航

統計

常用鏈接

隨筆分類(178)

3D游戲編程相關鏈接

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            av不卡在线| 久久久午夜精品| 欧美性久久久| 亚洲综合欧美| 香港成人在线视频| 国产在线视频欧美一区二区三区| 午夜视频在线观看一区二区三区| 夜夜嗨av色一区二区不卡| 欧美午夜不卡视频| 久久精品女人| 欧美韩日亚洲| 欧美一区二区三区在线观看| 午夜久久福利| 亚洲欧洲三级电影| 99一区二区| 国产日韩欧美高清免费| 免费成人毛片| 国产精品v欧美精品v日韩精品| 久久激情中文| 欧美顶级少妇做爰| 午夜欧美电影在线观看| 久久久久久久波多野高潮日日| 亚洲伦理中文字幕| 亚洲免费网址| 亚洲三级性片| 午夜一区二区三区在线观看| 亚洲激情图片小说视频| 亚洲一区二区三区四区五区黄 | 欧美在线一二三四区| 亚洲福利电影| 亚洲一区免费观看| 亚洲欧洲日韩综合二区| 亚洲一区中文| 亚洲美女视频在线免费观看| 欧美一级专区免费大片| 亚洲免费不卡| 久久久久久久999| 亚洲一区二区动漫| 欧美v日韩v国产v| 久久久久久久尹人综合网亚洲| 欧美日产国产成人免费图片| 蜜臀va亚洲va欧美va天堂| 国产精品国产三级国产aⅴ入口| 欧美黄色网络| 激情综合在线| 欧美在线观看你懂的| 亚洲一区二区三区国产| 欧美成人午夜激情| 欧美国产视频日韩| 红桃视频国产一区| 欧美一区二区高清| 亚洲自拍啪啪| 欧美网站大全在线观看| 亚洲国产精品一区| 亚洲福利视频二区| 久久久夜夜夜| 欧美 日韩 国产精品免费观看| 国产麻豆视频精品| 亚洲欧美成人精品| 午夜精品福利一区二区蜜股av| 欧美日韩网站| 99精品国产在热久久下载| 99视频精品全部免费在线| 欧美成年人网站| 亚洲黄网站黄| 9久re热视频在线精品| 欧美精品九九| 99这里有精品| 午夜精品www| 国产亚洲aⅴaaaaaa毛片| 午夜综合激情| 久久亚洲免费| 亚洲三级影院| 欧美日韩一区二区在线观看视频 | 亚洲精品极品| 亚洲一二三区在线观看| 欧美视频一区二区三区| 日韩一区二区久久| 亚洲自拍偷拍视频| 国产欧美日韩在线观看| 欧美一区国产在线| 免费成人在线观看视频| 亚洲麻豆国产自偷在线| 欧美日韩喷水| 欧美在线短视频| 欧美激情中文字幕一区二区| 99国产一区| 国产精品一页| 毛片av中文字幕一区二区| 亚洲国产天堂久久国产91| 亚洲视频欧美在线| 国产喷白浆一区二区三区| 久久伊伊香蕉| 中文一区二区在线观看| 久久久水蜜桃| 一区二区三区鲁丝不卡| 国产一区二区三区视频在线观看| 看片网站欧美日韩| 中国成人黄色视屏| 免费人成网站在线观看欧美高清| 一本色道精品久久一区二区三区 | 久久漫画官网| 日韩亚洲国产精品| 久久久久久自在自线| 99视频在线观看一区三区| 国产精品入口| 欧美电影电视剧在线观看| 亚洲在线一区| 亚洲日本中文字幕| 久久亚洲国产精品日日av夜夜| 亚洲美女在线观看| 国内外成人在线视频| 欧美日韩国产欧| 久久亚洲一区二区| 亚洲欧美国产日韩中文字幕| 亚洲精品久久久久久久久久久久久 | 久久精品国产亚洲一区二区三区| 亚洲国产天堂久久综合| 久久久www成人免费毛片麻豆| 亚洲美女av黄| 亚洲国产成人不卡| 国内精品久久久久伊人av| 欧美三级网页| 欧美激情国产精品| 久久中文字幕一区| 久久精品国产欧美激情| 亚洲欧美日韩成人| 在线一区二区视频| 亚洲精品一区在线观看香蕉| 欧美成人在线网站| 久久久久国产精品一区二区| 亚洲欧美日韩国产一区二区| 99国产精品99久久久久久| 亚洲国产一区二区三区高清| 国内精品嫩模av私拍在线观看| 国产精品v亚洲精品v日韩精品| 欧美精品精品一区| 欧美激情综合五月色丁香| 美女国内精品自产拍在线播放| 久久久精品日韩欧美| 欧美在线视频在线播放完整版免费观看| 一区二区三区高清不卡| 99国产精品国产精品久久| 亚洲精品国产品国语在线app| 亚洲国产99| 亚洲三级视频| 一区二区国产精品| 在线亚洲一区| 午夜精品亚洲一区二区三区嫩草| 亚洲无线观看| 欧美一区二区三区日韩视频| 欧美一区二区三区在线| 久久大逼视频| 免费在线国产精品| 欧美国产免费| 欧美日韩国产综合久久| 国产精品国产a级| 国产农村妇女精品一二区| 国产日韩欧美在线视频观看| 国产自产精品| 亚洲国产美女精品久久久久∴| 亚洲精品久久久久久久久久久| 99亚洲一区二区| 欧美一区=区| 欧美超级免费视 在线| 欧美激情亚洲国产| 一本久久a久久精品亚洲| 亚洲欧美日韩另类| 开心色5月久久精品| 欧美区日韩区| 国产日韩一区二区三区| 激情成人中文字幕| 99精品国产福利在线观看免费| 亚洲欧美在线高清| 欧美成年人视频网站欧美| 亚洲精品免费网站| 午夜精品一区二区三区在线视| 久久久久9999亚洲精品| 欧美精品激情blacked18| 国产精品夜色7777狼人| 亚洲国产美女精品久久久久∴| 亚洲视频在线看| 欧美.www| 午夜精品视频在线| 欧美国产精品一区| 国产区日韩欧美| 99视频+国产日韩欧美| 久久久久久电影| aa成人免费视频| 美女主播精品视频一二三四| 国产精品网站视频| 亚洲精品一区二区三区婷婷月| 欧美一级免费视频| 亚洲全黄一级网站| 久久精品亚洲一区二区| 国产精品a久久久久久| 亚洲激情网站| 久久亚洲欧美| 亚洲男人av电影| 欧美三级精品|