11.07.2015 Aufrufe

3D GAMESTUDIO-Magazin Ausgabe 03 | März 20061

3D GAMESTUDIO-Magazin Ausgabe 03 | März 20061

3D GAMESTUDIO-Magazin Ausgabe 03 | März 20061

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

<strong>3D</strong> <strong>GAMESTUDIO</strong>-<strong>Magazin</strong> ■ <strong>Ausgabe</strong> <strong>03</strong> | <strong>März</strong> 2006 │1


VorwortLiebe Leserin, lieber Leser,und weiter geht’s mit einer dritten <strong>Ausgabe</strong> des <strong>3D</strong> GameStudio <strong>Magazin</strong>es. In dieser <strong>Ausgabe</strong> gibtes wie immer Tutorials, Interviews und andere Informationen Rund um das <strong>3D</strong> GameStudio.Um die nächsten <strong>Ausgabe</strong>n noch besser und größer zu machen, hoffen wir auf Ihre Unterstützung!Inhalt• C-Lite Ein Preview• Player Tutorial• Modelldesign - Teil 2: Mapping des Tischs in Blender• KI oder: Wie die Bots den Weg Finden!• Jetzt gibt´s auf die Ohren! Soundeffekte erstellen - Teil 1• Indoor Leveldesign• Wind Nord / Ost, Startbahn null drei...Ein Physikobjekt als Flugzeug• Eigene Hardware ansteuern – Ein Parallelporttutorial• Interview mit dem Mausgame Team• Interview mit Sebastian Leopold über TeamOrgDer Schwierigkeitsgrad als AnzeigeIn eigener Sache:Wenn Sie der Meinung sind, einen Beitrag leisten zu können, kontaktieren Sie einen der <strong>3D</strong>GS-<strong>Magazin</strong>Autoren. Oder über das Forum welches auch über http://3dgsmag.ma-pre.de/forum zu erreichen ist.Das <strong>3D</strong>GS-MAGAZIN Team<strong>3D</strong> <strong>GAMESTUDIO</strong>-<strong>Magazin</strong> ■ <strong>Ausgabe</strong> <strong>03</strong> | <strong>März</strong> 2006 │2


C-Lite... Ein Preview-Artikel über C-Litevon Timo StarkHallo,In den folgenden Artikel geht es um die Möglichkeiten, Probleme und Neuerungen mit C-Lite, derneuen Programmiersprache der A6-Engine.Ich hoffe ich kann Ihnen durch den Artikel die Angst vor dem Umstieg auf C-Lite in freudigeErwartung umwandeln.AllgemeinesC-Lite ist eine vereinfachte Version der Programmiersprache Ansi-C und wird von demProgrammierer Wan Tian Yi programmiert. Das Ziel dieser neuen Programmiersprache ist es denalten und, für heutige Zeiten zu unflexiblen, C-Script Compiler von Volker Kleipa zu ersetzten. Dasangestrebte Release Datum von Conitec ist das erste Quartal 2006. Vermutlich wird der Lite-CCompiler also mit dem Update auf A6.5 erscheinen. Wenn Sie keine Engine-basierten Variablen /Funktionen benutzen können Sie also den Code in einen ganz normalen C-Script Compilereinfügen.Möglichkeiten mit C-LiteAuch wenn es für viele Anfänger so scheint. C-Lite wird das programmieren vermutlich nichterschweren sondern nur sehr vereinfachen. Durch einige Vereinfachungen der CProgrammiersprache wird der Umstieg nicht zu schwer fallen.Die Neuerungen sind unter anderem:• Verschiedene Variablen-Typen (alle C/C++ Standard Variablen).• Unterstützung von Strukturen.• Unendlich viele Parameter pro Funktion.• Zugriff auf System Dll’s und das Component Objects Model. Was dies bringt werde ichspäter noch erläutern.• Jeder Dateityp kann lokal definiert werden. So können z.B. Strings lokal innerhalb einerFunktion definiert werden.• Funktionen können verschiedene Variablen Typen zurückgeben.• Switch / Case Bedingungen und For, Do-While Loops sind erlaubt.• Möglichkeit des Überladens von Funktionen.• Mehrdimensionale Arrays.Im folgendem werde ich nun auf alle wichtigen Neuerungen eingehen:Mehr VariablentypenIn C-Lite werden wesentlich mehr Variablentypen unterstützt als in C-Script (das ja nur „var“unterstützt). Im folgendem sind alle Standard- Variablentypen aufgelistet:Typ-Name Speicherverbrauch Wertebereich Nachkommastellen?int 4 Byte +/-2147483648 0 Stellenvar 4 Byte +/-2147483648 3 Stellenshort 2 Byte -32768 bis +32768 0 Stellenlong 4 Byte +/-2147483648 0 Stellenchar 1 Byte -128 bis +127 0 Stellenfloat 4 Bytes +/- 3.4E +38 6 Stellendouble 8 Bytes +/- 1.7E +308 15 Stellenlong double 10 Bytes + 1.1E + 4932 19 Stellen<strong>3D</strong> <strong>GAMESTUDIO</strong>-<strong>Magazin</strong> ■ <strong>Ausgabe</strong> <strong>03</strong> | <strong>März</strong> 2006 │3


Wie Sie anhand dieser Tabelle eindrucksvoll sehen, können Sie mit Lite-C sehr viel genauer und ingrößeren Zahlenbereichen rechnen. Mit dem Wert Long-Double können Sie in Bereichen von -1.099.511.627.776 bis + 1.099.511.627.776 (1 Billionen) rechnen. Dies ist einer der vielenVorteile von C-Lite in Gegensatz zu Cscript.Trotzdem ist auch zu beachten, dass diese Variablen sehr viel mehr Speicherplatz wegnehmen, alsder Standard C-Script Variablen Typ „var“. Sie sollten auch kleinere Dateitypen wie short und charnicht vergessen. Chars werden meistens für Zeichen (Strings) benutzt (ein Zeichen kann genau dieWerte 0 – 255 haben -> http://www.asciitable.com ).Anhand dieser vielen möglichen Variablen Typen stellt sich nun auch ein neues Problem. Bis jetztkonnte eine Funktion immer nur einen Wert zurückgeben. Und zwar ein Wert des Typs „var“. Nunkönnte eine Funktion ja auch den Typ long double, oder float zurückgeben. Dies muss denCompiler bei der Funktionsdefinition mitgeteilt werden. Code technisch sieht dies dann so aus:DATEITYP Funktionsname(Parameter){//Inhalt der Funktionreturn(Dateityp);}Also hier ein Beispiel:int IntAdd(int a,int b){return(a + b);}StrukturenMit Hilfe von Strukturen ist es möglich verschiedene Daten die logisch zusammengehören zu einemDatensatz zusammenzufassen. Auf Deutsch heißt das, dass Sie durch die Zusammenfassungmehrerer Variablen Typen eine neue Struktur erschaffen können. So könnte z.B. eine Struktur 20int und ein char Wert beinhalten, die die Eigenschaften einer Waffe speichern.Eine Struktur ist wie folgt aufgebaut:struct Name {//Dateitypen};Hier wieder ein praktisches Beispiel:struct Waffenbeschreibung {int weapon_damage;float weapon_reichweite;char weapon_name[128];}//...Waffenbeschreibung Weapon_mp5;Weapon_mp5.weapon_damage = 10;Weapon_mp5.weapon_reichweite = 3000;strncpy(weapon_name,"MP5",3);Switch / Case Abfragen und For / Do-While Loops sind erlaubtNeben den oben genannten Neuerungen, werden in C-Lite auch Switch/Case und For Loopsvorhanden sein, die das Abfragen von bestimmten Daten erleichtern.Switch / Case stellt eine große Erleichterung zu vielen If-Abfragen dar. Es wird hauptsächlich dazugenutzt, wenn man eine bestimmte Variable auf einen Werte prüfen will. Hier ein Beispiel:<strong>3D</strong> <strong>GAMESTUDIO</strong>-<strong>Magazin</strong> ■ <strong>Ausgabe</strong> <strong>03</strong> | <strong>März</strong> 2006 │4


Die letzte neue „Schleifenart“ ist die do-while Schleife, die eine sehr ähnlich wie die normale whileSchleife in C-Script benutzt wird. Der Unterschied ist, dass die Anweisungen innerhalb dergeschweiften Do Klammer einmal ausgeführt werden, bevor geprüft wird, ob die while Bedingungwar ist. Der Syntax der dowhile Schleife ist wie folgt:int x = 0;do{x += 10; //addiere 10 zu x} while(x < 10)//und prüfe erst nach dem DO-Block, ob die While Bedingung wahr ist.Zugriff auf externe API’sDie größte und beste Neuerung mit C-Lite ist allerdings die Möglichkeit auf externe API’szuzugreifen. So können Sie z.B. Alle Befehle der Windows-API (z.B. eine Message Box, oder einSpeichern-Dialog) direkt in C-Lite, ohne DLL, benutzen. Hier wie immer ein praktisches Beispiel:long WINAPI MessageBox(HWND,char*,char*,long); //definiere den WINAPI Befehl MessageBoxMessageBox(ev->hWnd,“Titel“,“Inhalt“,MB_OK);Falls Sie Befehle aus externen API’s benutzen wollen, werden Sie diese Befehle noch in einerexternen Definitions-Datei registrieren müssen.Überladen von Funktionen„Überladen von Funktionen“ meint, dass es möglich ist eine Funktion mit einer verschiedenenAnzahl bzw. verschiedenen Arten von Parametern und den gleichen Funktionsnamen zuinitialisieren. Ein Beispiel:int plus(int a,int b) { return(a+b); }float plus(float a,float b) { return(a+b); }short plus(short a, short b, short c) { return(a+b+c); }Mehrdimensionale ArraysMehrdimensionale Arrays werden mit den neuen C-Lite Compiler möglich sein. Praktisch sieht einmehrdimensionaler Array wie folgt aus:var array2d[5][2];array2d[0][2] = 2;Dies erleichtert die Programmierung von komplexen Themen wie Pathfinding enorm.Fragen und AntwortenIn diesem Kapitel werde ich auf häufige Fragen betreffend C-Lite eingehen:Werde ich meinen kompletten Code neu schreiben müssen, wenn ich auf C-Liteumsteigen will?Antwort: Nein dies wird nicht notwendig sein. Allerdings werden Sie trotzdem einigeVeränderungen am Sourcecode vornehmen müssen. Diese sollten allerdings nach ca. 2 Stundenbei einem 5000 Zeilen Code erledigt sein, was nicht zu viel Arbeit für die vielen neuenMöglichkeiten ist.<strong>3D</strong> <strong>GAMESTUDIO</strong>-<strong>Magazin</strong> ■ <strong>Ausgabe</strong> <strong>03</strong> | <strong>März</strong> 2006 │6


Wird C-Script auch nach dem Update noch unterstützt werden?Antwort: Ja. Die Acknex-Engine wird für einige Zeit (vermutlich ca. 1 ½ Jahre) sowohl C-Lite alsauch C-Script unterstützen.Wird es möglich sein C-Script und C-Lite zu mischen?Antwort: Dies wird möglich sein, allerdings nicht in der gleichen Datei. Falls Ihre Script-Datei mit*.wdl endet, wird Sie automatisch als C-Script interpretiert, falls Sie auf *.c oder *.h endetautomatisch als C-Lite Datei.Wann wird C-Lite in die Acknex Engine integriert werden?Antwort: Natürlich kann ich hier keine festen Zeiten angeben, ich rechne allerdings spätestens mitdem Update auf A6.5, dass ca. Im 1-2. Quartal 2006 erscheinen wird, mit C-Lite.Heißt C-Lite, dass ich nun eine komplett neue Programmiersprache lernen muss?Antwort: Nein auf keinen Fall. Wegen den vielen Syntax-Erleichterungen von C-Lite wird es fastkomplett möglich sein, den alten C-Script Code zu übernehmen und die neuen Features von Clitedann Schritt für Schritt zu nutzen / kennen zulernen.Mit freundlichen GrüßenTimo Stark (Triple-X)<strong>3D</strong> <strong>GAMESTUDIO</strong>-<strong>Magazin</strong> ■ <strong>Ausgabe</strong> <strong>03</strong> | <strong>März</strong> 2006 │7


Einen Player erstellenvon tuschcarstenHallo und herzlich Willkommen zum Player - Tutorial!Wenn man die Templates als Playerscript benutzt, ist man in seiner Freiheit recht eingeschränkt,man versteht die Scripte nicht ganz, weil überall Pointer, Variablen und Synonyme verwendetwerden, die dann irgendwo definiert sind und irgendwo anders wieder geändert werden……Außerdem besteht die Gefahr, dass ein Spiel mit den Templates sehr nach „zusammen geklickt“aussieht. Ich habe mich zuerst davor gefürchtet, meine eigenen Scripts zu schreiben, doch es istso wesentlich einfacher, glauben sie mir…Als erstes sollte man sich überlegen, wie der Spieler die Figur sehen soll Ego-Perspektive, 3rd-Person, von oben… Dann benötigen wir einen Raum, in dem der Player seine Fähigkeiten testenund sich mit den Scripten austoben kann. Außerdem sollte man ein Modell haben, welches alsPlayer dient:Erste CodezeilenIn diesem Falle möchten ich einen Ego-Player haben, das heißt, dass der Spieler das Spiel aus derSicht des Players spielt (wie z.B. in Crome, Unreal oder FarCry). Allerdings kann man später dieKameraperspektive ganz leicht ändern bzw. austauschen.Als erstes legen wir die Tasten für die Bewegung fest, damit man sie später wechseln kann, diesgeschieht mithilfe der Tastenscancodes, die man im Manual nachlesen kann://Tasten für die Bewegungvar move_forward = 17;var move_back = 31;var move_left = 30;var move_right = 32;var turn_left = 16;var turn_right = 18;var jumpkey = 57;var crawl = 46;var run = 42;//W um vorwärts zu laufen//S um rückwärts zu laufen//A um nach links zu laufen//D um nach rechts zu laufen//Q - links drehen//E - rechts drehen//Leertaste um zu springen//C um sich zu ducken//Shift zum rennenWir definieren also Variablen, die die Scancodes als Wert haben. Dann definieren wir einen Vektor,der die Bewegung des Players enthalten wird:var player_dist;//vektor für die Player-BewegungAußerdem soll ab jetzt mit „health“ der Wert von Skill1 angegeben werden:define health, skill1;Die BewegungDer Code für den Player selbst sieht so aus:<strong>3D</strong> <strong>GAMESTUDIO</strong>-<strong>Magazin</strong> ■ <strong>Ausgabe</strong> <strong>03</strong> | <strong>März</strong> 2006 │8


action player_move{}player = my;my.health = 100;while(my.health > 0){}// ich bin ab jetzt die Spielfigur// Ich habe 100 Lebenspunkte// während meine Lebensenergie größer als 0 istplayer_dist.x = (key_pressed(move_forward)-key_pressed(move_back))*10*time;player_dist.y = (key_pressed(move_left)-key_pressed(move_right))*10*time;camera.tilt -= 10*-mouse_force.y*time;player.pan -= 10*(mouse_force.x+(key_pressed(turn_left)-key_pressed(turn_right)))*time;camera_pos();schwerkraft();if(key_pressed(run) == 1){player_dist.x *=2;player_dist.y *= 2;if(key_pressed(jumpkey) == 1){jump();}if(key_pressed(crawl) == 1){}player_dist.z-=10;//nach unten „schieben“player_dist.x /= 2; //läuft langsamerplayer_dist.y /= 2; //läuft langsamermove_mode = ignore_passable+glide;ent_move(player_dist, nullvector);wait(1);}Die obigen Zeilen werde ich nun erklären:Die Aktion, die dem Player in WED zugewiesen wird heißt „player_move“. Der „PLAYER“-Pointerwird der Entity zugewiesen, so kann man später immer wieder die Position und Lebensenergie desPlayers abfragen.Dann kommt eine Schleife: Während der Player am Leben ist, also seine Lebensenergie mehr als 0beträgt wird die Schleife wiederholt…Jetzt wird dem Vektor player_dist, den wir eben definiert haben ein Wert zugewiesen. Die Zeilebesagt, dass dern Player mit der Vor- und Rückwärtstaste nach vorne und hinten laufen kann, alsowird die Geschwindigkeit des Players auf „10 mal (Taste_vor –Taste_zurück)“ gesetzt. Wird alsodie Taste_vor gedrückt ist die x-Geschwindigkeit des Players 10, wenn die Rückwärtstaste gedrücktist -10. Wenn keine oder beide Tasten gedrückt sind ist die Geschwindigkeit = 0. Dasselbegeschieht in der darauf folgenden Zeile mit der Seitwärtsbewegung, also Y-Geschwindigkeit.Die vertikale Drehung (TILT) wird von der y-Achse der Maus geändert. Die Horizontale Drehung(PAN) von der x- Achse der Maus und den Tasten zum drehen.In der nächsten Zeile werden die Funktionen camera_pos() und schwerkraft() aufgerufen. Wirwerden sie später noch schreiben…Die nächste Zeile überprüft, ob die Renntaste gedrückt ist. Ist dies der Fall, wird die x-und die yGeschwindigkeit verdoppelt. Die nächste if-Bedingung prüft, ob die Sprungtaste gedrückt ist. Wennja, dann wird die Funktion jump() ausgeführt, die wir gleich noch schreiben werden. Eine weitereIf-Verzweigung schiebt den Player nach unten und lässt ihn langsamer laufen, falls die „ducken-Taste“ gedrückt ist.<strong>3D</strong> <strong>GAMESTUDIO</strong>-<strong>Magazin</strong> ■ <strong>Ausgabe</strong> <strong>03</strong> | <strong>März</strong> 2006 │9


function camera_pos();Die Kamera ist unser Auge in der virtuellen Welt. Mit der folgenden Funktion lernen wir, wie siekontrolliert wird:function camera_pos(){}camera.genius = player;camera.x = player.x;camera.y = player.y;camera.z = player.z+30;camera.pan = player.pan;Da wir einen Ego-Player haben wollen, setzen wir camera.genius auf den Player-pointer. Dasbedeutet, dass der Player nur für die Kamera unsichtbar ist.In den nächsten beiden Zeilen wird die x- und y - Position der Kamera auf die des Players gesetzt.Die Zeile darunter setzt die Höhe der Kamera 30 Quants höher, als die des Players. Außerdem solldie horizontale Drehung, also der Pan-Wert gleich dem Wert des Players sein. Diese Funktion kann,falls man nicht die Ego-Perspektive haben will auch durch ein EasyCam-Script ersetzt werden.function schwerkraft();Damit der Player nicht ziellos durch die Luft wandelt, braucht er Schwerkraft.function schwerkraft(){}vec_set (temp, my.x);temp.z -= 1000;trace_mode = ignore_me + ignore_passable + use_box;my.skill3 = trace(my.x, temp);if (my.skill3 > 2){}else{}player_dist.z -= 2 * time;player_dist.z = 0;if (my.skill3 < 0){}player_dist.z += 2 * time;Die erste Zeile setzt den Vektor Temp, welcher immer verfügbar ist, auf die Koordinaten desPlayers. Dann wird 1000 von Temps Höhe abgezogen. Danach wird der Trace-Modus so eingestellt,dass der Player und Entities, die das „passable“ – Flag gesetzt haben ignoriert werden, außerdemwird die Bounding Box des Players zum tracen benutzt.Tracen bedeutet, dass quasi ein unsichtbarer Strahl von einer Position zu einer anderen geschicktwird. Wenn dieser Strahl dabei auf ein Hindernis stößt, wird die Koordinate in einer Variablegespeichert.Wir tracen jetzt also von der Position des Players 1000 Quants nach unten. Wenn dabei ein<strong>3D</strong> <strong>GAMESTUDIO</strong>-<strong>Magazin</strong> ■ <strong>Ausgabe</strong> <strong>03</strong> | <strong>März</strong> 2006 │10


Hindernis erkannt wird, wird der Abstand zwischen Player und Hindernis in „player.skill3“gespeichert.Die folgenden If-Anweisungen testen, wie weit der Player von einem Hindernis (dem Boden)entfernt ist. Ist er weiter als 2 Quants entfernt, wird er nach unten gezogen, indem die Z-Komponente des Vektors „player_dist“ verringert wird. Wenn der Player auf dem Boden ist, wirdseine Z-Geschwindigkeit auf 0gesetzt, denn wozu sollte er sich denn dann bewegen?Falls der Player im Boden steckt, wird er langsam wieder heraus geschoben, sodass er auchSchrägen hoch laufen kann.function jump();So. Jetzt fehlt eigentlich nur noch die Sprungfunktion. Dafür müssen wir noch eine neue Variabledefinieren, die für eine gleichmäßige Sprungbewegung sorgt:var jump_time = 1;Die eigentliche Funktion sieht dann so aus:function jump(){}exclusive_global;while (jump_time > -1){player_dist.z = 30 * time * jump_time;jump_time -= 0.11 * time;if(my.skill3 < 2){jump_time = 1;break;}wait (1);}while (key_pressed(jumpkey) == 1) {wait(1);}jump_time = 1;Die erste Zeile enthält einen Befehl, der alle bereits laufenden Kopien dieser Funktion Stoppt. Dannfolgt eine Schleife: Solange die Variable „jump_time“ größer als -1 ist, wird diese ausgeführt.Die Z-Geschwindigkeit des Players wird auf 30*jump_time gesetzt und mit der Variable „time“ sokorrigiert, dass die Funktionen auf allen Rechnern gleich schnell läuft. Danach wird der Wert derVariable jump_time verringert, was dazu führt, dass der player langsam wieder auf den Bodenfällt, da diese Befehle in einer Schleife stehen.Die folgende If-Anweisung prüft, ob der Player nicht schon bereits auf dem Boden steht. Falls jawird die Schleife abgebrochen. Das wait(1); verhindert eine Fehlermeldung, da die Schleife sonstmehr als einmal in einem Framezyklus durchlaufen werden würde. Dann wird noch durch eineweitere While-Schleife geprüft, ob die Sprungtaste gedrückt ist. Das soll verhindern, dass manpermanent hüpft.Die letzte Zeile setzt jump_time wieder auf 1, damit der nächste Sprung wieder genauso wie delletzte ablaufen kann.SchlusswortDas war’s jetzt schon. Ich hoffe, dass dieses Tutorial etwas hilfreich war.<strong>3D</strong> <strong>GAMESTUDIO</strong>-<strong>Magazin</strong> ■ <strong>Ausgabe</strong> <strong>03</strong> | <strong>März</strong> 2006 │11


Die Tastenbelegung kann ganz einfach geändert werden, indem man die Variablen, die wir alserstes definiert haben auf die gewünschten Tastenscancodes setzt. Dazu kann man auch eineFunktion schreiben, damit der Spieler die Tasten selber ändern kann. Aber das gibt’s vielleicht ineinem weiteren Tutorial. Das fertige Testlevel und die Scripte gibt’s unter hier zum RunterladenFür Fragen und Kritik stehe ich gerne unter tuschcarsten@web.de zur Verfügung.mfg Carsten (alias tuschcarsten)<strong>3D</strong> <strong>GAMESTUDIO</strong>-<strong>Magazin</strong> ■ <strong>Ausgabe</strong> <strong>03</strong> | <strong>März</strong> 2006 │12


Modelldesign - Teil 2: Mapping des Tischs in BlenderEinleitungvon Josef BrandlHallo und willkommen beim zweiten Teil meiner Serie „Modelling mit Blender“. Ich werde in dieser<strong>Ausgabe</strong> zeigen wie man dem in der letzen <strong>Ausgabe</strong> erstellten Tisch eine ordentliche UV Mapverpasst. In Sachen Mapping ist Blender hervorragend, am Ende dieser <strong>Ausgabe</strong> werden sie in derLage sein detailreiche statische Modelle zu erstellen. Diese werden sie dann mit der nächsten<strong>Ausgabe</strong> nach Gamestudio konvertieren können um sie in ihrem Spiel zu Verwenden. Sie werdenmerken, dass sich das Arbeiten mit Blender für sie Lohnen wird. Vor allem in Sachen Zeitaufwand.Noch etwas: Ich hab’ beschlossen dieses Tutorial anders zu gestalten. Dieses Mal schreibe ich dieArbeitsanweisung in Stichpunkten, sodass sie weniger lesen müssen.Einrichtung der Arbeitsfläche• Blender starten• „File“ >> „open last“ um den Tisch zu laden. ( Falls der Tisch nicht das letzte Modell war, öffnensie mit dem „Open…“-Dialog)• Fahren sie mit der Maus an die Trennlinie zwischen dem 3dPort und dem Buttons Fenster.• klicken sie dort mit der rechten Maustaste und wählen folgende Option im aufklappenden Menüaus.• Jetzt können sie das Fenster teilen. Plazieren sie die Trennlinie in etwa in der Mitte des 3d Ports.• Ändern sie den Fenstertyp eines der beiden neu erstellten Fenster in „UV/Image Editor, benutzensie dazu den Butten ganz links im Header.<strong>3D</strong> <strong>GAMESTUDIO</strong>-<strong>Magazin</strong> ■ <strong>Ausgabe</strong> <strong>03</strong> | <strong>März</strong> 2006 │13


Seams• Wechseln sie in den edit mode des Tischs• Gehen sie in den edge select mode (Wenn sie den Schalter dazu nicht finden verschieben sie denInhalt des Headers mit der mittleren Maustaste)• Jetzt selektieren sie die Kanten im Modell, an denen das zusammenhängende Gitter im skin Editorgeteilt werden soll. Wenn sie nicht genau verstehen was ich meine, dann selektieren einfach maldie selben Vertices wie ich in dem Bild unten.• Um jetzt aus den selektierten Kanten Seams zu machen, klicken sie STRG+E und wählen „markseam“Sobald sie das unwrapping verstanden haben werden sie wahrscheinlich denken: „Ist ja eigentlichlogisch, dass ich diese Kanten selektieren muss.“Laden einer Textur• Sie werden wahrscheinlich jetzt keine Holztextur parat haben, darum empfehle ich ihnen dieseSeite: http://lemog.free.fr/• Suchen sie sich ein passendes Bild aus und speichern sie es auf ihrer Festplatte. Ich empfehleihnen das Bild als .bmp zu speichern, nicht wegen Blender sondern wegen MED. Dazu aber spätermehr. Im Internet Explorer ist diese Option verfügbar.• Wechseln sie wieder in Blender in den „UV Face Select“ Modus. Wenn sie diesen Modus das ersteMal betreten, werden automatisch alle Faces selektiert. Falls sie aus versehen Faces deselektierthaben, drücken sie zweimal die A-Taste. (Diese Technik sollte ihnen bereits bekannt sein)• Wählen sie im UV/Image Editor im Header Image >> open (Wenn sie sich wundern, was die erstenbeiden Einträge der Dateiliste bewirken: Der „ . “ aktualisiert die Liste, die „ .. “ wechseln zumübergeordneten Verzeichnis.)<strong>3D</strong> <strong>GAMESTUDIO</strong>-<strong>Magazin</strong> ■ <strong>Ausgabe</strong> <strong>03</strong> | <strong>März</strong> 2006 │14


Das LSCM unwrappingIn Blender gibt es verschiedene Methoden das Mesh zu mappen. Wir haben das Mesh jetzt aberspeziell auf das LSCM unwrapping vorbereitet. Es ist meiner Meinung die fortschrittlichste Methode,ihr Einsatzgebiet ist relativ groß. Man kann es fast als allround mapping Tool bezeichnen.• Wählen sie die Darstellungsweise „Textured“ (der Button dazu ist im Header des 3d ports zufinden)• Deselektieren sie alle Faces• Bewegen sie den Cursor über die Tischplatte und drücken die L-Taste -> alle zusammenhängendenFaces werden selektiert• Drücken sie die U-Taste (Achtung, diese Taste macht im Edit Mode den letzten Schritt rückgängig!Im Face Select Modus arbeitet sie aber korrekt)• Wählen sie im aufgeklappten Menü LSCM.• Und voilà, das Modell wurde geunwrapped.• Natürlich wird die Textur in der 3d view noch etwas groß skaliert erscheinen, aber das kann manim mapping ja korrigieren.• Skalieren, Rotieren und Verschieben sie das mapping zurecht.• Aktivieren sie die Option „Stick Local UVs to mesh vertex“ im Select-Menü, ansonsten werden sie<strong>3D</strong> <strong>GAMESTUDIO</strong>-<strong>Magazin</strong> ■ <strong>Ausgabe</strong> <strong>03</strong> | <strong>März</strong> 2006 │15


feststellen, dass die vertices nicht beisammen hängen.Das Mapping des RestsEigentlich ist läuft der Prozess bei den Beinen und beim Untergestell genauso ab:• Seams setzen• LSCM mapping• zurechtskalieren, -verschieben, gegebenen Falls zurechtrotierenTipps:• Die Seams lassen sich um einiges leichter ziehen, wenn sie Teile des Meshs verstecken. Selektierensie die zu versteckenden Meshteile und drücken sie die H-Taste (h >> hide) Mit ALT+H machen siealle Teile des Modells wieder sichtbar. Anmerkung: die versteckten Teile sind nur im Edit Modeunsichtbar.• Bei den Tischbeinen hab ich im UV/Image Editor den Auswahlpinsel (2x B-Taste) benutzt und alleVertices auf eine Reihe rotiert.• Um Vertices exakt in einer Reihe zu positionieren können sie W-Taste >> algin x/y benutzen.• Um sich Arbeit zu sparen können sie alternativ nur ein Tischbein mappen und es wie in Part Iduplizieren.• Hier ist ein Downloadlink zum fertigen Modell: Link Wenn sie immer noch nicht wissen wie, sie dieSeams ziehen müssen, orientieren sie sich daran, wie ich es gemacht habe.SchlussIch kann ihnen nicht mehr über diese mapping-Methode zeigen. Alles was sie darüber wissenmüssen haben sie bereits gelernt. Für komplexere Gegenstände wird aber noch ein anderswichtiges Feature in Zusammenhang mit LSCM wichtig: das sog. „Pinning“, wenn sie daranInteresse haben kann ich ihnen wärmstens das Blender Handbuch oder das Video Tutorial überLSCM empfehlen. In einer späteren <strong>Ausgabe</strong> der Serie Modelling werde ich dieses Feature ebenfallsbesprechen.Fertig gemapped schaut der Tisch so aus:Im Blick auf die Zukunft, werde ich zeigen wie man nun nach Gamestudio exportiert und wie manmit Hilfe eines Features von Blender ganz leicht und schnell eine Vase zaubern kann.Happy BlenderingJosef Brandl<strong>3D</strong> <strong>GAMESTUDIO</strong>-<strong>Magazin</strong> ■ <strong>Ausgabe</strong> <strong>03</strong> | <strong>März</strong> 2006 │16


KI oder: Wie die Bots versuchen den Weg zu finden!von TheGameMakerHallo und herzlich Willkommen zu meinem zweiten Tutorial für das <strong>3D</strong>GS-<strong>Magazin</strong>, in diesenBeitrag geht es mehr um die Theorie des Pathfindings. Wir benutzen eine auf Gamestudiozugeschnittene version des A*- Algorithmus.Einführung: Der SuchbereichAngenommen, wir haben jemanden, der von Punkt A nach Punkt B möchte. Lass uns weiterannehmen, dass sich zwischen A und B eine Wand befindet, so wie es das Bild unten zeigt.Startpunkt A ist hier grün, Zielpunkt B ist rot und die blaue Fläche zwischen A und B stellen dieWand dar.Das Erste, das Du vermutlich bemerkst, ist die Unterteilung des Suchbereichs in Gelbe Punkte, siestellen im Level platzierte Nodes da (Natürlich würde man in echt weniger nehmen, aber um zudemonstrieren wie A+ Algorithmus funktioniert ist die hohe Anzahl Praktisch. Diese Vereinfachungdes Suchbereichs ist der erste Schritt zur Pfadfindung. Dieses besondere Verfahren reduziert denSuchbereich auf ein einfaches, 2-dimensionale Gitter. Der Pfad ergibt sich aus all den Punkten(imweiteren nur noch „Nodes“ genant), die wir für den Weg von A nach B benötigen. Sobald dieserPfad gefunden ist, begibt sich die Spielfigur ausgehend vom Startpunktes A von einem Node zumnächsten und besucht auf diese Weise alle Nodes des Pfades, bis es das sie denn Zielnode Berreicht hat.Die Suche beginnt!Sobald wir den Suchbereich mit dem oben beschriebenen Nodegitter in eine handhabbare Mengevon Knoten gebracht haben, ist das nächste Ziel die Suche nach dem kürzesten Pfad einzuleiten.Wir tun dies, indem wir, beginnend bei Node A, die umliegenden Nodes auf ihre„Wahrscheinlichkeit“ auf dem Weg zu liegen prüfen bis wir das Ziel, Punkt B, gefunden haben.Wir beginnen die Suche, indem wir Folgendes tun:1. Wir gucken nach benachbarten Nodes.2. sagen diesen, dass sie von unserem Startpunkt aufgerufen wurden(indem wir ihnen denHandle des Startpunktes übergeben). Der aufrufende Node wird fortan „parent“ und deraufgerufene „child“ genannt.3. Wir speichern in allen „child“ Nodes die Kosten des „parent“ Nodes.4. wir errechnen die „Kosten“(einen Wert, der die Qualität des Punktes beschreibt) eines jeden„child“ Nodes. Dies geschieht mithilfe der sogenannten Heuristik, wir verwenden dieManhattan-Heuristik.5. Wir wählen den „kosten günstigsten“ Node und durchlaufen die Schleife mit ihm als „parent“solange bis wir am ziel sind.<strong>3D</strong> <strong>GAMESTUDIO</strong>-<strong>Magazin</strong> ■ <strong>Ausgabe</strong> <strong>03</strong> | <strong>März</strong> 2006 │17


NodebewertungDer Schlüssel dazu, welche Nodes für den Pfad in Frage kommen, ist folgende Gleichung:F = G + HwobeiG = Die Bewegungskosten, um vom Startpunkt A zu einem gegebenen Node des Gitters unterVerwendung des dafür ermittelten Pfades zu gelangen.H = Die geschätzten Kosten, um von dem gegebenen Quadrat zum Zielpunkt B zu gelangen. Dieswird oft heuristisch genannt, was ein bisschen verwirrend sein kann. Der Grund, warum dies sogenannt wird, ist, dass diese Kosten auf Vermutung beruhen, denn tatsächlich kennen wir diewirkliche Entfernung erst, wenn wir den Pfad dorthin gefunden und auf dem Weg liegendeHindernisse (Wände, Wasser, etc.) berücksichtigt haben. In diesem Artikel wird ein möglicher Weggezeigt, wie H ermittelt werden kann; es gibt aber viele weitere, die in anderen Web-Artikelnbeschrieben sind.Wir erzeugen unseren Pfad, indem wir wiederholt unsere offene Liste durchschreiten und den Nodemit de geringsten F-Kosten wählen. Dieser Prozess wird weiter unten im Einzelnen beschrieben.Zuerst lass uns aber etwas näher betrachten, wie wir die Gleichung berechnen.Wie oben beschrieben, sind G die Bewegungskosten um vom Startpunkt zu einem gegebenen Nodeunter Verwendung des dorthin ermittelten Pfades zu gelangen. G wird einfach durch einevec_dist(parent_pos,cild_pos) bestimmt, sowie der G-wert des Parents berechnet. Der Nutzendavon eröffnet sich ein bisschen später in diesem Beispiel, wenn wir uns mehr als ein Node vomStartpunkt entfernt haben.H kann auf vielerlei Art geschätzt werden. Die Methode, die wir hier verwenden, wird als"Manhatten-Methode" bezeichnet, mit der wir die Gesamtzahl von Quants die in horizontaler odervertikaler Richtung beschritten werden müssen, berechnest. Dabei werden diagonale Bewegungenund jedwede Hindernisse außer Acht gelassen. Dies wird (möglicherweise) die Manhatten-Methodegenannt, weil sie dem Zählen von Stadtvierteln gleicht, wenn man von einem Platz zu einemanderen möchte und es keine diagonale Verbindung gibt.F wird berechnet, indem G und H addiert werden. Die Ergebnisse des ersten Schrittes unsererSuche sind in dem Bild unten dargestellt.Wir haben nun einen ganzen Haufen Nodes, die den „Läufer“ als „parent“ gespeichert haben. Dergünstigste ist der blaue. ( der Blaue wird fortan immer der „wahrscheinlichste“ seien, während diegrünen die mit Hilfe der Manhatten-Methode aussortierten sind. Wir speichern in einem ihrer Skillsjeweils ihre G-Komponente, sowie ihr Gesamtes H.<strong>3D</strong> <strong>GAMESTUDIO</strong>-<strong>Magazin</strong> ■ <strong>Ausgabe</strong> <strong>03</strong> | <strong>März</strong> 2006 │18


Nehmen wir der Einfachheit an, dass jede Node exakt 100 Quants Abstand in X und Y zum nächstehat, so ist leicht zu verstehen, warum diese Node der günstigste ist in x-Richtung hat er einenWegunterschied zum ziel von 0 und in Y von 400. Außerdem ist er 100 Quants vom Startortentfernt. Das ergibt einen F Wert von 500. Seine Nachbarn haben nicht nur in x-Richtung 100Punkte mehr Kosten sondern auch die Entfernung zum Startort ist höher.Nun lassen wir ihn die oben beschriebene suche aufrufen, und seine Nachbarn scannen. Er scanntdie Bereits erfassten Punkt, von denen der günstigste ausgewählt wird.( in unserem Fall steht esunentschieden, sodass ein zufällig bzw. durch den letzten Aufruf bestimmter Node gewählt wird)Da der Weg über den ersten ausgewählten Node länger wäre, wird der „parent“ Skill nicht auf denersten Node gesetzt, sondern Bleibt auf dem Starter des Pathfindings. Um dies zu Prüfen, wird dieG- Komponente des ersten Nodes mit der des zweitens verglichen (natürlich nur, wenn ein Nodegescannt wird, der bereits gescannt wurde, sprich grün ist.Wenn wir nun denn neu gewählten node nun wieder suchen lassen erhalten wir folgendesErgebnis:Nun wiederholen wir diesen Prozess bis unser Ziel erreicht wird.<strong>3D</strong> <strong>GAMESTUDIO</strong>-<strong>Magazin</strong> ■ <strong>Ausgabe</strong> <strong>03</strong> | <strong>März</strong> 2006 │19


Nun haben wir aber immer noch keinen Pfad zum Ziel, aber immerhin einen Ganzen HaufenInformationen. Die Wichtigste sind die „Parents“ wenn man von Ziel zum Parent Knoten geht undvon dem wieder und so weiter, hat man den kürzesten Pfad zum Ziel:Nun, wie dem Bot sagen, dass er diesen Weg zu gehen hat? Das ist recht einfach: bei jedem schrittzurück wird ein Temporärer Node erzeugt, mit einem Skill in dem der Handel des Bots steht. Nunbewegt sich der Bot immer auf den Nächsten Knoten zu, der in diesem Skill seinen Handelgespeichert hat. Erreicht er einen, dann wird diese gelöscht, und er geht zum nächsten.Das wirklich schwierige ist es, das suchen von Nachbar Knoten schnell genug zu machen. Wennman wie oben beschrieben über scan arbeitet ist der Algorithmus viel zu langsam. Sinnvoll ist esdaher die Sichtbarkeiten der Knoten zu jedem anderen in einem Array oder in einer Text-Datei zuspeichern.und noch einige nützliche Links zum Thema Pathfinding:http://www.aiguru.com/pathfinding.htmhttp://www.gameai.com/pathfinding.htmlMfGTheGameMaker<strong>3D</strong> <strong>GAMESTUDIO</strong>-<strong>Magazin</strong> ■ <strong>Ausgabe</strong> <strong>03</strong> | <strong>März</strong> 2006 │20


Starten Sie den Soundforum Synth und laden Sie den Snapshot „Basic Sine“:Nun sollten Sie in der Lage sein, mit Ihrer Tastatur Noten zu spielen – Sie haben recht, es klingterbärmlich. Sie hören jetzt den reinen Sinuston.Lassen Sie uns den angesprochenen Lautstärkeverlauf mit einbringen.Zu diesem Zweck dient der „Hüllkurvengenerator“. Dieser steuert einen Verstärker an. DieSinusschwingung bekommt durch den Verstärker einen Lautstärkeverlauf – man sagt auch, ihreAmplitude wird moduliert.Es ist so, als würden Sie an Ihrer Hifianlage ganz schnell die Lautstärke aufdrehen und wiederzurücknehmen. Die nächsten Skizzen veranschaulichen das System:Hier sehen Sie, wie der Verstärker auf das Signal einwirkt. Seine Steuerspannung bekommt er vomHüllkurvengenerator.Die Hüllkurve ist hier so eingestellt, daß sie die Sinusschwingung dämpft. Die Lautstärke wird also<strong>3D</strong> <strong>GAMESTUDIO</strong>-<strong>Magazin</strong> ■ <strong>Ausgabe</strong> <strong>03</strong> | <strong>März</strong> 2006 │22


mit der Zeit immer mehr zurückgenommen.Beim Soundforum Synth heisst die Hüllkurve „AmpEnv“, was für „Amplifier Envelope“ steht. Dort sehen Sie vier Regler, die mit A,D,S und Rgekennzeichnet sind:Der erste Regler, „Attack“ genannt, bestimmt die Dauer des "einfadens". Der zweite Regler, mit Namen„Decay“, bestimmt die Länge des Nachklangs. Die beiden letzten Regler erkläre ich Ihnen gleich.Drehen Sie den „S“ - Regler auf null und den Decay Regler auf 45. Nun können Sie wieder spielen undhören, daß der Ton ausklingt, was bereits an eine Glocke erinnert.Bewegen Sie nun den „S“ Regler, welcher auch „Sustain“ heisst, auf einen Wert von 0.3 und den„Release“ Regler „R“ auf 45. Solange Sie nun eine Taste drücken, wird der Ton mit 30 Prozent Lautstärkeabgespielt, wenn Sie sie loslassen, wird der „Release“ aktiv und sorgt für einen Nachklang. Drehen SieSustain und Release wieder auf null.Sie können die Form der Hüllkurve sehen – ein weiterer Vorteil des Soundforum Synth. Lassen Sie michnun auf ein Bauteil eingehen, welches in keinem Synthesizer fehlen darf: Der Filter. Er lässt nurbestimmte Frequenzen durch, und er kann ebenfalls durch eine Hüllkurve moduliert werden. Einwesentliches Merkmal ist die Art des Filters: Es gibt Hoch-, Tief- und Bandpässe, sowie Bandsperren.Es werden also nur hohe oder tiefe Frequenzen, ein bestimmter Frequenzbereich oder alles außer einembestimmten Frequenzbereich durchgelassen.Beim Soundforum Synth sitzt der Filter hier:Ganz schön viele Elemente meinen Sie? Sie sind aber sehr logisch angeordnet:Auf der linken Seite finden sich „Schalter“, mit denen Sie die Art des Filters auswählen.• LP steht für „Lowpass“ also Tiefpass<strong>3D</strong> <strong>GAMESTUDIO</strong>-<strong>Magazin</strong> ■ <strong>Ausgabe</strong> <strong>03</strong> | <strong>März</strong> 2006 │23


• BP und BL sind Bandpässe• HP steht für „Highpass“, also Hochpass• Die Zahlen beschreiben die Steilheit der Filter. Ein Filter erster Ordnung schneidet nicht sorigoros ab wie ein Filter dritter Ordnung. Dies macht einen immensen Unterschied, wie Sienoch feststellen werden.• Rechts neben der Schaltleiste finden sich Regler.• „Cutoff“ stellt die sogenannte „Grenzfrequenz“ ein. Momentan steht sie auf 140,• MIDI Noten gehen von 0-127, es werden also alle Frequenzen durchgelassen, da einTiefpass geschaltet ist.• Ein Hochpass würde mit dieser Einstellung nur extrem hohe Töne hindurchlassen.• Die „Resonanz“, als „Reson“ bezeichnet, bestimmt das Eigenschwingverhalten des Filters,was interessante Effekte ergeben kann und Töne meist lebendiger erscheinen läßt.• Allerdings ist die Resonanz mit Vorsicht zu geniessen, da leicht Frequenzen und Lautstärkenentstehen, die Lautsprecher zerstören können!• „Env“ steht für „Envelope“ und bestimmt wie sehr sich die Hüllkurve auf den Filter auswirkt.• „K-Track“ verbindet den Filter mit der Tastatur, um den Filter auf die gespielte Noteabzustimmen. Es kann sonst zu Klangverfärbungen und nicht passenden Tönen kommen.• Bewegen Sie den Cutoff Regler während Sie spielen – Sie werden merken, daß Sie hoheFrequenzen dämpfen können.• Drehen Sie den „Reson“ - Regler auf 0.98 – und regeln Sie die Lautstärke etwas herunter!• Stellen Sie „Cutoff“ auf 80. Wenn Sie nun ein paar Noten spielen, können Sie dieEigenschwingung des Filters hören. Das klingt schon wesentlich realer.Spielen Sie ein wenig mit der Filterauswahl herum, um ein Gefühl für Hoch-, Tief- und Bandpässezu bekommen.Nun kommen wir zur Hüllkurve des Filters. Sie wirkt auf seine Grenzfreqenz ein, ganz so alswürden Sie an Ihrer Hi-Fi Anlage den Höhen oder Tiefenregler schnell bewegen.Eine Glocke wird meist immer heller, je länger sie klingt. Dieses Verhalten können wir mit derHüllkurve erreichen. Damit haben wir einen einfachen, aber vollständigen Synthesizer. Sie sehenalso, daß es gar nicht mal so viele Einzelmodule sind:Wie müsste denn die Hüllkurve aussehen, damit der Ton mit der Zeit heller wird? DieGrenzfrequenz müsste zu Beginn des Tons sehr tief sein, um tiefe Frequenzen durchzulassen.Danach muss die Grenzfrequenz steigen, um den Ton heller zu machen.Also sollte die „Attack“-Zeit kurz sein und die „Decay“ Zeit etwas länger. Nehmen wir den Wert,der uns von der Verstärker Hüllkurve gegeben ist. Stellen Sie den „Decay“ Wert der Filter Hüllkurveauf „45“. Den „Sustain“ sowie den „Release“ Regler drehen Sie bitte auf null:<strong>3D</strong> <strong>GAMESTUDIO</strong>-<strong>Magazin</strong> ■ <strong>Ausgabe</strong> <strong>03</strong> | <strong>März</strong> 2006 │24


Aber man hört ja gar keinen Unterschied? Nun, der Filter wird noch nicht von der Hüllkurvemoduliert. Dazu dient der Regler „Env“, links neben „K-Track“. Wenn Sie ihn langsam nach rechtsdrehen und dabei Noten spielen, können Sie einen Effekt hören: Die Grenzfrequenz wird umsomehr von der Hüllkurve beeinflusst, je mehr der Regler aufgedreht ist. Aber statt dunkler wird derTon heller – das klingt recht „spacig“. Wenn Sie ihn nach links drehen, kehren Sie die Hüllkurveum. Der Ton beginnt dumpf und wird immer heller. Das ist es, was wir wollen!Geben Sie acht auf zu tiefe Frequenzen! Ihr Lautsprecher wird es Ihnen danken.Im nächsten Teil wollen wir den Ton noch etwas lebendiger gestalten und bedienen uns dersogenannten „Frequenzmodulation“. Hierbei steuert ein Oszillator den Frequenzeingang einesanderen an. Der „Soundforum Synth“ bietet auch diese Möglichkeit.Da wir uns vorher aber mit den Möglichkeiten von zwei Oszillatoren beschäftigen müssen und dieFrequenzmodulation ein weites Feld ist, möchte ich hiermit erst einmal schliessen.Allerdings nicht ohne Ihnen noch einige weiterführende Links zu präsentieren:http://www.buzzmachines.com/Buzz, vollwertiger modularer Softwaresynthesizer als Freeware!http://www.syntiac.com/synfactory.htmlSynfactory, modularer Softwaresynth, Freewarehttp://jbausch.de/index.phpV-Synth, modularer Softwaresynthesizer, Freewarehttp://audacity.sourceforge.net/Audacity, Audiobearbeitungsprogramm, Freewarehttp://www.audiomulch.com/Audiomulch, modulares Synthesizer / Sequenzersystem, Sharewarehttp://www.nativeinstruments.de/index.php?id=reaktor5_deReaktor – modularer geht es kaum - Synthesizer, Sampler, Sequenzer...!Sollten Sie Fragen haben zögern Sie nicht mir eine E-Mail zu schicken an:fogman@gmx.comHerzliche Grüße, Torsten Fock<strong>3D</strong> <strong>GAMESTUDIO</strong>-<strong>Magazin</strong> ■ <strong>Ausgabe</strong> <strong>03</strong> | <strong>März</strong> 2006 │25


Indoor Leveldesignvon Frank GeppertIn diesem Tutorial möchte ich Ihnen beispielhaft das Erstellen eines Spielabschnittes (einessogenannten Levels) erläutern. Dabei werde ich sowohl auf das Erstellen der Texturen, derLevelgeometrie und auf eine passende Beleuchtung eingehen. Zusätzlich wird die Spielwelt miteinigen Modellen ausgestattet, um Details und Lebendigkeit zu erzeugen.Ich habe dazu einen Dungeon erstellt. Hier kann gut mit Licht und Schatten gearbeitet werden. Eshandelt sich dabei um einen typischen BSP-Level, der mit dem World-Editor (WED) von <strong>3D</strong>Gamestudio erstellt werden kann.Texturen vorbereitenUm ein realistisch wirkendes Ergebnis zu erzielen, benötigt man gute Texturen und eine guteBeleuchtung. Wir beginnen hier mit den Texturen.Ich habe mich entschlossen, für dieses Level keine handgezeichneten Texturen zu nutzen, sondernmit Hilfe einer Digitalkamera und dem Grafikprogramm "The Gimp" meine Texturen zu erstellen.Dazu habe ich einen Tag gewählt, an dem der Himmel bewölkt war. Somit habe ich keine Schattenund Lichter auf meinen Fotos. Das hilft später sehr, diese Texturen kachelbar zu machen und eineinheitliches Farbspektrum in den Texturen zu haben. Ich versuche die Fotos unverzerrtaufzunehmen (kleine perspektivische Verzerrungen können aber später auch digital nachbearbeitetwerden). Ich versuche außerdem eine recht hohe Auflösung der Bilder zu benutzen und ich nehmevorsichtshalber immer ein paar Bilder mehr, um später eine Auswahl zu haben und eventuellKorrekturen mithilfe von ähnlichen Texturen vornehmen zu können. Alle meine Bilder habe ich auf<strong>3D</strong> <strong>GAMESTUDIO</strong>-<strong>Magazin</strong> ■ <strong>Ausgabe</strong> <strong>03</strong> | <strong>März</strong> 2006 │26


dem Ruinenberg in Potsdam fotografiert.Diese Bilder gelangen auf meine Festplatte und müssen nacheinander kachelbar gemacht werden.In dem Grafikprogramm "The Gimp" gibt es dazu eine Funktion (unter Filter / Abbilden), aber dieseführt häufig zu verschwommenen Rändern und ungewünschten Ergebnissen. Also habe ich dieTexturen manuell bearbeitet.Gehen Sie dazu über das Menü die Funktion Ebene / Transformation / Versatz. Drücken Sie auf"Versatz um (x/2)..." oder geben Sie bei X und Y eigene Werte ein. Bestätigen Sie die Funktion.Jetzt wurde das Bild verschoben und die ursprünglichen Ränder sind jetzt in der Mitte. Dabei sindharte Übergänge zu erkennen, die wir manuell beseitigen müssen.Jetzt wählen Sie das Werkzeug "Kopierstempel", um mit Teilen des Bildes zeichnen zu können.<strong>3D</strong> <strong>GAMESTUDIO</strong>-<strong>Magazin</strong> ■ <strong>Ausgabe</strong> <strong>03</strong> | <strong>März</strong> 2006 │27


Bei den Einstellungen des Werkzeuges wählen Sie einen weichen Pinsel und als Quelle dieBildquelle.Im Bild drücken Sie auf einer passenden Stelle die STRG+Taste und die linke Maus, um die Quellezu definieren und zeichnen danach an den unschönen Übergängen mit dem Inhalt dieser Quelle.Jetzt können Sie die Textur nahtlos machen. Dabei sollten Sie die Farben und Strukturen genaubeachten, um ein realistisches Ergebnis zu erhalten.Diesen Vorgang führen Sie für alle gewünschten Texturen aus, ändern danach die Auflösung undnutzen (wenn notwendig) einige Filter, um z.B. den Kontrast oder die Sättigung zu verbessern. Ichhabe die Texturen alle in der Größe 1024 mal 1024 erstellt aber später auf 512 mal 512verkleinert. Somit waren die kleineren Texturen scharf genug und haben eine speichersparendeDateigröße. Das Ergebnis sieht auch in der 512er Größe realistisch genug aus.Falls eine Textur nicht optimal zu einer anderen passt (z.B. weil die Helligkeit unterschiedlich ist),dann legen Sie die 2 Bilder nebeneinander und ändern die Helligkeit oder Farbwerte der nichtpassenden Textur solange, bis Sie damit glücklich sind. Somit spart man sich späterÜberraschungen, dass z.B. der Boden und die Wand sich im Spiel "beißen" wegen unterschiedlicherFarben und Beleuchtung.Levelgeometrie erstellenStarten Sie den Leveleditor von 3d Gamestudio.<strong>3D</strong> <strong>GAMESTUDIO</strong>-<strong>Magazin</strong> ■ <strong>Ausgabe</strong> <strong>03</strong> | <strong>März</strong> 2006 │28


Als erstes wollen wir unsere Texturen in das Programm laden. Gehen Sie dazu links auf die LascheTexturen. Wählen Sie "default.wad" aus und klicken Sie mit der rechten Maustaste in den Bereich,in dem die Texturen gezeigt werden. Wählen Sie den Texturmanager und "New WAD". NachdemSie bestätigt haben, fügen Sie mit der rechten Maustaste im Bereich der neuen WAD-Datei ihreTexturen hinzu. Drücken Sie dann die rechte Maustaste und speichern Sie die WAD-Datei.Jetzt beginnen Sie mit einem Würfel. Drücken Sie "Object / Add Cube / Large". Verschieben Sieden Würfel, vergrößern Sie ihn bei Bedarf. Bedenken Sie dabei, dass eine Einheit (Quant) inGamestudio einem Pixel der (unskalierten) Textur entspricht. Wenn Sie also die Maus über einEditorfenster bewegen und sehen, dass eine Spanne von 512 Punkten abgedeckt wird, dann würdeein solches Quadrat mit jeweils 512 Punkten genau eine unserer quadratischen Texturenaufnehmen können. Jetzt entscheiden Sie selber, ob ihre 512er Textur genau die Wand einnehmensoll, oder sich vielleicht nach oben / unten oder seitwärts kacheln soll. Wenn sich die Wand 2 malvon unten nach oben wiederholen soll, dann kann Ihr Geometrieobjekt also 1024 Quants hochsein. Wenn sich die Textur 6 mal seitwärts wiederholen soll, dann kann das Objekt 6 mal 512Quants breit sein. Die Kästchen in dem Gitter des Editors helfen dabei, solche Entscheidungenrelativ einfach treffen zu können.Wenn Sie mit der Größe zufrieden sind, gehen Sie auf "Edit / Hollow Block". Jetzt wurde aus IhremBlock ein Objekt aus 6 Blöcken erstellt. Jeder neue Block ist jetzt ein Objekt, das entweder denBoden, die Decke oder die Wände darstellt. Wenn Sie links auf die Lasche "Objects" klicken, dannsehen Sie außerdem einen neuen Ordner, der diese 6 neuen Blöcke enthält. Solche Ordner helfensehr, die Übersicht in den vielen Objekten zu bewahren. So können Sie für jeden Raum, Korridorusw. eigene Ordner anlegen und später komplette Ordner kopieren, wenn Sie einen Korridor mehrals einmal benötigen.Markieren Sie jetzt den kompletten Raum und gehen Sie auf die Lasche "Textures". DoppelklickenSie auf die gewünschte Wandtextur. Diese wird somit allen Blöcken zugewiesen. Da Sie aber fürBoden und Decke vermutlich andere Texturen nutzen wollen, müssen Sie diese jetzt ebenfalls nochzuweisen.Drücken Sie dazu den Schalter "Scope down". Damit gelangen Sie in den ausgewählten Ordner undkönnen jetzt jeden einzelnen Block anwählen. Wählen Sie den Boden, doppelklicken Sie auf diegewünschte Textur und wiederholen Sie das für die Decke.Sie haben jetzt Ihren ersten Raum erstellt. Dieser ist aber noch recht langweilig. Fügen Sie einfachweitere Blöcke hinzu (am besten, wenn Sie noch im "Scope-Down"-Modus sind, um alle Blöcke imgleichen Ordner zu haben. Erstellen Sie somit Balken, Säulen, Trümmer usw. Setzen Sie denkleineren Objekten, die einen Raum nur dekorieren immer das Detail-Flag (rechte Maustaste aufden Block). Dieses Flag teilt Gamestudio mit, dass es für solche Blöcke keine besonderenSichtbarkeits-Berechnungen durchführen muss. Damit wird das Spiel am Ende um einige FPSschneller, weil der "Sichtbarkeits-Baum" kleiner ist. Es werden weniger Portale generiert.Benutzen Sie bei der Arbeit so häufig es geht die Snap-Funktion (der Schieberegler in derSchalterleiste). Damit gewährleisten Sie, dass die Blöcke immer genau aufeinander sitzen undkeine Lücken entstehen. Schmale Lücken können den Kompiliervorgang extrem verlangsamen,besonders, wenn keine Detail-Flags gesetzt wurden.<strong>3D</strong> <strong>GAMESTUDIO</strong>-<strong>Magazin</strong> ■ <strong>Ausgabe</strong> <strong>03</strong> | <strong>März</strong> 2006 │29


Erstellen Sie weitere Räume auf die gleiche Art. Wenn Sie Räume miteinander verbinden wollen,dann müssen deren Wände sich entweder ganz genau berühren oder Sie löschen jeweils eine derWände und nutzen zwischen solchen Räumen jeweils nur eine Wand, die aber genau an denübrigen Wänden, Boden und Decke mit dem Nachbarraum angrenzt. Sehr hilfreich ist dabei dasTool, mit dem man Flächen verschieben kann (Face-Move), das immer dann auswählbar wird,wenn Sie im Scope-Down-Modus einen Block ausgewählt haben.Um Räume durch eine Tür miteinander zu verbinden, können Sie einen Block in der Größe der Türerstellen, positionieren diesen perfekt mit der Snap-Funktion und nutzen dann die Funktion "CSG-Subtract" im Edit Menü. Damit wird jede Geometrie, die im Bereich des Tür-Blocks lag,herausgeschnitten. Schieben Sie den Tür-Block beiseite und Sie haben ein gleich großes Loch, dassSie jetzt noch einmal ordentlich texturieren müssen. Außerdem überprüfen Sie, ob alle Flags richtiggesetzt sind. Manchmal kommt es vor, dass neue Flächen nicht das Shaded-Flag gesetzt habenund somit keine Textur erhalten.Außerdem sieht es interessanter aus, wenn Sie eventuell einen Türrahmen nachträglich um denDurchbruch bauen.BeleuchtungDie Beleuchtung ist vielleicht der wichtigste Vorgang beim Erstellen eines Levels. Ein schlechtbeleuchtetes Level kann weder mit Texturen noch mit Modellen gerettet werden. Aber ein mäßigtexturiertes Level kann mit guter Beleuchtung immer noch professionelle Atmosphäre erhalten.<strong>3D</strong> Gamestudio bietet einen sehr guten Licht-/Schatten-Generator. Die Schatten sind abhängig vonder Farbtiefe der Texturen und von der Gamestudio-Version. Sie werden mathematisch korrektprojiziert und können schöne Effekte und zusätzliche Farben liefern.Dazu setzen Sie Lichtquellen über das Menü "Object / Add Light". Ändern Sie über die rechteMaustaste den Radius und die Farbe des Lichtes. Setzen Sie Lichter auch mal hinter Säulen, Gitteroder andere Geometrie, um atmosphärische Schatten zu generieren.Ändern Sie unter "File / Map Properties / Sun / Ambient" die Grundhelligkeit des Levels. Damit sindBereiche gemeint, die im totalen Schatten liegen. Ohne diese Einstellung wären diese Bereichetotal schwarz.Wenn Sie zu harte Schatten erhalten, dann setzen Sie eine zweite Lampe mit geringerer Helligkeitentsprechend versetzt, um die harten Kanten ein wenig auszuleuchten.Benutzen Sie Farben. Das Licht vom Himmel ist gewöhnlich leicht blau und das Licht von Fackelnein wenig rot-gelb. Nutzen Sie aber nicht ein totales Gelb oder totales Blau, sondern eher einBlaugrau oder Gelbgrau.In dem folgenden Bild sehen Sie sowohl rot/gelbes als auch bläuliches Licht. Die Schatten kommenvon den Säulen und den Lampenhalterungen. Letztere finden Sie übrigens im Menü "Object / AddPrefab".<strong>3D</strong> <strong>GAMESTUDIO</strong>-<strong>Magazin</strong> ■ <strong>Ausgabe</strong> <strong>03</strong> | <strong>März</strong> 2006 │30


Details hinzufügenUm das Spiel noch interessanter zu gestalten, sollten noch mehr Details hinzugefügt werden. Dazueignen sich Modelle besonders gut.Erstellen Sie diese mit Hilfe von MED oder einem anderen Modell-Editor oder kaufen Sie sichpassende Modell-Pakete.Eine weitere Möglichkeit ist es, Grafiken zu nutzen, um zusätzliche Details zu erstellen. Sie könnenz.B. ein Gitter erstellen wie im folgenden Bild.Das Gitter ist ein TGA-Bild. Transparente Bereiche werden dabei in dem TGA-Format gespeichert.Damit entsteht ein sehr detaillierter Effekt mit nur einem einzigen Bild. Außerdem habe ich dasgleiche Bild genutzt, um eine verzerrte Version davon zu erstellen, die insgesamt sehr durchsichtigist. Diese Variante habe ich auf den Boden gelegt, um einen komplexen Schatten vorzutäuschen.<strong>3D</strong> <strong>GAMESTUDIO</strong>-<strong>Magazin</strong> ■ <strong>Ausgabe</strong> <strong>03</strong> | <strong>März</strong> 2006 │31


Auf ähnliche Weise habe ich zusätzliche Schmutzflecken an die Wände projiziert. Mit solchenTechniken lassen sich wiederholende Muster an den Wänden oder auf dem Boden kaschieren.Sollten Sie weitere Fragen und Anregungen haben, können Sie mich gerne kontaktieren unter:info@geppert-software.de<strong>3D</strong> <strong>GAMESTUDIO</strong>-<strong>Magazin</strong> ■ <strong>Ausgabe</strong> <strong>03</strong> | <strong>März</strong> 2006 │32


Wind Nord / Ost, Startbahn null drei...Ein Physikobjekt als Flugzeugvon fogmanMir ist aufgefallen, wie oft die Frage nach einer Steuerung für Flugzeuge auftaucht. Da mich diesesThema auch interessiert, habe ich mich auf die Suche nach geeigneten Wegen gemacht. Zu Beginnschlug ich mich mit Vektorenberechnung und Eulerwinkeln herum, mit dem Ergebnis, daß ich zwarein funktionierendes Skript erstellt habe – dieses jedoch der Gamestudio Gemeinde nicht zumutenwill.Stattdessen suchte ich nach einer anderen Möglichkeit, eine einfache, anpassbare und vor allemweiche Steuerung zu erstellen. Was sollte sich da besser eignen, als ein Physikobjekt?Insbesondere Commercial Inhaber werden erfreut sein, daß nur ein Physikobjekt benötigt wird.Weiterhin sollte eine solche Steuerung unter Gamestudio 6.31 auch mit dem großartigen NewtonPhysik Plugin funktionieren, das Prinzip ist das gleiche.Die Demo zu diesem Tutorial können Sie sich jederzeit unter der folgenden Adresse herunterladen:http://home.arcor.de/braindamaged/TutFlightSim.zipUnd nun wünsche ich Ihnen viel Spaß über den Wolken.Öffnen Sie WED und legen Sie ein neues Projekt an. Speichern Sie dieses unter „FlightSim.wmp“ab.Laden Sie ein Modell eines Flugzeugs. Dieses muss (in MED!) so rotiert werden, daß seineVorderseite von oben gesehen rechts liegt.Nun öffnen Sie mit Druck auf „Map Properties“ einen Dialog, um ein neues, leeres Skript zuerstellen.Öffnen Sie dieses Skript mit SED und schreiben Sie gleich zu Beginn die folgenden Zeilen hinein:var video_mode = 8;var video_screen = 1;Diese Befehle sollten Ihnen geläufig sein.Wir kommen zu einigen Variablen, die Sie benötigen werden. Die Erklärung folgt am jeweiligenEinsatzort der Variablen.var schub_var = 200;var speed_var[3];var speed_vec_1[3];var speed_vec_2[3];var soundhandle;var soundtune;var hoehe;Sie legen also vier Variablen und drei Vektoren an.Des weiteren brauchen Sie einen Font zu Anzeigezwecken, zwei Sounds und einen String für denLevelnamen:font arial_font = "Arial",1,20;// Truetype fontstring level_str = ; // Levelname<strong>3D</strong> <strong>GAMESTUDIO</strong>-<strong>Magazin</strong> ■ <strong>Ausgabe</strong> <strong>03</strong> | <strong>März</strong> 2006 │33


sound duese_snd = ;sound warn_snd = ;// Das Düsengeräusch (geloopt)// Das Warngeräusch (ein Piepsen o.ä.)Es folgt die Funktion „Main“:function main{}clip_size = 0;freeze_mode = 1;level_load(level_str);wait(3);freeze_mode = 0;camera.arc=80;while(1){}schub_var+ = key_w * 10 * time;schub_var- = key_s * 10 * time;schub_var = clamp(schub_var, 0, 500);wait(1);„Clip_size“ bestimmt, wie klein Modellpolygone sein dürfen, um noch dargestellt zu werden. Daeine Flugsimulation recht große Level benötigt, und die Modelle sehr klein skaliert werden müssen,habe ich den Wert umdefiniert.Die Anweisungen um das Level zu laden sollten Ihnen bekannt sein. Mit „Camera.arc = 80;“vergrößere ich das Blickfeld der Kamera.In der darauf folgenden Schleife wird der Wert der Variablen „schub_var“ durch drücken der Tasten„w“ und „s“ erhöht bzw. gesenkt.Die „Clamp“ Anweisung begrenzt dabei die den Wert, damit der Schub keine ungeahnten Ausmaßeannimmt oder negativ wird.Je höher der mögliche Endwert (hier: 500) desto größer wird auch die möglicheHöchstgeschwindigkeit Ihres Flugzeugs.Kommen wir zur Aktion, die dem Flugzeug zugewiesen wird:action flugzeug_phys{my.transparent = on;my.alpha = 10;phent_settype(my, ph_rigid, ph_sphere);phent_setmass(my, 10, ph_sphere);phent_setfriction(my, 0);phent_setdamping(my,50, 50);phent_setelasticity(my, 0, 0);ph_setgravity(vector(0,0,-10));phent_setmaxspeed (my, 30000, 5);geschwindigkeit();<strong>3D</strong> <strong>GAMESTUDIO</strong>-<strong>Magazin</strong> ■ <strong>Ausgabe</strong> <strong>03</strong> | <strong>März</strong> 2006 │34


duesensound();warnung();while(1){vec_set(camera.x, my.x);vec_set(camera.pan, my.pan);vec_set(camera.tilt, my.tilt);vec_set(camera.roll, my.roll);}}phent_addforcelocal(my, vector(schub_var,0,0), vector(0,0,0));temp.x = 0.8*(joy_force.x-(key_cul - key_cur))*time;temp.y = 0.4*(joy_force.y-(key_cud - key_cuu))*time;temp.z = -0.4*(joy_force.x-(key_cul - key_cur))*time;phent_addtorquelocal(my, temp);wait(1);Das Modell wird transparent geschaltet, damit man den Eindruck bekommt, im Flugzeug zu sitzen.Sodann werden die physikalischen Eigenschaften bestimmt.Die Kollisionshülle ist kugelförmig, ebenso das Rotationsverhalten. Die Masse wurde experimentellbestimmt (wie die meisten Werte).Die Reibung habe ich ausgeschaltet, um Rechenleistung zu sparen.Als nächstes wurde die Lineare- wie auch die Rotationsdämpfung auf 50 festgelegt. Dies verschafftIhrem Objekt weiche Bewegungen und eine gewisse Trägheit. Da ein Flugzeug zumeist nichtbesonders elastisch ist, habe ich dies auch so definiert.Schließlich wird noch die Schwerkraft festgelegt, und schon können Sie abstürzen! ; )In Ordnung, ich gebe zu – das war nicht unsere Intention.Die drei folgenden Funktionsaufrufe lassen wir erst einmal außen vor und kümmern uns darum,das Fluggerät in der Luft zu halten. Dazu braucht es Schub. Zuerst einmal begeben Sie sich jedochins Flugzeug, indem Sie die Kamera an seinen Nullpunkt binden und ihr seine Winkelwerteübergeben.Dies geschieht in der Schleife mit den „vec_set“ Befehlen.Um nun einen Schub auf´s Flugzeug zu geben, bedienen wir uns der praktischen Anweisung„phent_addforcelocal“.Diese nimmt uns sämtliche Schwierigkeiten mit den Raumwinkeln ab, da sich die Kraftrichtungimmer auf die Ausrichtung der Entity bezieht. Sie müssen sich also keinerlei Gedanken über dieaktuellen Pan und Tilt Werte machen oder mit Winkeln arbeiten.„phent_addforcelocal(my, vector(schub_var,0,0), vector(0,0,0));“ erzeugt einen Schub auf der X-Achse des Modells. Die Stärke wird von der Variablen „schub_var“ bestimmt, die Sie in der „Main“Funktion ansteuern.Nun fliegen Sie schon vorwärts! Aber es wäre doch schön steuern und hochziehen zu können,meinen Sie? Dann lesen Sie weiter...<strong>3D</strong> <strong>GAMESTUDIO</strong>-<strong>Magazin</strong> ■ <strong>Ausgabe</strong> <strong>03</strong> | <strong>März</strong> 2006 │35


Die nächsten drei Zeilen füllen den vordefinierten Vektor „Temp“ mit den momentanen Werten derEingabegeräte. In diesem Fall ein Joystick und die Cursortasten.„phent_addtorquelocal(my, temp);“ dreht nun das Physikobjekt mit den Werten die in „Temp“gespeichert sind.Hierbei wird auch der Rollwinkel des Objektes verändert. Um enge Kurven zu fliegen, was einwenig Übung braucht, benutzen Sie am besten eine Kombination aus lenken und ziehen.Starten Sie Ihr Level und ziehen Sie am Knüppel (oder drücken Sie die Cursortasten). Wenn genugSchub anliegt, können Sie das Flugzeug problemlos in der Luft halten.Eigentlich könnte ich Sie jetzt alleine lassen mit Ihrer Freiheit......aber zu einem Flugzeug gehören auch Düsengeräusche und Anzeigen. Wenigstens die Werte fürHöhe, Geschwindigkeit und den anliegenden Schub wollte ich ihnen nicht vorenthalten.Hierfür sind die drei Funktionen zuständig, die zu Beginn der Aktion aufgerufen werden:geschwindigkeit();duesensound();warnung();Beginnen Sie mit der Geschwindigkeitsberechnung und -anzeige. Hierbei ergibt sich das Problem,das die Beschleunigungen im dreidimensionalen Raum stattfinden. Um dennoch eineneinigermaßen genauen Wert zu erhalten, ersann ich folgende Methode:function geschwindigkeit{}while(1){}vec_for_vertex(speed_vec_1, my, 3);wait(16);vec_for_vertex(speed_vec_2, my, 3);speed_var=vec_dist(speed_vec_1, speed_vec_2);speed_var* = 0.0625*10;hoehe=(my.z)*0.5;Zunächst wird er Vektor „speed_vec_1“ mit der aktuellen Position des dritten Vertice des Modellsgefüllt.Danach wartet die Funktion 16 ticks. Während dieser Zeit bewegt sich Ihr Flugzeug, oder auchnicht, je nach Schubkraft.Sind die 16 Ticks vergangen, wird erneut die Position des Vertice in einen zweiten Vektorgeschrieben, hier heißt er „speed_vec_2“.Die Variable „speed_var“ bekommt nun den Wert der Distanz zwischen dem ersten und demzweiten Vektor. Da Geschwindigkeit = Weg/Zeit ist, multiplizieren Sie „speed_var“ mit demKehrwert von 16. Sie könnten auch durch 16 teilen, was jedoch langsamer ist.Danach wird das Niveau um den Faktor 10 angehoben. Dies dient zur Anpassung.Die letzte Zeile der Schleife berechnet die Höhe des Flugzeugs über dem Nullpunkt.<strong>3D</strong> <strong>GAMESTUDIO</strong>-<strong>Magazin</strong> ■ <strong>Ausgabe</strong> <strong>03</strong> | <strong>März</strong> 2006 │36


Da in meinem Testlevel der Maßstab 1 quant = 0.5 meter beträgt, musste ich den Z-Wert desModells durch zwei teilen. So erhalten Sie den Höhenwert in metern.Die Frequenz des Düsengeräusches wird vom Wert des anliegenden Schubs verändert. Diedazugehörige Funktion ist einfach:function duesensound{}soundhandle = ent_playloop (my, duese_snd, 30);while(1){}soundtune=schub_var/5+50;snd_tune(soundhandle, 0, soundtune, 0);wait(1);Die Variable „soundhandle“ kommt nun zum Einsatz. Sie enthält den Handle des Sounds, mit demer sich identifizieren und verändern läßt.In der darauf folgenden Schleife erhält die Variable „soundtune“ den Wert des Schubs geteilt durchfünf. Um die Grundfrequenz zu bestimmen und anzupassen, werden noch 50 hinzugezählt.„Snd_tune“ ändert schließlich die Frequenz des spielenden Düsensounds je nach Schubstärke.Als kleines Gimmick habe ich noch einen Warnton eingebaut, der ertönt wenn die Flughöhe aufunter 80 meter sinkt. Der Ton wird schneller, je tiefer Sie sinken.function warnung{}var sleep_faktor;while(1){}sleep_faktor = 0.01*hoehe;sleep_faktor=clamp(sleep_faktor, 0.2, 2);if(hoehe < 80)&&(hoehe > 6){}wait(1);snd_play(warn_snd, 10, 0);sleep(sleep_faktor);„Sleep_faktor“ wird gebraucht, um das Intervall zwischen den Tönen zu bestimmen. Diese Variablewird gleich in der ersten Zeile der Schleife berechnet, in der zweiten Zeile werden die Wertebegrenzt, da das Piepsen bei einem Wert von


Um Ihre errechneten Werte anzuzeigen, definieren Sie noch das folgende Panel:panel kontroll_pnl{pos_y=700;digits =0,0,5,arial_font,0.2,schub_var;digits =0,20,5,arial_font,100,speed_var.x;digits =0,40,5,arial_font,1,hoehe;layer = 10;flags = visible;}Und eine Beschreibung der Werte als Text:text kontroll_text{}pos_x=100;pos_y=700;string = "Schubkraft Prozent\nGeschwindigkeit km/h\nHöhe m über NN";flags = visible;font = arial_font;Reizvoll wäre nun noch ein Schadensmodell, Explosionen, richtige Anzeigen,ein künstlicher Horizont und so fort... ; )Ich hoffe, ich konnte Ihnen mal wieder beweisen, daß ein Physikobjekt mehr kann, als man imersten Moment meint.Die selben Prinzipien sollten sich mit nahezu jeder Physikengine verwirklichen lassen. Ich wünscheIhnen viel Spaß und wenige Abstürze.Sollten Sie Fragen haben, erreichen Sie mich unter fogman@gmx.com<strong>3D</strong> <strong>GAMESTUDIO</strong>-<strong>Magazin</strong> ■ <strong>Ausgabe</strong> <strong>03</strong> | <strong>März</strong> 2006 │38


Eigene Hardware ansteuern – Ein Parallelporttutorialvon RATsoftEinleitungIn diesem Tutorial geht es, wie der Titel schon sagt, um die Programmierung des Parallelports, indiesem Fall um den Druckeranschluss oder D-SUB 25 Anschluss. Dieser bietet 8 leichtansteuerbare Datenpins und zusätzliche Pins, über die man Informationen abfragen kann. Aufletztere werde ich aus mehreren Gründen nicht näher eingehen.Nun wird der ein oder andere fragen:“ Was bringt mir das? Was kann ich damit machen?“. Mankann damit selbstgebaute oder auch gekaufte Geräte, wie zum Beispiel eine Relaiskarte, mit derman dann beliebige Verbraucher schalten kann, ansteuern.Der ParallelportDieses Schema des Druckeranschlusses aus der <strong>3D</strong>GS Hilfedatei zeigt sehr deutlich die Belegungder einzelnen Pins. Die Rot dargestellten Datenpins (2-9) sind diejenigen, um die sich diesesTutorial hauptsächlich dreht. Der Druckeranschluss, auch als LTP1 bekannt, hat die Portadresse888. Nachzuschauen ist dies im Gerätemanager in der Registerkarte Ressourcen. Die Zahl dort istjedoch hexadezimal, in der Regel 378 (h), was den genannten 888 entspricht. Diese Zahl ist diePortadresse für das Datenregister, das Statusregister hat die Adresse Datenregister +1, also 889,und das Kontrollregister die Adresse Datenregister +2 (890). Die schwarz dargestellten Pins 18-25liegen auf Masse.Die HardwareWer am Parallelport rumspielen will, muss natürlich schauen können, welche Auswirkungen seinWirken hat. Da Strom nun mal weder gelb ist noch sonst irgendeine Farbe hat, muss man sichanderweitig helfen.Am einfachsten lässt sich der Zustand der Pins mit Leuchtdioden anzeigen. Hierbei ist aber zubeachten, dass man aus dem Parallelport nicht zu große Leistungen ziehen kann, deshalb benutztman so genannte Low-Current LEDs, die nur sehr wenig Leistung brauchen.Man muss dann noch einen Widerstand dazuschalten, um die LEDs sicher zu betreiben.Die Datenpins liegen, wenn man sie ansteuert, entweder auf 0 Volt oder auf +5 Volt.Die LEDs brauchen einen Betriebsstrom von 2 mA und 1,9 V.<strong>3D</strong> <strong>GAMESTUDIO</strong>-<strong>Magazin</strong> ■ <strong>Ausgabe</strong> <strong>03</strong> | <strong>März</strong> 2006 │39


Demnach müssen am Widerstand 3,1 Volt abfallen.R = U / I = 3,1V / 0,002A = 1550 Ω.Der nächst höhere Widerstand, den man kaufen kann, ist 1600 Ω, dies ist der gesuchteVorwiderstand.Die Schaltung ist sehr einfach, man geht einfach von jedem Datenpin durch einen Widerstand undeine Leuchtdiode auf einen Massepin. Es ist am besten, wenn man von jedem Datenpin auf einenanderen Massepin führt.Man braucht also insgesamt:8* Low-Current LEDs (0,78€ für 10 gezahlt)8* 1,6 KΩ Widerstand (0,28€ für 10)1* D-SUB 25 Anschlussstecker, am besten mit Lötkelchen (0,09€)1* D-SUB 25 Verlängerungskabel (ca. 1€)1* Platine oder Gehäuse (Gehäuse 0,60€)Um nicht in den Verdacht der Schleichwerbung zu kommen, schreibe ich nicht, wo ich bestellthabe, aber ich denke, jeder kennt irgendeinen Elektronikartikelversand.Noch ein Bild meiner fertigen Schaltung – schlecht gelötet zwar, aber sie tut ihren Dienst.<strong>3D</strong> <strong>GAMESTUDIO</strong>-<strong>Magazin</strong> ■ <strong>Ausgabe</strong> <strong>03</strong> | <strong>März</strong> 2006 │40


ProgrammierungBevor man die Schaltung ansteckt, sollte man sie noch mal genau anschauen, ob sich auch nichtirgendwo zwei Drähte ungewollt berühren. Danach testet man sie, indem man irgendein Level, dasman einmal gemacht hat, startet, die Konsole aufruft [Tab] und den Befehl port_out(888, X)eingibt. Für X wählt man eine Zahl zwischen 0 und 255. Bei 0 dürfen keine Lampen leuchten, bei255 müssen alle leuchten, bei einer Zahl dazwischen leuchten einige und andere nicht. Wenn dasfunktioniert, ist die Schaltung korrekt und man kann ein richtiges Programm dafür schreiben.Dafür erstellt man ein neues Level und setzt nur einen Block hinein. Da das Programm sowiesoeine 2D Anwendung ist, wird es später gar nicht geladen. Mann kann natürlich auch alles <strong>3D</strong>machen, aber zum Demonstrieren reicht ein 2D Schaltpult vollkommen aus.Nun malt man die Panels für das Schaltpult. Mein Schaltpult hat für jede LED einen An- undAusschalter, zwei Hauptschalter und einen Beenden-Button. Zusätzlich habe ich 8 Panels, die denZustand der Lampen anzeigen.Der Code für das Panel ist einfach und unterscheidet sich auch nicht von anderen Panelcodes.Zunächst braucht man Variablen, die den Zustand der Lampen speichern, und noch eine weitere,die einen Wert speichert, den wir später aus diesen errechnen.var L1 = 0; //Lampe 1var L2 = 0;var L3 = 0;var L4 = 0;var L5 = 0;var L6 = 0;var L7 = 0;var L8 = 0;var Steuersignal;Beim Klicken an An- und Ausknöpfe werden die Variablen L1-L8 entweder auf den Wert 1 oder auf0 gesetzt und eine Funktion wird gestartet, die das Steuersignal berechnet und mittelsport_out(); an den Druckerport sendet. Nun kommt erst einmal die Erklärung des port_out()Befehls.<strong>3D</strong> <strong>GAMESTUDIO</strong>-<strong>Magazin</strong> ■ <strong>Ausgabe</strong> <strong>03</strong> | <strong>März</strong> 2006 │41


port_out(var port, var data);Der Befehl ist recht einfach aufgebaut. Mit der ersten Variablen wählt man den anzusteuerndenPort, in diesem Fall 888. Man sollte mit dieser Zahl sehr vorsichtig sein, da man praktisch jedenPort ansteuern kann, zum Beispiel auch den zur Steuerung der Festplatte oder Ähnliches. Wennman das tut, könnten die wunderlichsten Dinge passieren, die man danach sehr bereut. Das kannbis zu Hardwareschäden führen. Wenn man beim Port 888 bleibt, ist jedoch alles, was man tut,recht unbedenklich.Die zweite Variable ist die interessantere, mit ihr gibt man den Zustand der einzelnen Datenpinsan. Für diesen Zweck gibt man eine Zahl zwischen 0 und 255 ein. Es gibt 8 Datenpins und somit2^8 = 256 Möglichkeiten, sie zu belegen. Wie wertet der PC nun diese Zahl aus? Jeder Pin hat einebestimmte Wertigkeit, die in folgender Tabelle aufgezeigt ist:LampeNr.DataregisterNr.Pin am SteckerWertigkeit(2^X)Wertigkeit(Zahl)1 D0 2 2^0 12 D1 3 2^1 23 D2 4 2^2 44 D3 5 2^3 85 D4 6 2^4 166 D5 7 2^5 327 D6 8 2^6 648 D7 9 2^7 128Jetzt wird auch klar, warum die Stellen im Datenregister mit 0-7 und nicht mit 1-8 beschriftetwerden. Wenn man 2 mit der Nummer des Pins hoch nimmt, erhält man seine Wertigkeit.Die Zahl, die man dem port_out(); Befehl übergibt, errechnet man durch Addition derWertigkeiten der Pins, auf die man Strom legen will.Will man, dass keine Lampe Strom hat, gibt man eine 0 ein.Will man, dass alle leuchten, gibt man 1+2+4+8+16+32+64+128 = 255 ein.Wenn man will, dass z. B. nur die 2. und die 4. leuchten, rechnet man 2+8 = 10.Aber das soll natürlich der PC rechnen, also schreiben wir eine Funktion.Diese Funktion wird immer aufgerufen, wenn eine der Variablen L1-L8 geändert wird.Sie ist sehr kurz und leicht verständlich.function Ansteuern //Steuert den Druckerport{Steuersignal= 1*L1 + 2*L2 + 4*L3 + 8*L4 + 16*L5 + 32*L6 +6 4*L7 + 128*L8; //Steuersignalerrechnenport_out(888,Steuersignal); // Port ansteuern}Wichtig ist, dass man eine Kopie der ackport.dll Datei den Ordner der Release Version verschiebt,wenn man den port_out(); Befehl nutzen will. Man findet diese Datei im <strong>3D</strong>-GameStudioVerzeichnis im Ordner „acknex_plugins“.<strong>3D</strong> <strong>GAMESTUDIO</strong>-<strong>Magazin</strong> ■ <strong>Ausgabe</strong> <strong>03</strong> | <strong>März</strong> 2006 │42


Man kann natürlich auch Folgen programmieren, die der PC abläuft, und so ein Lauflicht oder eineLichtorgel steuern.Die Möglichkeiten sind vielseitig, auch ein Multiplayershooter, der Treffer durch Vibration oder auchfür ganz harte Leute durch gezielte Elektroschocks anzeigt, wäre mit der richtigen Schaltungdenkbar.Diese Relaiskarte gibt es zum Beispiel bei vielenElektronikhändlern (Reichelt,Pollin,Conrad…) ab ca. 10€. Mankönnte sie leicht mit dem <strong>3D</strong>GS ansteuern und eine Lichtorgelmit Halogenlampen bauen. Für 230V ist sie leider nichtausgelegt, aber auch solche Karten gibt es zu kaufen.So, das war es fürs Erste. Ich werde in den nächsten Monaten vielleicht noch tiefer gehendeExperimente zu diesem Thema machen, und schreibe dann gegebenenfalls eine Erweiterung fürdieses Tutorial.Fragen und Anregungen ins Forum, per E-Mail an rat-soft@web.de oder an die ICQ-Nummer: 346-<strong>03</strong>9-023.Mit freundlichen Grüßen – RATsoftZum Schluss noch einmal der Komplette Quelltext, wer will kann sich alle Dateien (Panelgrafiken,Quelltext, etc.) unter folgendem Link herunterladen.http://www.rat-soft.de//X-Change/Schaltpult.rar<strong>3D</strong> <strong>GAMESTUDIO</strong>-<strong>Magazin</strong> ■ <strong>Ausgabe</strong> <strong>03</strong> | <strong>März</strong> 2006 │43


Lampensteuerung.wdl// Definition der Grafikenbmap AN_on = ;bmap AN_off = ;bmap AUS_on = ;bmap AUS_off = ;bmap ALLEAN_on = ;bmap ALLEAN_off = ;bmap ALLEAUS_on = ;bmap ALLEAUS_off = ;bmap BEENDEN_on = ;bmap BEENDEN_off = ;bmap SCHALTPULT = ;bmap LAMPE = ;bmap ZEIGER = ;var video_mode = 7;var video_depth = 32;var video_screen = 1;// 800x600 pixels// 32 bit mode// Starteinstellung für Fullscreenvar L1 = 0; //Lampe 1var L2 = 0;var L3 = 0;var L4 = 0;var L5 = 0;var L6 = 0;var L7 = 0;var L8 = 0;var Steuersignal;function Ansteuern //Steuert den Druckerport{Steuersignal= 1*L1 + 2*L2 + 4*L3 + 8*L4 + 16*L5 + 32*L6 +6 4*L7 + 128*L8; //Steuersignal errechnenport_out(888,Steuersignal); // Port ansteuern}function L1_on {L1 = 1; Ansteuern();} //L1 wird auf 1 gesetzt und die Funktion zum Ansteuern desPorts wird gestartetfunction L2_on {L2 = 1; Ansteuern();}function L3_on {L3 = 1; Ansteuern();}function L4_on {L4 = 1; Ansteuern();}<strong>3D</strong> <strong>GAMESTUDIO</strong>-<strong>Magazin</strong> ■ <strong>Ausgabe</strong> <strong>03</strong> | <strong>März</strong> 2006 │44


function L5_on {L5 = 1; Ansteuern();}function L6_on {L6 = 1; Ansteuern();}function L7_on {L7 = 1; Ansteuern();}function L8_on {L8 = 1; Ansteuern();}function ALLE_on {L1=1; L2=1; L3=1; L4=1; L5=1;L6=1;L7=1;L8=1; Ansteuern();}werden auf 1 gesetzt und die Funktion zum Ansteuern des Ports wird gestartet//Alle L-Variablenfunction L1_off {L1 = 0; Ansteuern();} //L1 wird auf 0 gesetzt und die Funktion zum Ansteuern desPorts wird gestartetfunction L2_off {L2 = 0; Ansteuern();}function L3_off {L3 = 0; Ansteuern();}function L4_off {L4 = 0; Ansteuern();}function L5_off {L5 = 0; Ansteuern();}function L6_off {L6 = 0; Ansteuern();}function L7_off {L7 = 0; Ansteuern();}function L8_off {L8 = 0; Ansteuern();}function ALLE_off {L1=0; L2=0; L3=0; L4=0; L5=0;L6=0;L7=0;L8=0; Ansteuern();} //Alle L-Variablenwerden auf 1 gesetzt und die Funktion zum Ansteuern des Ports wird gestartetPanel L1_Panel{bmap = LAMPE; layer = 2; pos_x=131; pos_y=263; flags = overlay, refresh;}ist sichtbar wenn L1 = 1, also wenn Lampe 1 leuchtetPanel L2_Panel{bmap = LAMPE; layer = 2; pos_x=202; pos_y=263; flags = overlay, refresh;}Panel L3_Panel{bmap = LAMPE; layer = 2; pos_x=273; pos_y=263; flags = overlay, refresh;}Panel L4_Panel{bmap = LAMPE; layer = 2; pos_x=344; pos_y=263; flags = overlay, refresh;}Panel L5_Panel{bmap = LAMPE; layer = 2; pos_x=415; pos_y=263; flags = overlay, refresh;}Panel L6_Panel{bmap = LAMPE; layer = 2; pos_x=486; pos_y=263; flags = overlay, refresh;}Panel L7_Panel{bmap = LAMPE; layer = 2; pos_x=557; pos_y=263; flags = overlay, refresh;}Panel L8_Panel{bmap = LAMPE; layer = 2; pos_x=626; pos_y=263; flags = overlay, refresh;}//Panelfunction verlassen{exit; // Programm beenden}panel Hauptpanel{bmap = SCHALTPULT;layer=1;pos_x = 0;pos_y = 0;button = 127, 200,AN_on, AN_off, AN_on, L1_on, null, null; //startet die Funktion L1_on undschaltet somit Lampe 1 anbutton = 198, 200,AN_on, AN_off, AN_on, L2_on, null, null;button = 269, 200,AN_on, AN_off, AN_on, L3_on, null, null;button = 340, 200,AN_on, AN_off, AN_on, L4_on, null, null;button = 411, 200,AN_on, AN_off, AN_on, L5_on, null, null;button = 482, 200,AN_on, AN_off, AN_on, L6_on, null, null;button = 553, 200,AN_on, AN_off, AN_on, L7_on, null, null;button = 624, 200,AN_on, AN_off, AN_on, L8_on, null, null;<strong>3D</strong> <strong>GAMESTUDIO</strong>-<strong>Magazin</strong> ■ <strong>Ausgabe</strong> <strong>03</strong> | <strong>März</strong> 2006 │45


utton = 127, 320,AUS_on, AUS_off, AUS_on, L1_off, null, null; //startet die Funktion L1_off undschaltet somit Lampe 1 ausbutton = 198, 320,AUS_on, AUS_off, AUS_on, L2_off, null, null;button = 269, 320,AUS_on, AUS_off, AUS_on, L3_off, null, null;button = 340, 320,AUS_on, AUS_off, AUS_on, L4_off, null, null;button = 411, 320,AUS_on, AUS_off, AUS_on, L5_off, null, null;button = 482, 320,AUS_on, AUS_off, AUS_on, L6_off, null, null;button = 553, 320,AUS_on, AUS_off, AUS_on, L7_off, null, null;button = 624, 320,AUS_on, AUS_off, AUS_on, L8_off, null, null;button = 406, 400, ALLEAN_on, ALLEAN_off, ALLEAN_on, ALLE_on, null, null;Funktion ALLE_on und schaltet somit Alle Lampen an//startet diebutton = 200, 400, ALLEAUS_on, ALLEAUS_off, ALLEAUS_on, ALLE_off, null, null; //startet dieFunktion ALLE_off und schaltet somit Alle Lampen ausbutton = 604, 548, BEENDEN_on, BEENDEN_off, BEENDEN_on, verlassen, null, null; //startet dieFunktion "Verlassen"und beendet so das Programmflags = visible, refresh;}function maus() // Steuert die Maus{mouse_mode = 1;mouse_map = ZEIGER; //Mauszeigergrafikwhile (1){mouse_pos.x = pointer.x;mouse_pos.y = pointer.y;}}wait (1);function Lampenanzeige //Steuert die 8 Anzeigepanels{while(1){L1_Panel.visible=L1; //Wenn L1=1 (Lampe 1 leuchet) ist das Panel welches Lampe 1 sybolisiertsichtbar, sonst ist es unsichtbarL2_Panel.visible=L2;L3_Panel.visible=L3;L4_Panel.visible=L4;L5_Panel.visible=L5;L6_Panel.visible=L6;L7_Panel.visible=L7;L8_Panel.visible=L8;wait(1);}<strong>3D</strong> <strong>GAMESTUDIO</strong>-<strong>Magazin</strong> ■ <strong>Ausgabe</strong> <strong>03</strong> | <strong>März</strong> 2006 │46


}function main (){maus();Lampenanzeige();}//Startet die Funktion für den Mauszeiger//Startet die Funktion die die 8 Anzeigepanels steuert<strong>3D</strong> <strong>GAMESTUDIO</strong>-<strong>Magazin</strong> ■ <strong>Ausgabe</strong> <strong>03</strong> | <strong>März</strong> 2006 │47


Interview mit Peter Müller, Torsten Fock und Dennis Senn überdas Projekt "MausGame"<strong>3D</strong>GS <strong>Magazin</strong>: Ihr arbeitet an einem interessanten und witzigen Spielprojekt. Könnt ihr einwenig über das Projekt und die Spielmechanik berichten?Peter Müller: Das Spiel hat 10 Level - jedes hat eine separate Bestenliste, in jedem Level gibt esneue Gegner und Fallen.Torsten Fock: Es lebt vom Arcadegedanke, möglichst viele Punkte in kurzer Zeit zu sammeln.Peter Müller: .. und damit hat es einen höheren Wiederspielwert.Torsten Fock: Der Spieler selbst agiert entweder per WASD - Steuerung, den Pfeiltasten odereinem Joypad. Mir persönlich gefallen die vielen kleinen "Seitenhiebe" welche Peter eingebaut hat.Man kommt vor lesen und lachen teilweise nicht zum spielen. Das kann sehr gemein sein.Peter Müller: Man kann es aber auch im 1st person Modus durchspielen (normale Shooter-Steuerung für die Ego-Perspektive).Torsten Fock: Das ist für manche Stellen auch zu empfehlen.Peter Müller: Wir haben sehr viele Gegenstände - unendlich viele Gegenstände.Torsten Fock: Es scheint auch recht kinderkompatibel zu sein - meine Tochter braucht nicht mehrlange, um mich zu besiegen...Peter Müller: Es hat einen fairen Schwierigkeitsgrad aber es ist dennoch für Profis fordernd (werin der Bestenliste nach oben möchte).Torsten Fock: Ein Aspekt der mir besonders am Spiel gefällt - viele Acknex Spiele sind recht"leer". Das Mausgame ist vollgestopft bis oben hin.Peter Müller: Wir nutzen viele Polygone in vielen Gegenständen, wodurch alles recht rund wirkt.Ein Kleiderständer in Level 6 hat über 4000 polys in Lod_0.Torsten Fock: So schlecht kann die Engine also nicht sein.Peter Müller: Und es läuft auch auf kleineren Systemen flüssig - trotz dauerhaft mindestens 1000partikel mit beam-flag, etc.Torsten Fock: Ja, es läuft auch bei mir (1300 Mhz, 256MB Ram und Radeon7500) annehmbarflott.<strong>3D</strong>GS <strong>Magazin</strong>: Also steckt da sowohl vom Leveldesign, vom Modellieren und Codieren viel Arbeitdrin. Damit kommen wir gleich zur nächsten Frage. Wer arbeitet alles an dem Projekt?Peter Müller (anarchie)Dennis Senn (real illusion)Torsten Fock (fogman)... und ein Musiker<strong>3D</strong>GS <strong>Magazin</strong>: Das ist für so ein gewaltiges Projekt ein recht kleines Team. Wie lange arbeitet ihrschon daran und wann wird es fertig?<strong>3D</strong> <strong>GAMESTUDIO</strong>-<strong>Magazin</strong> ■ <strong>Ausgabe</strong> <strong>03</strong> | <strong>März</strong> 2006 │48


Peter Müller: Eigentlich bin nur ich von der "Gründertruppe" übrig geblieben. Dennis kam ein paarWochen / Monate nach der Gründung zu uns. Ende <strong>März</strong> sind es etwa Eineinhalb Jahre. DieFertigstellung ist in wenigen Monaten geplant.<strong>3D</strong>GS <strong>Magazin</strong>: Dann ging es ja doch ziemlich flott. Wieviele Stunden pro Tag arbeitet ihr daran?Torsten Fock: Peter arbeitet wie ein Besessener. Die Frage ist eher: "Wann arbeitet er nichtdaran?"Dennis Senn: Also ich für mein Teil arbeite etwa jeden Tag 1-3 Stunden für die Modelle undWeiterbildung.Peter Müller: Haha, also manchmal kommen bei mir über 10 stunden am Tag dabei heraus. Abertypisch sind wohl 4-9 am Tag, meist geht das bis spät in die Nacht.Torsten Fock: Bei mir sind es etwa ein bis zwei Stunden pro Tag.<strong>3D</strong>GS <strong>Magazin</strong>: Habt Ihr schon einen Publisher im Auge?Torsten Fock: Dazu kann ich leider nichts sagen...Peter Müller: Die Frage würden wir gern überspringen.<strong>3D</strong>GS <strong>Magazin</strong>: Okay, welche Hürden sind bei diesem Gameprojekt bisher die größten Problemegewesen?Peter Müller: Die A6 Engine (haha). Nein, das war natürlich nur Spaß, hier kommen die "echten"Schwierigkeiten: Zusammenhalt eines Teams plus dem Motivationerhalt innerhalb des Teams,ausserdem ständig aussteigende Teammitglieder. Das war zu Beginn leider so.Torsten Fock: Motivationstiefs - eindeutig.Dennis Senn: Der Export von C4D Modelle über <strong>3D</strong>S nach Gamestudio. Die Zeit ist ein weiteresProblem (wenn man arbeitet hat man viel weniger davon).<strong>3D</strong>GS <strong>Magazin</strong>: Welche Stärken und Schwächen der A6 Engine findet ihr nennenswert?Torsten Fock: Stärken sind das Editorenkonzept, die Einfachheit der Scriptsprache, dieVielseitigkeit und die spitzen Community. Schwächen wären die polygongenaue Kollision beiModellen, die Geschwindigkeit der Physik und die Terrainbearbeitung.Peter Müller: Schwächen (sorry, das sind mir echt zu viele) : Besonders Kollision + Schatten +Licht. Stärken sind die Editoren Med+Sed+Wed.<strong>3D</strong>GS <strong>Magazin</strong>: Welche zukünftigen Features von A6 sind für Euch vorstellbar, wichtig odernotwendig? Ich vermute nach den letzten Aussagen, dass es sich um Licht und Schatten handelt?Torsten Fock: Bessere Terrainbearbeitung, Shader/FFP-Editor+Library, Octree (Octree, Octree!!!).Peter Müller: Ein besser aufgeräumtes Forum wäre schön. Bessere dynamische Schatten sindsehr wichtig. Eine wählbare Kollisionshülle wäre super. Ich hätte auch gerne wenigerKindersicherungen, und dafür ein schnelleres Skript.Dennis Senn: Also ich würde mich darüber freuen, wenn man Texturen vom 3ds Format in MEDimportieren könnte.<strong>3D</strong>GS <strong>Magazin</strong>: Welche Tools habt ihr neben dem 3d Gamestudio für die Entwicklung genutzt?<strong>3D</strong> <strong>GAMESTUDIO</strong>-<strong>Magazin</strong> ■ <strong>Ausgabe</strong> <strong>03</strong> | <strong>März</strong> 2006 │49


Torsten Fock: Für die Sounderstellung nutzen wir NI - Reaktor 4, Audacity sowie WavelabEssentials.Dennis Senn: Cinema 4D.Peter Müller: Gimp, Corel Draw 7 (Haha).Torsten Fock: Yeah, Mausgame hat den Corel Draw 7 - Look! (haha).<strong>3D</strong>GS <strong>Magazin</strong>: Wie funktioniert euer Teamwork? Wie motiviert ihr Eure Mitglieder?Torsten Fock: Ich motiviere mich selber. Ich schaue mir an, was wir schon gemacht haben undich spiele, spiele, spiele, spiele...Peter Müller: Ich versuche immer ansprechbar zu bleiben, versuche ein gutes Vorbild zu sein (icharbeite viel). Und ich lobe, wenn etwas gut aussieht.<strong>3D</strong>GS <strong>Magazin</strong>: Habt Ihr noch ein paar abschließende Worte, die unsere Leser brennendinteressieren könnten?Peter Müller: Sollten wir noch was sagen, außer dass MausGame spitze wird?Torsten Fock: Die Demo gibt´s wenn´s fertig ist.<strong>3D</strong>GS <strong>Magazin</strong>: Vielen Dank für das nette Gespräch.Das Interview wurde von Frank Geppert im Auftrag des <strong>3D</strong>GS <strong>Magazin</strong>s durchgeführt.<strong>3D</strong> <strong>GAMESTUDIO</strong>-<strong>Magazin</strong> ■ <strong>Ausgabe</strong> <strong>03</strong> | <strong>März</strong> 2006 │50


Interview mit Sebastian Leopold über TeamOrgIn dieser <strong>Ausgabe</strong> haben wir für sie ein Exklusivinterview mit Sebastian Leopold (XeXeS) über seinProjekt TeamOrg, dass die Arbeit übers Internet für Hobbyentwickler erleichtern soll.<strong>3D</strong>GS-<strong>Magazin</strong>:Herr Leopold, wir hatten schon einmal das Vergnügen mit ihnen ein Interview für das 3dgs-<strong>Magazin</strong> zu führen. Sie deuteten darin schon an, dass sie sich zum Thema Team-Management nochäußern werden. Nun nach einem knappen halben Jahr, sind sie bereit uns genaueres nicht weitervorzuenthalten. Um was genau handelt es ich bei der „Überraschung“, wie sie es damals nannten?Sebastian Leopold:Es handelt sich um ein Projekt das wir TeamOrg nennen. Es dient der Verwaltung von Projekten imBereich der Softwareentwicklung durch Hobbyentwickler über das Internet.<strong>3D</strong>GS-<strong>Magazin</strong>:Hört sich ja sehr interessant an. Da sie ja vor ca. einen halben Jahr schon darüber Andeutungengemacht haben, bin ich wahrscheinlich richtig in der Annahme, dass sie schon länger daranarbeiten. Wie lange genau?Sebastian Leopold:Insgesamt nun ca. 3 Jahre.<strong>3D</strong>GS-<strong>Magazin</strong>:Arbeiten sie daran alleine oder im Team? Wenn wie groß ist ihr Team?Sebastian Leopold:Den Teil der Programmierung übernehme ich, das Benutzerinterface und das Testen wird vonanderen übernommen. Insgesamt sind wir 9 Leute, wobei die meisten wirklich nur Testaufgabenübernehmen. Es handelt sich hierbei auch nicht um Leute die über das Internet zusammenarbeiten, die meisten kommen aus der direkten Umgebung von mir.<strong>3D</strong>GS-<strong>Magazin</strong>:Wie kamen sie auf die Idee solch ein Programm zu entwickeln? Hatten sie damals spezielle Gründedafür?Sebastian Leopold:Viele der Projekte an denen ich arbeitete sind gescheitert weil der Aufwand welcher nötig ist umein Softwareprojekt über das Internet zu erstellen einfach nicht zu bewältigen war. Es war alsoklar, dass eine Möglichkeit der Synchronisation der Entwicklung und der Planung her musste. DasProblem hierbei war, dass für uns als Jugendliche monatliche Kosten kaum zu decken sind.<strong>3D</strong>GS-<strong>Magazin</strong>:Was benötigt man um ihr Programm nutzen zu können? Ebenfalls aus Kostengründen wollen sichnur wenige Hobbyentwickler einen eigenen Server leisten. Bietet ihr Programm auch dafür eineAlternative?Sebastian Leopold:Das Programm ist nicht so wie die meisten Programme dieser Sorte auf einem Client - ServerSystem basierend. Um mit diesem Programm zu arbeiten wird eine MySQL Datenbank benötigt dieman über das Internet ansprechen kann. Viele Webhosting-Pakete bieten diese Datenbanken an,oft sind diese auch bei kostenlosen Webhosting-Anbietern dabei. Man kann alternativ auch sofernman über eine DSL Flatrate verfügt, den eigenen PC dauerhaft mit dem Internet verbunden lassenund darauf eine MySQL Datenbank aufbauen und diese aufgrund der immer wechselnden IP miteiner dynamischen DNS versorgen. Das Programm bietet die Möglichkeit den PC über eine solcheDNS anzusprechen.<strong>3D</strong> <strong>GAMESTUDIO</strong>-<strong>Magazin</strong> ■ <strong>Ausgabe</strong> <strong>03</strong> | <strong>März</strong> 2006 │51


<strong>3D</strong>GS-<strong>Magazin</strong>:Hört sich sehr interessant an. Welche Features wird ihr Programm bieten?Sebastian Leopold:Features sind: - Zeitplanung - Arbeitsstatistik - Aufgabenverwaltung - Dateiaustausch und-verwaltung - Versionsmanagement - Beta-Testsystem - Benutzer und Entwicklerverwaltung<strong>3D</strong>GS-<strong>Magazin</strong>:Da kommt ja einiges zusammen. Erzählen sie doch wie der Arbeitsablauf mit ihrer Software erfolgt.Sebastian Leopold:Innerhalb der Software gibt es drei Benutzergruppen die verschieden oft vorkommen dürfen. Sodarf es genau einen Teamleiter geben aber unendlich viele Entwickler und Tester. Alle Entwicklerkönnen Aufgaben vorschlagen. der Teamleiter bekommt diese Aufgaben dann und muss siefreigeben. Erst dann sind sie für alle Entwickler sichtbar. Dann kann jeder Entwickler die Aufgabeannehmen. Ist eine Aufgabe erledigt werden die Dateien bereitgestellt und dem Teamleiter wiedereine Nachricht Aufforderung gesendet. Erst wenn dieser die Aufgabe als erledigt ansieht wird sieabgehakt und dadurch von der Liste der aktuell in Bearbeitung befindlichen Aufgaben streichen ZuAufgaben gehören natürlich auch dinge wie Betatests. Ein Betatest kann immer vom Teamleiter indie Wege geleitet werden. Dieser kann natürlich auswählen für welche Dateien bzw. Komponenteeines Projektes. Ein Betatest gilt erst als abgeschlossen wenn jeder Betatester seinen Berichtabgegeben hat. Dieser hat dafür eine vom Test vorgesehen Zeitspanne. Ansonsten wirkt es sichschlecht auf seine Arbeitsstatistik aus.<strong>3D</strong>GS-<strong>Magazin</strong>:Sie haben gerade das Stichwort "Arbeitsstatistik" angesprochen. Was genau versteht ihr Programmdarunter? Wer alles kann diese abrufen?Sebastian Leopold:Es gibt Wochen-, Monats- und Jahres Statistiken. Das Ganze kann auch abgeschaltet werden. Abernormal wird von allen erledigten Aufgaben der Prozentsatz den ein Benutzer erledigt hatberechnet. Jeder kann diese Statistik einsehen. Diese Statistik ist für reine Hobbyteams eigentlichnicht nötig sobald es jedoch um ein Projekt geht das kommerziell sein soll oder es sichbeispielsweiße um Terminarbeit handelt sind Mitglieder des Teams die nicht aktiv sind oder nichtmitarbeiten extreme Störfaktoren. Es wird auch eine Statistik zwischen den Aufgaben erzeugtdamit man den eigenen Arbeitsanteil besser abschätzen kann. Es kommt vor das es eben mehrAufgaben im Grafikbereich gibt als Programmiertechnisch. Dafür können sichProgrammiertechnische Dinge über einen längeren Zeitraum beziehen, sodass ein Anteil von 0nicht unbedingt Inaktivität darstellt.<strong>3D</strong>GS-<strong>Magazin</strong>:Zu guter letzt könnten sie unseren Lesern noch sagen was die Software kosten soll und wie derenVermarktung gestaltet wird.Sebastian Leopold:Es wird Einzel- und mehrere Teamlizenzen geben. Eine Einzellizenz wird zwischen fünf und zehnEuro kosten. Über die Rabatte bei Teamlizenzen haben wir uns noch keine Gedanken gemacht.<strong>3D</strong>GS-<strong>Magazin</strong>:Ich bedanke mich für das schöne GesprächSebastian Leopold:Kein Problem.<strong>3D</strong> <strong>GAMESTUDIO</strong>-<strong>Magazin</strong> ■ <strong>Ausgabe</strong> <strong>03</strong> | <strong>März</strong> 2006 │52

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!