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

天行健 君子當自強而不息

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 閱讀(262) 評論(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>
            欧美制服丝袜| 欧美国产第一页| 国产精品亚洲综合一区在线观看| 一区二区三区导航| 夜久久久久久| 国产精品永久| 麻豆国产精品一区二区三区 | 99精品欧美| 日韩一本二本av| 国产精品福利在线| 久久精品久久99精品久久| 久久精品国产清自在天天线| 激情六月综合| 亚洲精品国精品久久99热| 欧美日本一区二区高清播放视频| 在线视频欧美日韩| 性欧美长视频| 亚洲黄页一区| 亚洲午夜精品国产| 精品av久久707| 亚洲日本成人| 国产日韩精品一区二区三区| 欧美成人在线网站| 欧美日韩一区二区三区四区在线观看| 亚洲欧美日韩成人高清在线一区| 欧美在线三级| 国产精品99久久久久久久久久久久| 在线视频精品一| 136国产福利精品导航网址应用 | 亚洲影视综合| 久久在线91| 欧美日韩成人网| 欧美一区二区三区电影在线观看| 久久这里只有| 欧美一区二区三区在线| 欧美好吊妞视频| 久久综合色天天久久综合图片| 欧美国产乱视频| 久久精品视频免费播放| 欧美日韩国产黄| 欧美大片免费观看| 国产亚洲欧美日韩日本| 一本色道88久久加勒比精品| 国产一区二区主播在线| 99视频国产精品免费观看| 在线免费不卡视频| 亚洲欧美在线磁力| 中文国产一区| 欧美黑人在线播放| 免费不卡亚洲欧美| 国内精品久久久久国产盗摄免费观看完整版 | 亚洲国产日韩在线| 欧美一级在线播放| 亚洲欧美成人综合| 国产精品盗摄久久久| 亚洲高清资源综合久久精品| 一区在线视频| 久久国产精品久久w女人spa| 久久99伊人| 国产欧美日韩专区发布| 亚洲色无码播放| 一区二区三区久久网| 欧美精品成人| 亚洲精品久久久一区二区三区| 亚洲国产精品成人精品| 久久久人成影片一区二区三区| 久久久999| 国产综合色产| 久久男女视频| 免费在线看一区| 亚洲国产精品激情在线观看| 麻豆成人av| 亚洲国产精品久久久久婷婷884| 欧美日韩一区二区视频在线| 亚洲卡通欧美制服中文| 一区二区三区视频在线| 欧美日韩免费视频| 亚洲视频免费观看| 欧美一区免费视频| 国语精品一区| 欧美高清视频在线播放| 99re6这里只有精品| 亚洲影视九九影院在线观看| 国产精品久久一级| 性欧美1819性猛交| 欧美激情第三页| 亚洲社区在线观看| 国产女人18毛片水18精品| 久久成人在线| 亚洲人成小说网站色在线| 亚洲深爱激情| 国内久久精品视频| 欧美国产综合| 亚洲砖区区免费| 久久综合色8888| 一区二区三区免费看| 国产精品久久久久天堂| 欧美中文在线观看国产| 亚洲国产欧美不卡在线观看| 亚洲一二三区精品| 蜜桃精品久久久久久久免费影院| 亚洲第一综合天堂另类专| 亚洲一区二区少妇| 一区二区三区无毛| 欧美三级特黄| 久久久久在线| 亚洲综合欧美| 亚洲黄色有码视频| 久久国产精品一区二区三区| 亚洲国产天堂网精品网站| 国产精品久久久999| 美女啪啪无遮挡免费久久网站| 99精品国产福利在线观看免费| 久久精品国产亚洲一区二区| 亚洲人成免费| 极品日韩久久| 国产精品一区在线观看你懂的| 麻豆久久久9性大片| 亚洲欧美制服另类日韩| 日韩天堂在线观看| 亚洲国产精品成人| 久久久国产成人精品| 亚洲午夜小视频| 亚洲肉体裸体xxxx137| 国产在线视频不卡二| 国产精品都在这里| 欧美久久久久久久久久| 久久久女女女女999久久| 亚洲欧美日韩综合aⅴ视频| 99国产精品99久久久久久粉嫩| 美国成人直播| 久久久久久穴| 亚洲国产欧美日韩精品| 国产一区二区日韩精品| 国产伦精品一区二区三区免费| 欧美激情在线狂野欧美精品| 久久亚洲一区| 久久九九精品99国产精品| 亚洲一区二区三区三| 一区二区三区久久精品| 99国产精品视频免费观看一公开 | 99国产精品99久久久久久粉嫩| 一色屋精品视频免费看| 国内在线观看一区二区三区| 国产精品一级久久久| 国产精品萝li| 国产精品免费看久久久香蕉| 国产精品盗摄久久久| 国产精品黄色在线观看| 国产精品久久久久9999吃药| 欧美视频在线观看 亚洲欧| 欧美午夜精品久久久久久人妖| 欧美日韩免费区域视频在线观看| 欧美激情精品久久久久久久变态 | 欧美精品成人91久久久久久久| 老**午夜毛片一区二区三区| 久热国产精品视频| 欧美成人精品激情在线观看| 欧美精品激情在线观看| 欧美午夜欧美| 国产日韩欧美三级| 1024欧美极品| 一本色道久久88综合亚洲精品ⅰ| 亚洲香蕉视频| 久久国产精品毛片| 欧美成人国产一区二区| 欧美韩国日本一区| 99国产精品久久| 性色av一区二区三区红粉影视| 久久久久9999亚洲精品| 免费在线观看精品| 国产精品高潮呻吟视频| 国产一区二区三区黄| 亚洲激情视频在线| 亚洲欧美日韩国产一区二区| 老司机aⅴ在线精品导航| 亚洲人成在线播放| 先锋影院在线亚洲| 欧美成人午夜视频| 国产欧美日韩另类一区 | 欧美视频在线观看免费| 国产色产综合产在线视频| 精品91在线| 一本久久青青| 六月天综合网| 一本久道综合久久精品| 久久久一区二区| 国产精品免费看| 日韩视频三区| 免费久久99精品国产自| 99国产精品视频免费观看一公开| 欧美一区亚洲| 欧美午夜免费| 亚洲美女一区| 女生裸体视频一区二区三区| 亚洲图色在线| 欧美激情1区2区3区| 在线成人激情| 久久成人一区| 亚洲一级在线观看|