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

天行健 君子當自強而不息

Working with Maps and Levels(4)

Creating a Trigger Class

Adhering to object-oriented programming techniques, create a class that will handle
a list of triggers and determine which (if any) has been touched by a character. The
class uses a structure to store the information of each trigger—the coordinates, type,
and so on. Each trigger is also assigned an identification number that it uses to refer
back to itself. The entire list is maintained as a linked list of structure.

The cTrigger class can load and save a trigger file, which makes editing lists of triggers
easier. This file is text-based, making it easier to read and edit. Each trigger
in the map uses a single line of text written in this order: an identification number,
the type of trigger (0=sphere, 1=box, 2=cylinder, 3=triangle), and the default enabled
status (if the trigger is enabled when loaded). A value of 0 means that the trigger
is disabled, and a value of 1 means that the trigger is enabled.

Depending on the type of trigger you are defining, the trigger must include a few
more values. Spheres require the X-, Y-, and Z-coordinates and the radius, as shown
in the following:

ID 0 ENABLED X Y Z RADIUS

Boxes have the coordinates of the opposing corners:

ID 1 ENABLED X1 Y1 Z1 X2 Y2 Z2

You define cylinders by the lower-center coordinates plus the radius and height:

ID 2 ENABLED X Y Z RADIUS HEIGHT

Finally, you define triangles by the X- and Z-coordinates of the three corners, in a
clockwise order, as seen from above the triangle on the Y-axis (much as a polygon
face is defined in Chapter 6, “Drawing with DirectX Graphics”). The Y-coordinate for
all three points of the triangle and the height of the trigger round out this definition:

ID 3 ENABLED X1 Z1 X2 Z2 X3 Z3 Y HEIGHT

I’ll get back to the trigger data file in a moment. For now, take a look at the class
definition of the trigger class. The class starts
out with an enum list that defines each type of trigger shape that you can use:

enum TriggerTypes { TRIGGER_SPHERE = 0, TRIGGER_BOX, TRIGGER_CYLINDER, TRIGGER_TRIANGLE };

Each trigger you define requires a structure that contains the information pertinent
to the trigger—the trigger’s location, enabled state, and unique identification
number. Each type of trigger uses a set of coordinates to define its location on the
map, as well as additional data to define the trigger’s radius, opposing corner coordinates,
and so on. The structure that contains the information about each trigger
created is as follows:

typedef struct sTrigger
{
    
long type;  // TRIGGER_SPHERE, TRIGGER_BOX, etc.
    long id;
    
bool enabled;

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

    sTrigger* prev;
    sTrigger* next;

    ///////////////////////////////////////////////////////////
   sTrigger() { prev = next = NULL; }
  ~sTrigger() { delete next; next = NULL; }
} *sTriggerPtr;

Notice that the sTrigger structure maintains a set of linked list pointers, as well as a
constructor and a destructor that clear the linked list pointers and free the linked
list, respectively.

In order to utilize the sTrigger structure, you use the trigger class, which manages
the linked list of triggers and enables you to save and load lists of those triggers.
Take a look at the trigger class declaration:

typedef class cTrigger
{
private:
    
long        m_num_triggers;
    sTrigger*   m_root_trigger;

    
////////////////////////////////////////////////////////////////////////////
public:
    cTrigger()
    {
        m_num_triggers = 0;
        m_root_trigger = NULL;
    }

    ~cTrigger()
    {
        free();
    }

    
void free()
    {
        delete m_root_trigger;
        m_root_trigger = NULL;

        m_num_triggers = 0;
    }

    
long get_num_triggers()
    {
        
return m_num_triggers;
    }

    sTrigger* get_root_trigger()
    {
        
return m_root_trigger;
    }

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

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

    
void add_sphere(long id, bool enabled,
                    
float x_pos, float y_pos, float z_pos,
                    
float radius)
    {
        sTrigger* trigger = add_trigger(TRIGGER_SPHERE, id, enabled);
    
        trigger->x1 = x_pos;
        trigger->y1 = y_pos;
        trigger->z1 = z_pos;
        trigger->radius = radius * radius;
    }

    
void add_box(long id, bool enabled,
                 
float x_min, float y_min, float z_min,
                 
float x_max, float y_max, float z_max)
    {
        sTrigger* trigger = add_trigger(TRIGGER_BOX, id, enabled);

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

    
void add_cylinder(long id, bool enabled,
                      
float x_pos, float y_pos, float z_pos,
                      
float radius, float height)
    {
        sTrigger* trigger = add_trigger(TRIGGER_CYLINDER, id, enabled);

        trigger->x1     = x_pos;
        trigger->y1     = y_pos;
        trigger->z1     = z_pos;
        trigger->radius = radius * radius;
        trigger->y2     = height;
    }

    
void add_triangle(long id, bool enabled,
                      
float x1, float z1,
                      
float x2, float z2,
                      
float x3, float z3,
                      
float y_pos, float height)
    {
        sTrigger* trigger = add_trigger(TRIGGER_TRIANGLE, id, enabled);
        
        trigger->x1 = x1;
        trigger->z1 = z1;
        trigger->x2 = x2;
        trigger->z2 = z2;
        trigger->x3 = x3;
        trigger->z3 = z3;
        trigger->y1 = y_pos;
        trigger->y2 = height;
    }

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

private:
    sTrigger* add_trigger(
long type, long id, bool enabled)
    {
        
// allocate a new trigger structure and link in

        sTrigger* trigger = 
new sTrigger;

        trigger->prev = NULL;
        trigger->next = m_root_trigger;

        
if(m_root_trigger)
            m_root_trigger->prev = trigger;

        m_root_trigger = trigger;

        trigger->type    = type;
        trigger->id      = id;
        trigger->enabled = enabled;

        m_num_triggers++;

        
return trigger;
    }

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

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

    
void remove(long id);
    
long get_trigger(float x_pos, float y_pos, float z_pos);
    
bool get_enable_state(long id);    

private:     
    
void  set_enable_state(long id, bool state);
} *cTriggerPtr;

Most of the functions deal with only a linked list of sTrigger structures—add a structure,
remove a structure, find a structure and modify it, and so on. For a closer
look at what’s going on, take a minute or two to review the following sections,
which provide the code for each function.

posted on 2007-12-09 15:39 lovedday 閱讀(222) 評論(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>
            国产精品久久午夜| 久久国产精品久久久| 欧美高清视频www夜色资源网| 国模精品娜娜一二三区| 蜜臀av国产精品久久久久| 麻豆精品在线视频| 亚洲欧美视频在线观看| 久久久久se| 亚洲影视综合| 老司机一区二区| 久久国产精品亚洲77777| 欧美成人免费播放| 久久精品一区蜜桃臀影院| 欧美日韩亚洲在线| 蜜桃av一区| 在线免费观看视频一区| 亚洲欧美精品| 欧美主播一区二区三区美女 久久精品人| 久久嫩草精品久久久久| 欧美中文在线免费| 国产精品久久久久久久久果冻传媒| 亚洲黄色成人| 亚洲国产精品一区| 久久精品91久久久久久再现| 午夜欧美不卡精品aaaaa| 欧美午夜不卡视频| 中文一区在线| 亚洲欧美日韩天堂一区二区| 国产精品v欧美精品v日本精品动漫| 免费亚洲网站| 日韩视频一区| 国产精品乱码妇女bbbb| 亚洲欧美视频在线观看视频| 久久精品72免费观看| 国产精品日韩一区| 久久av一区二区三区| 蜜桃久久av一区| 亚洲最新中文字幕| 国产麻豆精品在线观看| 久久国产精品电影| 亚洲人成久久| 久久不射网站| 亚洲精品四区| 国产午夜精品久久久| 欧美18av| 久久婷婷国产综合国色天香| 91久久精品国产91久久性色tv| 亚洲欧美成人一区二区在线电影| 狠狠色狠狠色综合日日tαg| 欧美日韩不卡| 老司机67194精品线观看| 中国av一区| 亚洲精品在线观看视频| 久久久爽爽爽美女图片| 亚洲欧美日韩国产成人精品影院| 亚洲成色777777在线观看影院| 国产精品毛片va一区二区三区 | 午夜影院日韩| 亚洲精品久久久一区二区三区| 久久久久久夜精品精品免费| 亚洲一区二区三区在线视频| 最新亚洲视频| 亚洲二区免费| 亚洲国产另类久久精品| 国产在线视频欧美| 精品51国产黑色丝袜高跟鞋| 国产美女精品视频免费观看| 国产日韩精品入口| 影音先锋另类| 日韩视频免费在线| 一区二区三区导航| 亚洲一区视频在线| 久久国产福利| 欧美mv日韩mv国产网站| 亚洲福利视频免费观看| 亚洲精品欧洲| 久久成人精品电影| 免费国产自线拍一欧美视频| 欧美日韩精品三区| 国产一区二区电影在线观看| 亚洲国产成人久久综合一区| 一本一本久久a久久精品综合麻豆| 亚洲性感激情| 免费欧美在线视频| 一区二区三区视频在线播放| 欧美综合国产精品久久丁香| 欧美国产欧美亚州国产日韩mv天天看完整| 欧美日韩精品伦理作品在线免费观看| 国产精品久久久久国产精品日日| 激情av一区| 性欧美在线看片a免费观看| 欧美成人69av| 午夜精品一区二区三区在线播放| 麻豆av福利av久久av| 国产麻豆成人精品| 欧美一级久久久| 亚洲精品一区二区三区在线观看| 久久久久久久999| 国产欧美综合一区二区三区| 亚洲欧美精品suv| 亚洲精品乱码视频| 欧美激情一区二区三区在线视频| 国语对白精品一区二区| 久久久久久久久伊人| 亚洲欧美日韩一区在线| 国产精品卡一卡二卡三| 亚洲资源在线观看| 欧美一级夜夜爽| 国内精品伊人久久久久av影院 | 国产伦精品一区二区三区视频黑人 | 国产精品视频九色porn| 在线亚洲精品福利网址导航| 日韩图片一区| 国产精品麻豆va在线播放| 久久精品亚洲精品国产欧美kt∨| 亚洲自拍都市欧美小说| 怡红院精品视频在线观看极品| 久久久久久综合| 欧美精品一区二区三区在线播放| 亚洲乱亚洲高清| 午夜精品影院| 亚洲精品老司机| 欧美一区二区三区在线观看| 一区国产精品| 亚洲免费婷婷| 日韩视频一区二区三区在线播放免费观看 | 在线观看成人一级片| 欧美77777| 国产精品欧美久久| 欧美国产日韩精品| 国产精品剧情在线亚洲| 亚洲电影免费在线观看| 国产在线不卡视频| 一区二区免费在线视频| 亚洲精品久久久久久久久久久久久| 亚洲视频在线一区观看| 亚洲精品系列| 欧美高清视频| 欧美成人xxx| 伊人久久亚洲影院| 久久精品成人一区二区三区| 欧美在线观看你懂的| 欧美日韩一本到| 一本综合久久| 夜夜嗨av色一区二区不卡| 免费在线看成人av| 亚洲国产影院| 亚洲小说欧美另类婷婷| 国产精品地址| 午夜久久久久久| 欧美jizz19hd性欧美| 亚洲人体偷拍| 欧美午夜精品久久久久免费视| 亚洲视频www| 久久久亚洲影院你懂的| 亚洲国产一区二区视频| 欧美精品色综合| 亚洲午夜精品国产| 亚洲免费中文字幕| 国产日韩在线看| 欧美激情亚洲自拍| 午夜精品福利一区二区蜜股av| 久久综合99re88久久爱| 亚洲美女免费精品视频在线观看| 欧美日韩在线一区二区三区| 欧美伊人久久久久久久久影院| 免费成人毛片| 久久精品国产久精国产思思| 亚洲免费av观看| 在线观看亚洲视频啊啊啊啊| 国产精品免费观看视频| 欧美高清视频在线观看| 久久av一区二区三区| 国产精品videosex极品| 欧美人与性禽动交情品| 麻豆成人在线| 欧美激情偷拍| 欧美激情综合亚洲一二区 | 影音先锋一区| 国产综合网站| 精品成人一区二区| 国产丝袜美腿一区二区三区| 国产精品久久久久久一区二区三区 | 99国产精品99久久久久久| 亚洲国产婷婷香蕉久久久久久| 黄色精品一区| 亚洲日本激情| 亚洲性av在线| 久久精品国产精品亚洲| 免费人成精品欧美精品| 亚洲国产经典视频| 亚洲精品视频免费观看| 亚洲乱码视频| 亚洲欧美制服另类日韩| 久久精品在线观看| 欧美日韩www| 黄色一区二区三区| 亚洲午夜久久久久久尤物 | 一本色道久久加勒比精品| 亚洲天堂成人|