Anfang

 

 

 

Jedes Modell oder Sprite bekommt seine eigene Bounding_box per Action zugewiesen. Als Beispiel hier ein Zaun (Spriteentity). Bei einem Modell ist die Mitte dieser Box der Originpunkt des Modells (Origin ist der Mittelpunkt im MED). Bei Sprites ist es sein geometrischer Mittelpunkt. Also genau in der Mitte.

 

Zuerst setze ich das Zaunsprite in das Level ein. Standardmäßig wird es in NORD - SÜD Richtung im WED plaziert (Im Topview des WED ist der Norden oben). Falls erforderlich skaliere ich es dann auf die erforderliche Länge. Im nächsten Bild sind die Zaunsfelder aus der Draufsicht (Topview) lilafarben zu sehen. Dazwischen kleine Blöcke um die Zaunsfelder zu trennen. Die Zäune die in Ost- Westrichtung stehen haben schon die richtige Lage im Level. Wird das Spiel gestartet drehen sich diese Zäune aber immer zur Kamera hin. Um das zu verhindern kann z.B eine Action geschrieben und im WED an das Sprite angehängt werden. Mit rechter Maustaste in das Sprite klicken. PROPERTIES --> BEHAVIOR. Die Action auswählen. ACTION ausrichten { my.oriented = on; }. Einfacher geht es wenn das Sprite um 180° gedreht wird. Standardmäßig wird es ja mit rotate 90° in den Leveleditor gesetzt. Übrigens sind diese 90° im WED nicht identisch mit dem Panwinkel 90° der Entity im Level. Im WED ist oben Norden, aber mit 0°. Im Level aber rechnet die Engine oben ist Norden aber 90° (winkel_engine = 90° - winkel_med). Um den Drehwinkel zu ändern mit der rechten Maustaste auf das Sprite klicken. PROPERTIES --> POSITION. Unter Rotate den Wert von 90° um 180° erhöhen, = 270°. Das Sprite steht jetzt im Editor genauso da wie vorher. Aber es dreht sich im Spiel nicht mehr zur Kamera hin.

 

Damit der Player so genau wie möglich an den Zaun herantritt muß jetzt die Bounding_box des Zaunes angepasst werden. Der Gridsize (Netzabstand) im Bild beträgt 8Quants. Daran ist zu erkennen das das Sprite ungefähr 8 Kästchen also 8x8 = 64 Quants lang ist. Eine Breite besitzt es eigentlich nicht. Deshalb lege ich hier erstmal einen Mindestwert von 8Quants fest. Die Höhe kann ich bei diesem Zaun vernachlässigen. Sie wird hier nicht benötigt da der Player nicht über den Zaun steigen soll. Die Bounding_box müßte nun also mindestens die Größe von 64Quants x 8 Quants haben.

 

 

Folgende Parameter legen die Größe der Bounding_box fest. min_x,min_y,min_z,max_x,max_y,max_z. Das folgende Bild versucht diese Parameter, auf das Zaunssprite angewendet, darzustellen. Als erstes muß klar sein wie das Koordinatensystem im WED liegt. Dadurch wird klar wo sich x -und y Achse befinden. Wie schon gesagt gehen min -und max Werte von der Mitte des Sprites aus. Ich habe hier etwas größere Werte für die Gesamtlänge genommen ( 2x 48 Quants = 96 Quants, statt der 64 Quants), damit der Player nicht doch am Rand eines Zaunes hindurchgehen kann. Nun kommt etwas wichtiges ! Die Bounding_box dreht sich nicht mit den Sprites oder Modellen mit wenn diese sich drehen. Sei es im Spiel wenn der Player sich dreht oder dieser Zaun der ja auch noch in Ost-West Richtung im Level benötigt wird. Ist die B.box quadratisch z.B. 64x64 ist es nicht so dramatisch. Der Zaun ist aber ein langes schmales Objekt. Die B.box ist nun ebenfalls so lang und schmal. Wird der Zaun gedreht bleibt sie so stehen und die Kollisionsabfrage stimmt nicht mehr. Deshalb hat dieser Zaun 2 verschiedene Bounding_boxen. Die Kompassrose zeigt übrigens die Winkel der Engine im Level, damit die später folgende Action für die bounding_box besser verständlich ist. Stosst euch nicht daran das euer Sprite oder Modell bei 90° im WED nicht nach oben sondern nach rechts zeigt.

 

 

So sieht die gleiche Szene im Level aus. Hier ist sie als grüner Kasten um die Zaunsfelder dargestellt. Die Größe des fertig skalierten Sprites im WED ergibt die Größe der Bounding_box.

 

 

Damit es etwas leichter wird, habe ich mir eine Aktion geschrieben die an alle passenden Zaunsprites im WED angehängt wird. Diese gibt dem Zaun die jeweils passende Bounding_box. Diese Action funzt nur bei den Winkeln 0°,90°,180° und 270° . Steht der Zaun schräg mit  z.B. 45° im Level klappt es nicht.

 

action fence_bounding_box {

 

           if ((my.pan == 0) || (my.pan == 180)) {

ist Panwinkel des Zaunes = 0° oder = 180° dann

                 my.min_x = -4;

von Mitte des Zaunes Bounding_box bis -4 in X

                 my.max_x = 4;

von Mitte des Zaunes Bounding_box bis  4 in X

 

die Gesamtdicke der B.box beträgt also 8 Quants

                my.min_y = -48;

von Mitte des Zaunes Bounding_box bis -48 in Y

                my.max_y = 48;                             }

von Mitte des Zaunes Bounding_box bis  48 in Y

 

die Gesamtlänge der B.box beträgt also 96 Quants

           else {

der Zaun steht in eine andere Richtung

               my.min_x = -48;

Nun das ganze andersherum. Was vorher Dicke war

               my.max_x = 48;

ist nun Länge und aus der Länge wird die Dicke

               my.min_y = -4;

des Zaunes. Diese Abmaße der Bounding_box

               my.max_y = 4;

sind nur passend wenn der Panwinkel des Zaunes

                   }

90° oder 270° beträgt.

}