天行健 君子当自强而不息

Working with Maps and Levels(8)

cTrigger::get_enable_state, cTrigger::set_enable_state, cTrigger::enable, cTrigger::disable

The get_enable_state  function checks the current status of a trigger; by passing the
trigger identification number, you get in return the state of the trigger. If a trigger
is disabled, a call to get_enable_state  returns a value of false. If enabled, the return
value is true. To enable or disable a trigger, call on the enable function, using the
trigger's identification number as the only argument.

Each of the two functions scans the linked list of sTrigger structures. For get_enable_state,
the enabled flag value of the first structure found in the list that has a matching identification
number as the number provided in the ID argument is returned.

For the set_enable_state function, the linked list is scanned, and every instance of a structure
with a matching identification number as passed in the ID argument has its enabled
flag set to the value as provided in the Enable argument. Take a look at each function’s
code:

bool cTrigger::get_enable_state(long id)
{
    
for(sTrigger* trig = m_root_trigger; trig != NULL; trig = trig->next)
    {
        
if(trig->id == id)
            
return trig->enabled;
    }

    
return false;
}

void cTrigger::set_enable_state(long id, bool state)
{
    
for(sTrigger* trigger = m_root_trigger; trigger != NULL; trigger = trigger->next)
    {
        
if(trigger->id == id)
            trigger->enabled = state;
    }
}

cTrigger::get_num_triggers and cTrigger::get_root_trigger

As I like to do with all my classes, I have included two functions that you can use to
retrieve the number of sTrigger structures in the linked list as well as the pointer to
the first structure (the root, or parent, structure) contained with the list.

 

Using Triggers

As I promised in the section, “Using Map Triggers,” you now revisit using files to store triggers
on a map, this time using the cTrigger class created in the section “Creating a Trigger Class.”
In this section, you find out how to define and load a trigger file effectively.

 

Defining a Trigger File

You start with a sample trigger data file (called test.trg):

1 0 1 -900 0 900 620
2 1 0 0 0 0 100 100 100
3 2 1 100 10 200 20 100
4 3 0 10 10 10 -100 -50 0 0 100

The first trigger (ID# 1) is a sphere located at -900,0,900 with a radius of 620. The
second trigger (ID# 2) is a box that covers the area from 0,0,0 to 100,100,100. The
third trigger (ID# 3) is a cylinder; its lower-middle point is at 100,10,200, it has a
radius of 20, and it extends up 100 units. The fourth trigger (ID# 4) is a triangle
that encloses the area from 10,10 to 10,-100 to -50,0; it has a Y-coordinate (the bottom
of the triangle) of 0 and extends 100 units upward. Notice that all other triggers
are disabled by default.

 

Loading a Trigger File

To load the trigger file, instance the cTrigger file and call Load:

cTrigger Trigger;
Trigger.load(“test.trg”);

 

Touching a Trigger

Finally, to see whether a trigger is touched by a character, call GetTrigger with the
character’s coordinates:

long TriggerID;
TriggerID = Trigger.get_trigger(CharXPos, CharYPos, CharZPos);
 

if(TriggerID)
  MessageBox(NULL, “Trigger touched!”, “Message”, MB_OK);

With this admittedly simplified example of loading and using the cTrigger class
under your belt, you might want to work through the Mapping example program
to get more experience with creating, loading, and checking for character-to-trigger
collisions using the cTrigger class.


posted on 2007-12-10 11:34 lovedday 阅读(153) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


公告

导航

统计

常用链接

随笔分类(178)

3D游戏编程相关链接

搜索

最新评论