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

天行健 君子當自強而不息

Working with Maps and Levels(10)

Continue now with the cBarrier class declaration:

When you need to assign a mesh to a barrier, use the set_mesh function, passing the
barrier’s identification number to set, as well as cMesh objects to use.
For setting an animation for a barrier, you pass the barrier’s
identification number, cAnimation object, the name of the animation to use, and the
time the animation is set (using a timer function such as timeGetTime).

You need to assign meshes and animations.
Each barrier has a dedicated cObject to use for orientation, but first a mesh must be
assigned via the set_mesh function. Animations are sure to follow using the set_anim
function. Take a look at each of the functions responsible for setting those meshes
and animations.

After you've loaded or created barriers, assign the meshes by their respective barrier
identification numbers. Notice that the set_anim function is just like the
cObject::set_anim_set function—you have the name of the animation and the starting
time of the animation.

Both functions simply scan through the linked list of barriers looking for a matching
identification number.

    void set_mesh(long id, cMesh* mesh)
    {
        
for(sBarrier* bar = m_root_barrier; bar != NULL; bar = bar->next)
        {
            
if(bar->id == id)            
                bar->
object.create(mesh);
        }
    }

    
void set_anim(long id, cAnimation* anim, pcstr name, long start_time)
    {
        
for(sBarrier* bar = m_root_barrier; bar != NULL; bar = bar->next)
        {
            
if(bar->id == id)            
                bar->
object.set_anim_set(anim, name, start_time);            
        }
    }

After you assign a mesh and animation, you can render a barrier to the display using
the following render function. The render function takes as arguments the current
time to update the animations (again using timeGetTime) and the viewing frustum to
use for clipping out the barriers that are out of the viewpoint.

The only other exclusive function in cBarrier (as opposed to cTrigger) is Render,
which takes a time value that is used to update the barriers’ animations and a viewing
frustum that is used to clip out unseen barrier objects. Take a look at the render
function code:

void cBarrier::render(ulong time_now, cFrustum* frustum)
{
    
for(sBarrier* bar = m_root_barrier; bar != NULL; bar = bar->next)
    {
        cObject* 
object = &bar->object;

        
float radius;
        
object->get_bounds(NULL, NULL, NULL, NULL, NULL, NULL, &radius);

        
if(frustum->is_sphere_in(bar->x_pos, bar->y_pos, bar->z_pos, radius))
        {
            
object->move(bar->x_pos, bar->y_pos, bar->z_pos);
            
object->rotate(bar->x_rot, bar->y_rot, bar->z_rot);

            
object->update_anim(time_now, true);
            
object->render();
        }
    }
}

In the preceding render function, the linked list of barriers is scanned, and for each
barrier, a frustum check is performed. If a barrier is in the view, its respective animation
is updated and the mesh is rendered.

When it comes time to start adding barriers to the linked list, the cBarrier class
comes packed with as many functions to do so as cTrigger.
 

public:

    
void add_sphere(long id, bool enabled,
                    
float x_pos,  float y_pos,  float z_pos,
                    
float x_rot,  float y_rot,  float z_rot,
                    
float cx_pos, float cy_pos, float cz_pos,
                    
float radius)
    {
        sBarrier* bar = add_barrier(BARRIER_SPHERE, id, enabled, x_pos, y_pos, z_pos, x_rot, y_rot, z_rot);

        bar->x1     = cx_pos;
        bar->y1     = cy_pos;
        bar->z1     = cz_pos;
        bar->radius = radius * radius;
    }

    
void add_box(long id, bool enabled,
                 
float x_pos,  float y_pos,  float z_pos,
                 
float x_rot,  float y_rot,  float z_rot,
                 
float x_min,  float y_min,  float z_min,
                 
float x_max,  float y_max,  float z_max)
    {
        sBarrier* bar = add_barrier(BARRIER_SPHERE, id, enabled, x_pos, y_pos, z_pos, x_rot, y_rot, z_rot);

        
// setup barrier data (fix for min/max values)
        bar->x1 = min(x_min, x_max);
        bar->y1 = min(y_min, y_max);
        bar->z1 = min(z_min, z_max);
        bar->x2 = max(x_min, x_max);
        bar->y2 = max(y_min, y_max);
        bar->z2 = max(z_min, z_max);
    }

    
void add_cylinder(long id, bool enabled,
                      
float x_pos,  float y_pos,  float z_pos,
                      
float x_rot,  float y_rot,  float z_rot,
                      
float cx_pos, float cy_pos, float cz_pos,
                      
float radius, float height)
    {
        sBarrier* bar = add_barrier(BARRIER_SPHERE, id, enabled, x_pos, y_pos, z_pos, x_rot, y_rot, z_rot);

        bar->x1     = cx_pos;
        bar->y1     = cy_pos;
        bar->z1     = cz_pos;
        bar->radius = radius * radius;
        bar->y2     = height;
    }

    
void add_triangle(long id, bool enabled,
                      
float x_pos,  float y_pos,  float z_pos,
                      
float x_rot,  float y_rot,  float z_rot,
                      
float x1, float z1,
                      
float x2, float z2,
                      
float x3, float z3,
                      
float cy_pos, float height)
    {
        sBarrier* bar = add_barrier(BARRIER_SPHERE, id, enabled, x_pos, y_pos, z_pos, x_rot, y_rot, z_rot);

        bar->x1 = x1;
        bar->z1 = z1;
        bar->x2 = x2;
        bar->z2 = z2;
        bar->x3 = x3;
        bar->z3 = z3;
        bar->y1 = cy_pos;
        bar->y2 = height;
    }   

    
void remove(long id)
    {
        sBarrier* bar = m_root_barrier;

        
while(bar != NULL)
        {
            sBarrier* next_bar = bar->next;

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

                
if(bar->prev)
                    bar->prev->next = bar->next;
                
else
                    m_root_barrier = bar->next;

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

                bar->next = NULL;
                delete bar;

                m_num_barriers--;
            }

            bar = next_bar;
        }
    }

    
bool get_enable_state(long id)
    {
        
for(sBarrier* bar = m_root_barrier; bar != NULL; bar = bar->next)
        {
            
if(bar->id == id)
                
return bar->enabled;
        }

        
return false;
    }

    
void enable(long id)
    {
        set_enable_state(id, 
true);
    }

    
void disable(long id)
    {
        set_enable_state(id, 
false);
    }

    
//////////////////////////////////////////////////////////////////////

public:
    
bool load(const char* filename);
    
bool save(const char* filename);

    
void render(ulong time_now, cFrustum* frustum);
    
long get_barrier(float x_pos, float y_pos, float z_pos);    
} *cBarrierPtr;


Other function:

bool cBarrier::load(const char* filename)
{
    free();     
// remove all current barriers

    FILE* fp = fopen(filename, "rb");
    
if(fp == NULL)
        
return false;

    
// start looping, reading in until EOF reached.
    for(;;)
    {
        
long id = get_next_long_2(fp);
        
if(id == -1)
            
break;

        
long type    = get_next_long_2(fp);
        
bool enabled = get_next_long_2(fp) ? true : false;   

        
// get coordinate and rotation
        float x_pos = get_next_float_2(fp);
        
float y_pos = get_next_float_2(fp);
        
float z_pos = get_next_float_2(fp);
        
float x_rot = get_next_float_2(fp);
        
float y_rot = get_next_float_2(fp);
        
float z_rot = get_next_float_2(fp);

        
float x1, y1, z1, x2, y2, z2, x3, z3, radius;

        
// read in rest depending on type
        switch(type)
        {
        
case BARRIER_SPHERE:
            x1     = get_next_float_2(fp);
            y1     = get_next_float_2(fp);
            z1     = get_next_float_2(fp);
            radius = get_next_float_2(fp);

            add_sphere(id, enabled, 
                       x_pos, y_pos, z_pos, x_rot, y_rot, z_rot, 
                       x1, y1, z1, radius);
            
break;

        
case BARRIER_BOX:
            x1 = get_next_float_2(fp);
            y1 = get_next_float_2(fp);
            z1 = get_next_float_2(fp);
            x2 = get_next_float_2(fp);
            y2 = get_next_float_2(fp);
            z2 = get_next_float_2(fp);

            add_box(id, enabled, 
                    x_pos, y_pos, z_pos, x_rot, y_rot, z_rot,
                    x1, y1, z1, x2, y2, z2);

            
break;

        
case BARRIER_CYLINDER:
            x1     = get_next_float_2(fp);
            y1     = get_next_float_2(fp);
            z1     = get_next_float_2(fp);
            radius = get_next_float_2(fp);
            y2     = get_next_float_2(fp);

            add_cylinder(id, enabled, 
                         x_pos, y_pos, z_pos, x_rot, y_rot, z_rot,
                         x1, y1, z1, radius, y2);

            
break;

        
case BARRIER_TRIANGLE:
            x1 = get_next_float_2(fp);
            z1 = get_next_float_2(fp);
            x2 = get_next_float_2(fp);
            z2 = get_next_float_2(fp);
            x3 = get_next_float_2(fp);
            z3 = get_next_float_2(fp);
            y1 = get_next_float_2(fp);
            y2 = get_next_float_2(fp);

            add_triangle(id, enabled, 
                         x_pos, y_pos, z_pos, x_rot, y_rot, z_rot,
                         x1, z1, x2, z2, x3, z3, y1, y2);

            
break;
    
        
default:    // some error occurred
            fclose(fp);
            free();
            
return false;
        }
    }

    fclose(fp);
    
return true;
}

/////////////////////////////////////////////////////////////////////////////////////////

bool cBarrier::save(const char* filename)
{
    
if(m_num_barriers == 0)
        
return false;

    FILE* fp = fopen(filename, "wb");
    
if(fp == NULL)
        
return false;

    
for(sBarrier* bar = m_root_barrier; bar != NULL; bar = bar->next)
    {
        
int enabled = bar->enabled ? 1 : 0;

        
char buf[1024];

        sprintf(buf, "%lu %lu %lu %lf %lf %lf %lf %lf %lf",
                bar->id, bar->type, enabled,
                bar->x_pos, bar->y_pos, bar->z_pos,
                bar->x_rot, bar->y_rot, bar->z_rot);

        
// write out remaining data depending on type
        switch(bar->type)
        {
        
case BARRIER_SPHERE:
            fprintf(fp, "%s %lf %lf %lf %lf\r\n",
                    buf, bar->x1, bar->y1, bar->z1, bar->radius);

            
break;

        
case BARRIER_BOX:
            fprintf(fp, "%s %lf %lf %lf %lf %lf %lf\r\n",
                    buf, bar->x1, bar->y1, bar->z1, bar->x2, bar->y2, bar->z2);

            
break;

        
case BARRIER_CYLINDER:
            fprintf(fp, "%s %lf %lf %lf %lf %lf\r\n",
                    buf, bar->x1, bar->y1, bar->z1, bar->radius, bar->y2);

            
break;

        
case BARRIER_TRIANGLE:
            fprintf(fp, "%s %lf %lf %lf %lf %lf %lf %lf %lf\r\n",
                    buf,
                    bar->x1, bar->z1, bar->x2, bar->z2, bar->x3, bar->z3,
                    bar->y1, bar->y2);

            
break;
        }
    }

    fclose(fp);
    
return true;
}

/////////////////////////////////////////////////////////////////////////////////////////

long cBarrier::get_barrier(float x_pos, float y_pos, float z_pos)
{
    D3DXVECTOR2 norm_vec;

    
for(sBarrier* bar = m_root_barrier; bar != NULL; bar = bar->next)
    {
        
// only bother if enabled
        if(! bar->enabled)
            
continue;

        
float x_diff, y_diff, z_diff, dist;

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

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

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

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

            
break;

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

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

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

            
break;

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

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

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

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

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

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

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

                
return bar->id;
            }   

            
break;
        }
    }

    
return 0;   // means no barrier found
}

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

公告

導航

統計

常用鏈接

隨筆分類(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>
            欧美激情影音先锋| 欧美片第1页综合| 欧美一级精品大片| **网站欧美大片在线观看| 欧美日产一区二区三区在线观看| 欧美在线黄色| 99在线视频精品| 亚洲成色www久久网站| 国产日韩欧美夫妻视频在线观看| 欧美日韩视频在线观看一区二区三区| 久久精品99国产精品日本 | 久久久www成人免费精品| 国产精品免费网站在线观看| 欧美一区二区三区男人的天堂| 亚洲一区在线视频| 99精品视频免费观看| 亚洲美女在线看| 亚洲高清不卡av| 欧美国产日韩一区二区| 亚洲电影有码| 亚洲国产欧美日韩| 亚洲一区bb| 美女国产精品| 国产精品极品美女粉嫩高清在线| 国产伦精品一区二区三区免费迷 | 亚洲大胆av| 在线视频你懂得一区二区三区| 制服丝袜亚洲播放| 欧美制服丝袜第一页| 老牛国产精品一区的观看方式| 亚洲国产高清视频| 欧美韩日亚洲| 免费亚洲婷婷| 亚洲国产美女久久久久 | 欧美日韩成人综合天天影院| 欧美日韩综合不卡| 合欧美一区二区三区| 99re热这里只有精品视频| 久久国产精品久久国产精品| 欧美国产日本在线| 午夜精品久久久久久99热| 久热综合在线亚洲精品| 国产精品网曝门| 在线综合亚洲欧美在线视频| 久久久久99| 亚洲国产精品成人一区二区 | 亚洲女性喷水在线观看一区| 亚洲精品一区二区在线| 欧美日韩国产探花| 亚洲在线观看视频网站| 一本色道久久综合狠狠躁篇的优点| 免费精品99久久国产综合精品| 在线观看国产欧美| 久久综合999| 久久在线视频在线| 91久久久久久国产精品| 亚洲国产精品久久久久秋霞影院 | 欧美成人高清| 巨乳诱惑日韩免费av| 一区二区三区自拍| 亚洲毛片在线| 伊人天天综合| 夜夜嗨av一区二区三区| 国产真实乱子伦精品视频| 午夜视频精品| 亚洲一区在线视频| 夜夜嗨av一区二区三区网站四季av | 欧美日韩中文字幕在线视频| 欧美激情a∨在线视频播放| 亚洲欧洲一区二区三区| 一区二区激情| 一区二区三区|亚洲午夜| 久久精品国产久精国产爱| 亚洲综合第一| 欧美激情国产精品| 男人的天堂亚洲| 国产精品久久一级| 亚洲精品一区二区三区av| 亚洲大片av| 麻豆国产精品777777在线| 欧美在线日韩精品| 国产亚洲精品成人av久久ww| 亚洲人体偷拍| 亚洲特级毛片| 欧美精品一区三区在线观看| 亚洲黄页一区| 亚洲最新合集| 欧美色精品天天在线观看视频| 亚洲第一主播视频| 亚洲国产美国国产综合一区二区| 欧美伊人久久| 免费一级欧美在线大片| 国精品一区二区| 蜜桃久久精品乱码一区二区| 亚洲高清三级视频| 一区二区三区.www| 国产精品毛片a∨一区二区三区| 亚洲综合社区| 久久久久久久久岛国免费| 在线欧美影院| 国产精品乱看| 免费观看日韩av| 夜夜嗨av一区二区三区四区| 香蕉久久夜色精品国产| 国产精品无人区| 久久免费精品日本久久中文字幕| 伊人久久大香线蕉av超碰演员| 久久精品一区二区三区四区 | 国产精品igao视频网网址不卡日韩| 亚洲国产精品黑人久久久| 日韩一级大片在线| 极品少妇一区二区| 欧美午夜电影一区| 美女精品网站| 久久亚洲欧洲| 性一交一乱一区二区洋洋av| 亚洲激情视频在线| 久久久久国产精品人| 国产精品99久久久久久www| 极品尤物久久久av免费看| 久久久久久伊人| 亚洲欧美日韩在线播放| 一级日韩一区在线观看| 亚洲精一区二区三区| 亚洲国产精品一区二区第一页 | 国产欧美日韩精品丝袜高跟鞋| 欧美激情2020午夜免费观看| 欧美xart系列高清| 欧美理论片在线观看| 欧美日韩国产精品一区| 亚洲图片在线观看| 在线一区二区三区四区| 一本一本久久| 久久视频精品在线| 欧美va日韩va| 亚洲精品综合| 欧美伊人久久久久久久久影院 | 蜜桃久久av| 亚洲人在线视频| 亚洲二区在线| 欧美国产日本| 久久精品一区蜜桃臀影院| 日韩网站在线观看| 影音先锋亚洲精品| 中日韩美女免费视频网址在线观看| 亚洲精品小视频| 欧美在线观看视频在线| 欧美激情一区在线| 一区二区三区四区国产精品| 久久理论片午夜琪琪电影网| 欧美国产乱视频| 激情久久久久久| 久久久亚洲国产天美传媒修理工 | 亚洲一区二区三区777| 久久成人免费视频| 亚洲天堂av电影| 国产精品成人v| 亚洲一区二区高清视频| 亚洲国产天堂久久国产91| 亚洲一品av免费观看| 欧美日韩国产小视频在线观看| 怡红院精品视频| 美国成人直播| 欧美成人一区二区三区在线观看| 国产最新精品精品你懂的| 久久久91精品国产| 午夜在线播放视频欧美| 国内精品一区二区三区| 久久亚洲私人国产精品va| 亚洲欧美中日韩| 国内精品久久久| 亚洲福利视频免费观看| 欧美区视频在线观看| 亚洲桃花岛网站| 亚洲欧美在线播放| 亚洲电影欧美电影有声小说| 欧美高清视频| 国产精品大片免费观看| 欧美一区网站| 欧美激情女人20p| 久久久久久成人| 亚洲午夜一二三区视频| 亚洲一级二级| 在线免费观看欧美| 一区二区av在线| 极品尤物av久久免费看| 欧美插天视频在线播放| 国产精品久久97| 欧美成人免费观看| 国产性做久久久久久| 蜜臀av性久久久久蜜臀aⅴ四虎 | 亚洲精品日韩在线| 国产婷婷色一区二区三区在线| 欧美激情成人在线视频| 韩国一区电影| 亚洲一区在线播放| 亚洲女与黑人做爰| 国产精品久久久久久久久搜平片 | 亚洲欧洲一区二区天堂久久| 欧美专区18|