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

天行健 君子當自強而不息

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 閱讀(227) 評論(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热这里只有精品8| 日韩午夜中文字幕| 国产精品视频免费一区| 国产精品国码视频| 欧美亚洲免费在线| 久久精品国产99精品国产亚洲性色 | 久久精品日韩一区二区三区| 亚洲欧美偷拍卡通变态| 国产女主播一区| 免费观看亚洲视频大全| 欧美日韩另类综合| 欧美中日韩免费视频| 久久中文字幕一区| 一区二区电影免费观看| 亚洲欧美在线x视频| 亚洲国产精品久久久久秋霞蜜臀 | 中文高清一区| 国内成人在线| 日韩天堂av| 一区二区视频欧美| 日韩午夜电影| 国产一区二区高清不卡| 亚洲国产高清在线| 久久在线免费| 亚洲五月六月| 麻豆成人av| 欧美一区久久| 欧美日本久久| 免费观看在线综合| 国产精品男人爽免费视频1| 欧美α欧美αv大片| 国产精品国产三级国产| 欧美国产日韩一区二区| 久久综合九色欧美综合狠狠| 在线综合+亚洲+欧美中文字幕| 性欧美xxxx视频在线观看| 夜夜狂射影院欧美极品| 久久久精品tv| 欧美在线视频免费观看| 欧美日本一道本| 农夫在线精品视频免费观看| 国产日韩精品一区二区三区在线 | 99精品欧美一区二区三区综合在线| 国产色爱av资源综合区| 日韩图片一区| 日韩一级大片| 欧美gay视频激情| 久久综合亚洲社区| 国产日韩欧美在线播放不卡| 一区二区成人精品| 中文在线不卡| 欧美日韩你懂的| 亚洲人成在线播放| 欧美天天影院| 亚洲精品欧美激情| 亚洲免费观看视频| 欧美11—12娇小xxxx| 欧美黄色成人网| 亚洲国产精品国自产拍av秋霞| 午夜精品福利视频| 久久se精品一区精品二区| 国产精品久久一级| 正在播放日韩| 久久电影一区| 国产亚洲一区精品| 久久精品国产一区二区三区免费看| 欧美在线视频一区二区三区| 国产美女精品人人做人人爽| 亚洲欧洲av一区二区| 欧美中文在线观看国产| 国产午夜精品视频| 久久激情视频久久| 欧美成人精品一区二区| 亚洲开发第一视频在线播放| 欧美黑人国产人伦爽爽爽| 亚洲国产日韩精品| 亚洲午夜伦理| 国产精品一区=区| 欧美亚洲网站| 欧美电影免费观看网站| 亚洲精品在线三区| 国产精品免费视频xxxx| 欧美专区亚洲专区| 欧美高清视频一二三区| 日韩视频欧美视频| 国产精品区一区二区三区| 西瓜成人精品人成网站| 欧美成年人视频网站| 日韩小视频在线观看| 国产精品久久999| 久久精品国产亚洲aⅴ| 亚洲国产精品电影在线观看| 亚洲一区国产精品| 永久555www成人免费| 欧美日韩另类在线| 久久久久久久久岛国免费| 最新国产乱人伦偷精品免费网站| 亚洲欧美激情四射在线日| 伊人久久婷婷色综合98网| 欧美日韩午夜激情| 久久激情一区| 一区二区三区www| 快she精品国产999| 亚洲自拍16p| 91久久精品国产91性色tv| 国产精品久久久久免费a∨大胸| 久久九九久久九九| 亚洲视频免费观看| 欧美国产大片| 久久久久久久久伊人| 999在线观看精品免费不卡网站| 国产午夜亚洲精品羞羞网站| 欧美精品一区二区高清在线观看| 欧美一级在线视频| 国产精品99久久久久久人| 亚洲成人直播| 久久免费国产精品| 亚洲欧美中文日韩在线| 亚洲剧情一区二区| 亚洲国产精品第一区二区三区| 国产噜噜噜噜噜久久久久久久久| 欧美精品日韩一区| 免费成人美女女| 久久久免费精品| 午夜精品一区二区在线观看| 99国产精品久久久| 亚洲国产日韩欧美一区二区三区| 久久午夜精品| 久久精品亚洲乱码伦伦中文| 亚洲欧美三级在线| 在线视频精品一区| 一区二区三区日韩欧美| 亚洲人午夜精品| 亚洲精品乱码视频| 亚洲精品久久久久久久久久久| 禁断一区二区三区在线| 国产一区二区三区黄视频| 国产精品拍天天在线| 国产精品久久久久久久电影| 欧美日韩综合网| 国产精品久久久久久久久久久久| 欧美日韩国产成人精品| 欧美日韩大片一区二区三区| 欧美麻豆久久久久久中文| 欧美大片在线观看| 欧美日韩国产精品自在自线| 欧美日韩免费区域视频在线观看| 欧美日韩国产一区二区| 欧美日韩调教| 国产精品亚洲一区| 国外成人性视频| 欧美大秀在线观看| 欧美精品综合| 国产精品高清网站| 国产日韩免费| 极品少妇一区二区三区| 136国产福利精品导航网址应用 | 国产午夜精品视频免费不卡69堂| 国产精品午夜春色av| 国产亚洲在线观看| 怡红院精品视频| 日韩视频免费观看高清在线视频| 亚洲色图在线视频| 久久成人18免费网站| 欧美高清视频一区| 中文精品在线| 久久久午夜电影| 欧美日韩国产综合视频在线| 国产精品久久久久影院亚瑟| 黄色成人在线| 亚洲午夜一区| 久久亚洲不卡| 在线一区二区视频| 久久久视频精品| 欧美午夜一区二区福利视频| 国内一区二区在线视频观看| 最新精品在线| 久久福利影视| 亚洲免费观看高清完整版在线观看| 亚洲色图综合久久| 久久蜜桃精品| 国产精品免费一区二区三区在线观看 | 国产精品人人做人人爽人人添| 伊人久久婷婷色综合98网| 一区二区三区精品久久久| 久久久久久久综合| 99综合视频| 牛牛影视久久网| 国产午夜精品一区二区三区欧美| 亚洲免费成人| 免费久久99精品国产自在现线| 一本一本久久a久久精品牛牛影视| 久久午夜精品| 国产自产在线视频一区| 亚洲午夜精品| 亚洲黄页视频免费观看|