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

天行健 君子當自強而不息

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 閱讀(260) 評論(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>
            欧美日本一区二区三区| 亚洲经典自拍| 免费看精品久久片| 欧美亚洲一级片| 亚洲一区二三| 久久精品国产一区二区三区免费看 | 免费毛片一区二区三区久久久| 亚洲性人人天天夜夜摸| 亚洲欧美电影在线观看| 欧美一区二区三区男人的天堂| 亚洲欧美亚洲| 麻豆九一精品爱看视频在线观看免费| 看片网站欧美日韩| 欧美午夜精品理论片a级按摩| 国产精品国色综合久久| 国语自产精品视频在线看抢先版结局 | 午夜精品成人在线视频| 久久久久国产一区二区三区| 久久综合久久综合久久| 欧美日韩国产小视频| 欧美午夜女人视频在线| 国产综合自拍| 亚洲欧美日韩综合| 久久综合色播五月| 亚洲欧美区自拍先锋| 欧美日韩成人综合天天影院| 伊人精品久久久久7777| 午夜久久黄色| 亚洲欧美日韩久久精品| 欧美日韩一区二区三区免费| 在线精品观看| 美女成人午夜| 毛片一区二区三区| 亚洲电影免费观看高清| 欧美99在线视频观看| 久久久久五月天| 在线免费观看欧美| 欧美成人精品一区| 欧美激情1区2区3区| 日韩午夜免费视频| 日韩一区二区免费高清| 欧美视频在线一区| 香蕉免费一区二区三区在线观看 | 日韩天堂av| 欧美日韩一区二区在线播放| 一区二区久久久久| 久久精品国产精品亚洲| 亚洲一区二区黄| 欧美高清影院| 国产伦精品一区二区三区视频孕妇 | 欧美一进一出视频| 亚洲一区二区成人在线观看| 国产精品日日摸夜夜摸av| 亚洲欧美日韩精品久久久久| 99精品热视频只有精品10| 国产欧美在线播放| 最新国产成人在线观看| 欧美日韩激情小视频| 欧美一级理论片| 久久综合久久久| 亚洲欧美国产精品va在线观看| 欧美一区二区精美| 99精品欧美一区| 久久久久欧美精品| 久久成人精品| 国产精品羞羞答答xxdd| 亚洲精品美女91| 亚洲缚视频在线观看| 国产一区二区三区在线观看免费 | 国产欧美一区在线| 亚洲黄网站在线观看| 国产午夜精品一区二区三区视频| 亚洲精选中文字幕| 亚洲婷婷国产精品电影人久久| 欧美在线网址| 免费观看亚洲视频大全| 狠狠色丁香久久婷婷综合_中| 午夜欧美精品久久久久久久| 亚洲影院色在线观看免费| 欧美激情第1页| 一区二区欧美在线观看| 久久在线免费观看视频| 久久久久久久久久久久久久一区| 欧美麻豆久久久久久中文| 亚洲国产免费| 亚洲欧洲精品一区二区| 久久久久久伊人| 奶水喷射视频一区| 亚洲激情中文1区| 久久精品三级| 一区二区激情视频| 久久国产主播| 一区二区免费在线观看| 国产嫩草影院久久久久| 久久国产精品99久久久久久老狼| 欧美国产精品| 午夜一级久久| 999亚洲国产精| 国产一区二区三区精品久久久| 美女网站在线免费欧美精品| 一本色道久久88精品综合| 久久婷婷激情| 亚洲一区二区黄| 日韩视频免费观看高清在线视频| 日韩一区二区福利| 国产日韩欧美一区在线| 欧美日韩精品久久久| 久久全国免费视频| 欧美在线亚洲在线| 日韩亚洲视频在线| 亚洲激情电影中文字幕| 欧美福利小视频| 免费观看国产成人| 久久综合亚洲社区| 欧美承认网站| 免费欧美高清视频| 免费一区视频| 美日韩丰满少妇在线观看| 欧美成人精精品一区二区频| 欧美日韩色综合| 噜噜噜躁狠狠躁狠狠精品视频| 久久精品国产99| 欧美黄色视屏| 国产精品久久国产三级国电话系列| 欧美经典一区二区三区| 欧美国产极速在线| 欧美日韩亚洲一区二区三区四区| 欧美日韩国产另类不卡| 欧美日韩岛国| 国产一区二区成人| 99国产精品久久| 久久久久久高潮国产精品视| 久久一区二区三区国产精品| 欧美激情在线狂野欧美精品| 亚洲精品欧美| 嫩草成人www欧美| 国产精品入口66mio| 亚洲精品国产品国语在线app| 亚洲一区二区视频在线| 麻豆精品91| 亚洲影院在线观看| 欧美日韩一区二区三区四区五区 | 欧美人与性动交α欧美精品济南到| 欧美日韩免费一区二区三区| 在线观看成人小视频| 西瓜成人精品人成网站| 亚洲精品一区在线观看| 欧美成人三级在线| 最新国产成人在线观看| 久久精品亚洲一区二区三区浴池| 亚洲电影欧美电影有声小说| 久久精品日产第一区二区三区| 国产精品色在线| 久久aⅴ国产欧美74aaa| 午夜性色一区二区三区免费视频 | 欧美日韩国产精品| 99国产精品视频免费观看| 国产精品高清免费在线观看| 99视频在线观看一区三区| 亚洲国产合集| 欧美日韩国产综合视频在线| 一二三区精品福利视频| 亚洲国产成人在线播放| 欧美精品一区二区三区蜜桃| 亚洲色图在线视频| 性欧美激情精品| 亚洲精品一区二区三区福利| 日韩午夜激情av| 国产一区视频在线看| 最新日韩在线视频| 国产精品婷婷午夜在线观看| 美女视频黄 久久| 国产精品久久久久久久电影 | 黄色成人在线网站| 亚洲欧洲日本在线| 国产手机视频精品| 一本不卡影院| 亚洲免费大片| 久久免费99精品久久久久久| 99精品国产在热久久婷婷| 亚洲精品一区二区三区四区高清 | 欧美日韩免费| 欧美成人激情视频免费观看| 国产精品免费看| 在线亚洲一区观看| 亚洲三级影院| 欧美成年人视频网站| 欧美www在线| 在线精品亚洲| 久久综合中文字幕| 亚洲电影免费在线 | 亚洲免费视频在线观看| 免费观看日韩| 亚洲片区在线| 欧美三级电影大全| 久久精品一区四区| 亚洲第一中文字幕| 欧美成人免费播放| 一区二区三欧美| 久久久www成人免费精品|