Auto-Templates 2

Top  Previous  Next

Diesen Monat werden wir unserem Template feindliche (KI-kontrollierte) Autos hinzufügen. Bevor wir da aber eintauchen, sprechen wir noch ein bisschen über die Richtlinien von Templates. Ich würde sagen, dass das neue Templatesystem sehr einfach zu handhaben ist und funktioniert. Sie müssen lediglich eine Datei einfügen wenn Sie Neues zum Herumspielen haben wollen.

 

#include "t_car.h" // get access to player's car action

#include "t_car_cameras.h" // get access to the camera functions

#include "t_car_ai.h" // get access to the enemy cars actions

 

Das Auto-Template hat sich seit letzten Monat sehr stark im Inneren, im Äusseren aber kaum verändert. Der einzige Unterschied, den Sie bemerken werden, ist der, dass wir nun anstelle der .c-Dateien .h-Dateien in unsere Projekte einfügen. Dies geschah weil die .c-Dateien nun eigenständige Skripte sind, die ohne irgendetwas sonst laufen können. Die .h-Dateien hingegen erlauben es uns, das Verhalten von Entities aus den .c-Dateien anzupassen.

 

Nehmen wir die Datei t_car.c als Beispiel. Das ist ein Skript, das aus sich selbst heraus läuft und dabei Default-Werte für Geschwindigkeit, Beschleunigung usw. verwendet. Sie könnten t_car.c in Ihre eigenen Projekte einbinden und ein auf Physik basierendes Auto bekommen, das vom Spieler gesteuert werden kann. ODER, Sie können die Datei t_car.h in Ihre Projekte aufnehmen und dasselbe auf Physik basierende Auto bekommen, diesmal aber ein Auto, das ganz nach Ihren Wünschen angepasst werden kann. Wollen Sie neue Templates erstellen, untersuchen Sie meinenen Template-Auto-Code und folgen Sie den Richtlinien für Templates auf Contitecs Webseite.

 

Nachdem diese Dinge gesagt sind, öffnen wir nun die Haupt-.c-Datei, die den Autoe-Templates dieses Monats beigefügt ist:

 

#include <acknex.h>

 

#include "t_car.h" // template car code

#include "t_car_cameras.h" // car camera code

#include "t_car_ai.h" // enemy cars AI code

 

ENTITY* sky =

{

       type = "skycube+6.tga";

       flags2 = SKY | CUBE | SHOW;

}

 

function main()

{

       video_screen = 1; // start the game in full screen mode

       video_mode = 8; // run at a 1024x768 pixels resolution

       camera.arc = 100; // set a proper camera arc value

       level_load("car_test.wmb");

}

 

Es sieht alles einfach aus mit unseren eingefügten .h-Dateien: eine Sky-Cube-Definition und eine kleine main()-Funktion. Starten Sie das Skript und fahren Sie mithilfe der WSAD- oder Pfeiltasten solange bis Sie hinter die Flaggen am Ende der Rennstrecke angelangt sind. Vergessen Sie nicht, wenn sie irgendwo im Level stecken bleiben, die E- oder L-Taste zu benutzen.

 

aum86_template1

 

Diesem Demo sind 3 "Feindautos" von bläulicher Farbe beigefügt. Schauen wir mal, was innerhalb der Datei t_car_ai.h angepasst werden kann: Klicken Sie in WED auf den Tab "Resources" (Quellen), wählen Sie "script files" (Skriptdateien), navigieren Sie sich zur Datei t_car_ai.h, klicken Sie mit der rechten Maustaste darauf und suchen Sie sich dann, wie im Bild unten, "Customize" (Anpassen) aus.

 

aum86_template2

 

Nun sehen Sie das Anpassungspanel des "feindlichen" (KI)-Autos. Gehen wir nun mal durch all seine Felder:

 

aum86_template3

 

- "Maximum AI Speed" (maximale KI-Geschwindigkeit) setzt die Maximalgeschwindigkeit für die Feindesautos. Jedes Auto bewegt sich mit einer geringfügig zufälligen Geschwindigkeit, so, dass jedes Rennen anders verläuft.

 

- "Distance between AI cars and ground" (Abstand zwischen KI-Autos und Untergrund) setzt den Abstand in Quants zwischen dem Autokörper und dem darunterliegenden Terrain. Spielen Sie mit diesem Wert bis die Räder der KI-Autos einen flachen Bereich Ihres Levels gerade noch berühren.

 

- "Sensitivity to cars that get in the way" (Empfindlichkeit gegenüber Autos, die in den Weg geraten) gibt den Abstand an, der die Hupsignale / das Verringern der Geschwindigkeit auslöst wenn ein anderes Auto, sei es das des Players oder ein anderes KI-Auto, in den Weg gerät. Die KI-Autos werden langsamer und hupen und versuchen damit, wann immer möglich, eine Kollision zu vermeiden. Dieser Wert gibt ihre Sensibilität an wobei höhere Werte sie wachsamer macht.

 

- "Wheel offsets on X Y Z" (Rad-Offsets auf X Y Z) gibt, genauso wie das für das Player-Auto gemacht wird, das Offset der Räder in Relation zum Körper des Autos an. Wir setzen nur die Räder auf der linken Seite, die auf der Rechten stellen sich automatisch ein.

 

- "Distance to the "end of race" trigger" (Abstand zum Auslöser für "Ende-des-Rennens") gibt den maximalen Abstand zwischen dem Auslöser "Rennen ist vorbei" (darüber später mehr) und den KI-Autos, um diese zu stoppen. Der Rest der Anpassungsoptionen erklärt sich von selbst und befasst sich mit externen Dateien, die sich unseren Anforderungen gemäß ändern lassen.

 

Wenn Sie das Level in WED untersucht haben, haben Sie festgestellt, dass es extrem einfach ist, ein Auto-Temlate-Demo zu erstellen. Ich habe drei sich ähnelnde Pfade gemacht. Ich weiß, sie sind nicht perfekt, seien Sie also so frei, ein paar der Knotenpunkte rauf oder runter zu ziehen bis sie zu dem Terrain in diesem Bereich passen. Dann habe ich drei Feindautos (bmwai.mdl) nahe an den Autsgangspunkten der Pfade platziert und ihnen dieelbe Aktion -t7_ai_car zugewiesen. Jedes Auto erkennt den ihm am nächsten liegenden Pfad und wird ihn automatisch benutzen. Oh und vergessen Sie nicht eine individuelle KI-Nummer, die Ai_number (skill1) für jedes Feindauto zu setzen. Dafür können Sie Werte zwischen 1 und 12 benutzen (das Template erlaubt es uns, bis zu 12 gleichzeitig fahrende Feindautos zu haben).

 

aum86_template5

 

Übrigends: wenn Sie vergessen, die KI-Nummer für eines oder mehrere der Feindautos zu setzen, werden Sie daran erinnert, es zu tun:

 

aum86_template6

 

Zum Schluß habe ich das Player-Auto (bmw.mdl) im Level platziert und ihm die Player-Auto-Aktion t7_players_car zugewiesen.

 

aum86_template4

 

Beachten Sie bitte, dass das Playerauto einen kleinen Vorsprung hat. Ich habe das mit Absicht gemacht, denn die KI-Autos dürfen sich ganz am Anfang für ein paar Frames bewegen, damit sie sich auf ihre Pfade ausrichten können und dadurch bewegen sie sich bereits ein bisschen in Richtung Player.

 

Fast hätte ich den Auslöser "Ende des Rennens" vergessen. Das ist eine Entity die still am Ende des Levels sitzt und sämtliche Autos (einschließlich des Player-Autos), die ihm nah genug kommen stoppt. Sie können einen oder, wenn Ihre Rennstrecke sehr weit ist, auch mehrere "Ende des Rennens"-Autslöser in ein- und demselben Level benutzen und Sie können diese passable, invisible etc. machen (oder nicht). Vergessen Sie nicht, dass Sie auch den Abstand, der die Autos am Ende der Rennstrecke anhalten lässt, individuell einstellen können.

 

Ich weiß nicht, wie es Ihnen geht aber ich mag die Flexibilität dieses Auto-Templates wirklich gern. Die gute Nachricht ist die, dass es noch mehr Gutes zu entdecken gibt. Öffnen Sie main2.c in SED und wir schauen es genau an:

 

#include <acknex.h>

 

#include "t_car.h" // template car code

#include "t_car_cameras.h" // car camera code

#include "t_car_ai.h" // enemy cars AI code

 

Zuallererst fügen wir unsere normalen .h-Dateien ein. Hier gibt es nichts Aufregendes.

 

var t7car_race_started = 0;

 

Die obige Zeile ist die wichtigste in diesem Skript. Sie setzt die Variable namens t7car_race_started auf Null. Diese Variable ist auch in t_car.c definiert und ihr Wert ist dort auf 1 gesetzt was den Autos sagt, dass sie sich in Bewegung setzen sollen sobald das Level geladen ist. Indem sie hier auf Null gesetzt wird, stoppen wir sämtliche Autos (einschließlich des Playerautos) und können daher entscheiden, wann das Rennen starten wird.

 

SOUND* getready_wav = "getready.wav";

 

ENTITY* sky =

{

       type = "skycube+6.tga";

       flags2 = SKY | CUBE | SHOW;

}

 

PANEL* splash_pan =

{

       bmap = "splash.pcx";

       layer = 15;

       pos_x = 0;

       pos_y = 0;

}  

 

PANEL* red_pan =

{

       bmap = "red.tga";

       layer = 15;

       pos_x = 395;

       pos_y = 267;

}  

 

PANEL* yellow_pan =

{

       bmap = "yellow.tga";

       layer = 15;

       pos_x = 395;

       pos_y = 267;

}  

 

PANEL* green_pan =

{

       bmap = "green.tga";

       layer = 15;

       pos_x = 395;

       pos_y = 267;

}  

 

Wir haben einen Soundeffekt namens getready_wav definiert sowie unsere alte Sky-Cube-Entity, ein Splash-Screenpanel und 3 verschiedene Panels für die Farben rot, gelb und grün einer Ampel.

 

function main()

{

       video_screen = 1; // start the game in full screen mode

       video_mode = 8; // run at a 1024x768 pixels resolution

       camera.arc = 100; // set a proper camera arc value

       set (splash_pan, SHOW);

       level_load("car_test.wmb");

       wait (-6);

 

Die Main-Funktion macht die normalen Dinge, stellt dann das Splash-Screenpanel dar und lädt das Level. Der Splash-Screen ist für etwa 6 Sekunden sichtbar (in Wahrheit für weniger Sekunden, denn die Engine braucht etwas Zeit, um ihr Fenster darzustellen).

 

       reset (splash_pan, SHOW); // now hide the splash screen

       media_loop("trance.mp3", NULL, 80); // start the soundtrack

       wait (-1);

       set (red_pan, SHOW);

       snd_play(getready_wav, 100, 0);

       wait (-1);

       reset (red_pan, SHOW);

       wait (-0.5);

       set (yellow_pan, SHOW);

       snd_play(getready_wav, 100, 0);

       wait (-1);

       reset (yellow_pan, SHOW);

       wait (-0.5);

       set (green_pan, SHOW);

       snd_play(getready_wav, 100, 0);

       wait (-1);

       reset (green_pan, SHOW);

       wait (3);

       t7car_race_started = 1; // now allow player's car and the enemy cars to start moving

}

 

Die dann folgenden Codezeilen verstecken das Splash-Screenpanel, starten einen Soundtrack, trance.mp3, stellen die Rot- / Gelb- / Grün-Panels dar und spielen den Soundeffekt getready_wav ab. Zum Schluß wird t7car_race-started auf 1 gesetzt und die Feindautos somit zum Starten des Rennens veranlasst und dem Player die Kontrolle über sein Auto ermöglicht. Starten Sie main2.c und Sie sehen wie das alles auf Ihrem Bildschirm passiert.

 

Und da haben Sie es: ein respektables Rennspiel, das einen Splash-Screen, eine Signalampel usw. beinhaltet und für das lediglich 30-40 kurze und einfache Codezeilen sowie das Car-Template benutzt wurden. Für heute war das alles, ich freue mich darauf, Sie alle nächsten Monat wieder zu sehen!