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:
- Dies ist keine Funktion sondern ein Makro, das zum Sicherstellen, daß das Level vor dem Weitermachen geladen ist, wait() verwendet.
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:
- Wird diese Funktion das erste Mal aufgerufen, wird ein Array von Terrainorten erstellt. Dies verhindert, dass zwei Entities an demselben Punkt platziert werden. Der Array-Pointer wird in skill90 der Terrain-Entity gespeichert. Bevor das Level verändert oder das Terrain entfernt wird, sollte er über sys_free(terrain.skill90); freigesetzt werden. Falls nicht, geschieht dies automatisch per sys_exit().
- Wird im gewünschten Höhenbereich kein freier Platz gefunden, wird die Entity sonstwo oder an eine bereits besetzte Stelle platziert.
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:
- Die ent_seed Funktion erzeugt die Entities an zufälligen Positionen innerhalb ihrer Maskenfarbe, und platziert den untersten Teil der Entities auf dem Boden.
- Die action kann verwendet werden, um der Entity einen zufälligen Winkel oder eine zufällige Größe zu geben. Warten Sie in der Aktion einen Frame (wait(1)), bis die Entity fertig platziert wurde, bevor Sie selbst die Position oder andere Parameter ändern; warten Sie einen weiteren Frame, bevor Sie ggf. das DYNAMIC Flag zurücksetzen.
- Zur Beschleunigung der Platzierung von nicht-kollidierenden Entities, wie Gras oder Pflanzen, setzen Sie collision_mode auf 0, führen dann ent_seed aus, und setzen danach collision_mode wieder zurück.
- Werte für mode können durch Addieren kombiniert werden. Benutzen Sie mode 2, um Gras-Sprites parallel zum Hang zu drehen, was realistischer aussieht.
- Ein PCX-Bild ist am besten für die Maske geeignet, da es die geringste Menge an Arbeitsspeicher und Festplattenspeicher benötigt. PCX-Bilder sind standardmäßig in 16 Bit Farbtiefe gespeichert, so dass die verwendeten Maskenfarben sich mindestens um 8 Farbstufen unterscheiden sollten.
- Siehe ent_create für allgemeine Bemerkungen über das Erstellen von Entities.
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