3D GAMESTUDIO-Magazin Ausgabe 01 | Oktober 20051
3D GAMESTUDIO-Magazin Ausgabe 01 | Oktober 20051
3D GAMESTUDIO-Magazin Ausgabe 01 | Oktober 20051
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
vec_sub(ziel_pos,player.x); // Bestimmung des Richtungsvektors<br />
vec_to_angle(player.pan,ziel_pos); // Drehung der Playerentity in Richtung der<br />
Zielpos.<br />
}<br />
player.tilt = 0;<br />
player.ziel = 1; // Spieler hat Zielposition zugewiesen<br />
Zeile 1-7 beziehen sich auf die Berechnung der x- und y-Position des Cursors und Umrechnung<br />
dieser Koordinaten mit Hilfe des "vec_for_screen" Befehls in einen Vektor. Diese Vektoren<br />
benötigen wir um mit dem "trace" Befehl von einem gedachten Punkt, direkt hinter dem Bildschirm<br />
hinein ins Level zutracen und zwar 5000 Quants hinter den Bildschirm. Der Schnittpunkt mit der<br />
Levelgeometrie wird im "target" Vektor gespeichert und gibt uns somit unseren Zielpunkt an.<br />
Danach bestimmen wir den Richtungsvektor von der Playerposition zur Zielposition mit "vec_sub"<br />
und anschließend drehen wir noch den Player in Richtung der Zielposition mit Hilfe des Befehls<br />
"vec_to_angle".<br />
Funktion "gravity_entity()"<br />
Folgt nun eine Funktion die verhindert das eine Entity aus irgendwelchen unvorhersehbaren<br />
Gründen in der Luft schwebt ohne herunter zufallen. Die "gravity_entity" Funktion.<br />
function gravity_entity()<br />
{<br />
vec_set (temp.x,nullvector);<br />
vec_set(temp,my.x);<br />
temp.z -=4000;<br />
trace_mode = ignore_me + ignore_sprites + use_box + ignore_models;<br />
result = trace(my.x,temp); // Trace auf den Boden<br />
if (result > 5)<br />
{<br />
}<br />
else<br />
{<br />
}<br />
force.z = -5; // Schwerkraft<br />
friction = 0.1;//Reibung<br />
force.z = -0.5 * result; // Boden-Elastizität<br />
friction = 0.5; // Bodenreibung<br />
my._vz_entity = time * force.z + max(1-time * friction,0) * my._vz_entity; //<br />
Geschw. vert.<br />
}<br />
abs_dist.z = time * my._vz_entity; // Distanz vertikal<br />
Die erste Zeile verwenden wir dazu um den Vektor "temp" zu löschen, also alle Werte auf Null zu<br />
setzen. Danach überschreiben wir den Vektor mit den Koordinaten der Entity. Nachdem wir der<br />
"temp.z" Variablen einen Wert 4000 Quants unter der Entity zugewiesen haben, führen wir einen<br />
"trace" von der EntityPosition zu einem Punkt 4000 Quants darunter durch. Stößt der Trace auf ein<br />
Hindernis wird diese Entfernung in der Variablen "result" gespeichert und dient uns somit zur<br />
weiteren Berechnung. Ist das Ergebnis der Result-Variablen größer als 5 Quants setzen wir die<br />
Schwerkraft auf den Wert -5 und die Reibung, da wir uns ja folglich in der Luft befinden, auf einen<br />
sehr niedrigen Wert hier 0.1. Sollte das Gegenteil der Fall sein und unser "result" ist kleiner als 5<br />
oder hat gar einen negativen Wert, was bedeuten würde, daß die Entity schon in den Boden<br />
<strong>3D</strong> <strong>GAMESTUDIO</strong>-<strong>Magazin</strong> ■ <strong>Ausgabe</strong> <strong>01</strong> | <strong>Oktober</strong> 2005 │70