Adding
Barriers with cBarrier
Even though the barrier class
marks areas on the map using geometric shapes in
exactly the same way as the trigger class does, the barrier class also positions
meshes.
Looking again at the cBarrier class declaration, notice that each of the add
barrier
functions — add_sphere, add_box, add_cylinder, and add_triangle—have a set of
coordinates
that position and rotate the barrier’s mesh before being rendered.
To determine where the mesh is
positioned, set the x_pos, y_pos, and z_pos arguments
of the add barrier functions to where you want the mesh rendered. You also need
to set the x_rot, y_rot, and z_rot arguments to the rotational values to draw
the mesh.
For example, say that you want
to add a spherical barrier that already has a mesh
assigned. The barrier is positioned at coordinates 10,20,30 (with a radius of
40),
while the mesh is positioned at 10,0,30 using no rotational values. To add the
barrier,
you call the add_sphere function as follows:
cBarrier::add_sphere(1,
TRUE,
10.0f, 0.0f, 30.0f, 0.0f, 0.0f, 0.0f,
10.0f, 20.0f, 30.0f, 40.0f);
You get a better understanding
of adding and using barriers in the next section.
Using the
Barrier Class
Using the barrier class is not
difficult; it’s much like using the trigger class. The
biggest difference is that you have to add object placement data to the barrier
data
files and assign the appropriate meshes and animations.
Creating the
Barrier Data File
The barrier data files are
arranged just like trigger data files, except that you start
each barrier definition with the identification number, type, enabled flag,
placement
coordinates (X, Y, Z), and rotations (X-rotation, Y-rotation, and Z-rotation) to
place the barrier graphics object. Finish each definition with the respective
barrier
type’s data.
The following defines two
barriers to use (contained in a file called test.bar). Note
that the coordinates and rotational values of the barrier are shown in bold:
1 1 1 -900 0 0
0 0 0 -1154 0 10 -645 100 -10
2 1 0 0 0 -900 0 1.57 0 -10 0 -1154 10 100 -645
Here are two barriers, both
using a box shape. The first barrier’s graphics object is
placed at -900,0,0 and has rotational values of 0,0,0. The first box covers the
area
from -1154,0,10 to -645,100, -10.
The second barrier has a
graphics object placed at 0,0, -900 and has rotational values
of 0,1.57,0. The second barrier covers the area from -10,0,-1154 to 10,100,-645.
Loading the
Barrier Data
In order to load and use a
barrier data file, instance the cBarrier class, load the data
file and appropriate meshes, and assign the meshes:
cBarrier
Barrier;
// Load a barrier data file
Barrier.Load(“test.bar”);
// Load a mesh and animation to use
cMesh Mesh;
cAnimation Anim;
Mesh.Load(“barrier.x”);
Anim.Load(“barrier.x”, &Mesh);
// Assign mesh and animation to both barriers loaded
Barrier.SetMesh(1, &Mesh);
Barrier.SetMesh(2, &Mesh);
Barrier.SetAnim(1, &Anim, “AnimationName”, 0);
Barrier.SetAnim(2, &Anim, “AnimationName”, 0);
Checking
Barrier Collisions
To see whether an area on the
map is blocked, call get_barrier with the character
coordinates. If a value of TRUE is returned, passage is blocked, and you should
take
appropriate actions. Take the following example that checks a character’s
coordinates
against all barriers loaded from the barrier list.
You use a trio of values that
represents the direction the character is moving in
each axis to determine beforehand whether the movement is blocked by a barrier.
Say that a character is moving 10 units in the position Z-axis, meaning that the
upcoming ZMove variable will be set to 10. That ZMove variable is added to the
character’s
current position, and if intersecting with a barrier, that ZMove variable is
cleared
out, thus not allowing such a movement along the axis, as shown here:
// XPos, YPos,
ZPos = character coordinates
// XMove, YMove, ZMove = character movement values
if(Barrier.get_barrier(XPos+XMove,YPos+YMove,ZPos+ZMove)) {
// Passage not allowed, clear movement variables
XMove = YMove = ZMove = 0.0f;
}
Rendering Barriers
Last, you only need to call
cBarrier::Render to draw all barrier objects within view:
// Frustum = pre-initialize
cFrustum object
Barrier.render(timeGetTime(), &Frustum);