level.c

Diese include-Datei enthält oft gebrauchte kleine Funktionen im Zusammenhang mit Levels, wie etwa das Kacheln von Terrain, das Platzieren von Entities auf Terrain und das Generieren eines endlosen Terrain-Levels. Die Funktionen sind einfach genug, um mit einem Blick verstanden zu werden. Beispiele, wie man sie benutzt, finden sich in dem Sample infinite_terrain.c. Wollen Sie diese Funktionen verändern, editieren Sie bitte eine Kopie von level.c in ihrem Work-Ordner und nicht die Originaldatei im include-Ordner.

level_loadendless (STRING* filename);

Lädt ein Level das, sich endlos in alle Richtungen wiederholt. Dafür werden 8 zusätzliche Views erstellt, die die Fortsetzung des Levels in 8 Richtungen rendern, sowie ein weiterer Extraview für den Sky. Die 9 Views werden vom Kamera-View upgedatet. Der Kamera-Parameter clip_far wird auf die Levelgröße gesetzt. Überquert die Kamera eine Levelgrenze, wird sie automatisch an die entgegengesetzte Grenze des Levels zurückplatziert, so dass der User den Übergang nicht bemerkt.

Parameter:

filename - STRING* oder char*; Name der Map-, Modell- oder Terrain-Datei.

Beispiel:

function main()
{
   level_loadendless("terrain.hmp"); 
   terrain_tile(level_ent);
ent_createlayer("skycube+6.dds",SKY|CUBE|SHOW, 0); def_move(); // default movement from default.c }

level_loadsplash (STRING* filename,STRING* bmapname,var mode)

Lädt ein Level und zeigt derweil einen Splash-Screen an. Der Splash wird für ca. 2 Sekunden angezeigt und blendet dann aus.

Parameters:

filename - STRING* oder char*; Name der Levelmap, des Modells oder der Terraindatei.
bmapname - STRING* oder char*; Name der Splash-Screen-Bitmap. Ist sie von anderer Größe als der Screen, wird sie gestreckt.
mode - zum Laden von Balken, Ausschalten des Blendens o. ä., wird noch nicht benutzt.

Bemerkungen:

Beispiel:

function main()
{
   level_loadsplash("racetrack.wmb","racesplash.pcx",0); 
   tcar_race_start();

}

terrain_tile (ENTITY_T* terrain);

Macht die Terrain-Entity kachelbar indem alle Grenzvertices auf dieselbe Höhe eingestellt werden. Dies wird für level_loadendless() gebraucht wenn das Terrain sich nicht selbst kachelt.

Parameter:

terrain - Terrain-Entity-Pointer

terrain_fence (ENTITY_T* terrain, var height)

Errichter eine Einfassung der gegebenen Höhe um die Terrain-Entity indem er ihre Kanten nach oben biegt. Läßt sich dazu verwenden, zu vermeiden, daß die Leute über den Rand der Welt fallen.

Parameter:

terrain -Terrain-Entity-Pointer
height - Höhe der Begrenzung.

Bemerkungen:

Wird Physik verwendet, registrieren Sie die Terrain-Entity nach der Deformation mit PH_POLY|PH_MODIFIED bitte neu. Ansonsten wird die Kollisionserkennung der Physik immer noch die Originalform des Terrains verwenden.

ent_terrain_place (ENTITY_T* ent, ENTITY_T* terrain, var minheight, var maxheight);

Platziert eine Entity innerhalb eines bestimmten Höhenbereichs auf eine zufällige Position des Terrains.

Parameter:

ent - zu platzierende Entity.
terrain - Terrain-Entity-Pointer
minheight - platziere die Entity oberhalb dieser Höhe, in Prozenten der Terrainhöhe (0.. 100)
maxheight - platziere die Entity unterhalb dieser Höhe, in Prozenten der Terrainhöhe (0.. 100)

Bemerkungen:

Beispiel:

action place_me()
{
   vec_scale(my.scale_x,0.5+random(1.5));
   ent_terrain_place(me,level_ent,50,90);
}


function main()
{
   level_load("terrain.hmp"); 
   int i;
   for (i=0; i < 500; i++)
     ent_create("tree.mdl",NULL,place_me);
}	 

ent_seed (char* name, ENTITY* terrain, BMAP* mask, COLOR* color, var dist, var mode, EVENT act): var

'Pflanzt' eine Anzahl von Modellen oder Sprites auf Terrain mit Hilfe einer farbkodierten Maske. A8.11

Parameters:

name - Dateiname des Modells oder Sprites, char* or STRING*.
terrain - Terrain Entity Pointer, oder NULL für einen Terrainlevel.
mask - Pointer auf die Bitmap mit der Farbmaske, oder NULL zur Verwendung der ersten Terrain-Skin als Maske.
color - Farbvektor. Die Entities werden an den Stellen gepflanzt, an denen die Maske diese Farbe enthält.
dist - Mittlere Distanz zwischen den Entities. Eine kleinere Distanz erzeugt eine größere Zahl von Entities.
mode - 0 = Verwende Terrainvertices für die Platzierung, 1 = Verwende c_trace (langsamer aber präziser), 2 = Entity gemäß der Neigung des Untergrunds drehen, 4 = Entity gemäß der Neigung des Untergrunds neigen.
act - Entity-Action, oder NULL für keine Action.

Returns:

Zahl der erzeugten Entities

Verändert:

entity.skill61..skill63 - gesetzt auf die Normale des Untergrunds, wenn mode > 0.

Bemerkungen:

Beispiel:

#define COLOR_TREE vector(0,255,0)
#define COLOR_GRASS vector(255,255,0)
 
action place_tree()
{
  vec_scale(my.scale_x,1+random(0.5));
  my.eflags |= CLIP1;   // clip away at 50% LOD range
  wait(1);   // wait until it's placed by ent_seed
  my.z -= 5; // place it a little lower
  my.pan = random(360);
  my.tilt = random(20)-10;
  wait(1); // wait 1 frame after the last change, 
  my.emask &= ~DYNAMIC; // then make entity static for better performance
}

action place_grass()
{
  vec_scale(my.scale_x,0.75+random(0.5));
  my.flags |= PASSABLE | TRANSLUCENT;
  my.alpha = 70;
  my.eflags |= CLIP1; 
  wait(1);
  my.emask &= ~DYNAMIC;
}

function main()
{
  max_entities = 10000;
  level_load("terrain.hmp");
  BMAP* bSkin = bmap_create("terrain_vegetation.pcx");
  ent_seed("tree.mdl",level_ent,bSkin,COLOR_TREE,50,0,place_tree);
	wait(1); // let the place_tree actions terminate before creating more entities
  collision_mode = 0; // faster creation for PASSABLE entities
  ent_seed("grass.dds",level_ent,bSkin,COLOR_GRASS,30,2,place_grass);
  collision_mode = 1;
}

 

terrain_height (ENTITY_T* terrain, VECTOR* position);

Berechnet die Höhe des nächsten Terrain-Vertex´ an der gegebenen Position. Diese Funktion ist weniger genau, aber i.A. schneller als ein Aufruf von c_trace.

Parameter:

terrain - Terrain-Entity-Pointer; muß entweder parzelliertes Terrain sein oder die Level-Entity eines Terrain-Levels.
position - die xy-Position auf dem Terrain.

Rückgabewerte:

Z-Wert des Terrain-Vertex´, der den gegebenen xy-Koordinaten am nächsten liegt.

terrain_pos(ENTITY_T* terrain,var x,var y,var z): VECTOR*

Liefert eine Position über dem Grund des Terrains für eine gegebene x y z-Position zurück. Nutzen Sie diese Funktion zum einfacheren Platzieren von Entities auf Terrain.

Parameter:

terrain - Terrain-Entity-Pointer oderNULL für die Level-Entity eines Terrain-Levels.
x, y - die x y -Position auf dem Terrain
z - der vertikale Abstand zur Oberfläche des Terrains.

Rückgabewerte:

VECTOR* - temporärer Vector zur Verwendung als eine Position über dem Terraingrund.

Beispiel:

function main()
{
  level_load("terrain.hmp"); 
  ent_create("tree.mdl",terrain_pos(NULL,100,100,-10),NULL); // plant the tree 10 units in the ground, at position (100,100). 
}

Siehe auch:

Terrain, level_load

► latest version online