|
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.
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.
Nun sehen Sie das Anpassungspanel des "feindlichen" (KI)-Autos. Gehen wir nun mal durch all seine Felder:
- "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).
Übrigends: wenn Sie vergessen, die KI-Nummer für eines oder mehrere der Feindautos zu setzen, werden Sie daran erinnert, es zu tun:
Zum Schluß habe ich das Player-Auto (bmw.mdl) im Level platziert und ihm die Player-Auto-Aktion t7_players_car zugewiesen.
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! |