Ich liebe Nebel! Er sieht gut aus und ist sehr nützlich, wenn Sie große Welten erstellen. Aber wie setzrn wir seine Farbe und Stärke? Öffnen Sie ein Level im WED und klicken auf File -> Map -> Properties -> Fog und setzen Sie die Farbe. Lassen Sie die Map ausrechnen, starten Sie und wenn Ihnen das Ergebnis nicht gefällt, müssen Sie von vorn beginnen... dieser Code erlaubt Ihnen nun, den Nebel zur Laufzeit einzustellen; klicken Sie auf die Knöpfe und sobald Sie mit dem Ergebnis zufrieden sind, übernehmen Sie die Werte in Ihr Skript.
Schauen wir uns das Panel für den Nebel näher an:
Sieht alles ganz normal aus, oder? Wir können die 5 Werte ändern (red, green, blue, start und end), indem wir mit Hilfe von 5 Paaren von Knöpfen die Werte erhöhen oder senken. Dieses simple, aber nett aussehende Interface wurde mit einem Text und einem Panel erstellt:
text
fog_txt
{
font = terminal9_font;
pos_x = 10;
pos_y = 10;
string = "red (d3d_fogcolor1.red):\ngreen (d3d_fogcolor1.green):\nblue
(d3d_fogcolor1.blue):\nstart (camera.fog_start):\nend (camera.fog_end):";
flags = d3d, visible;
}
Der Text hat einen langen String; er zeigt den Wert für red (d3d_fogcolor1.red) und \n (newline) bewirkt dann einen Zeilenumbruch. Somit erhalten wir 5 Zeilen Text mit einem einzelnen String. Sehen wir uns die Definition des Panels an:
panel
fog_pan
{
pos_x = 0;
pos_y = 0;
button = 190, 10, arrowup_pcx, arrowup_pcx, arrowup_pcx, change_fog, null,
null;
button = 202, 10, arrowdown_pcx, arrowdown_pcx, arrowdown_pcx, change_fog,
null, null;
button = 190, 22, arrowup_pcx, arrowup_pcx, arrowup_pcx, change_fog, null,
null;
button = 202, 22, arrowdown_pcx, arrowdown_pcx, arrowdown_pcx, change_fog,
null, null;
button = 190, 34, arrowup_pcx, arrowup_pcx, arrowup_pcx, change_fog, null,
null;
button = 202, 34, arrowdown_pcx, arrowdown_pcx, arrowdown_pcx, change_fog,
null, null;
button = 190, 46, arrowup_pcx, arrowup_pcx, arrowup_pcx, change_fog, null,
null;
button = 202, 46, arrowdown_pcx, arrowdown_pcx, arrowdown_pcx, change_fog,
null, null;
button = 190, 58, arrowup_pcx, arrowup_pcx, arrowup_pcx, change_fog, null,
null;
button = 202, 58, arrowdown_pcx, arrowdown_pcx, arrowdown_pcx, change_fog,
null, null;
digits = 155, 10, 3, terminal9_font, 1, d3d_fogcolor1.red;
digits = 155, 22, 3, terminal9_font, 1, d3d_fogcolor1.green;
digits = 155, 34, 3, terminal9_font, 1, d3d_fogcolor1.blue;
digits = 145, 46, 5, terminal9_font, 1, camera.fog_start;
digits = 145, 58, 5, terminal9_font, 1, camera.fog_end;
flags = overlay, refresh, d3d, visible;
}
Es
mag komplex aussehen, ist es aber nicht. Die Definition erzeugt:
-
10 Knöpfe (5 Paare), die für die Änderung der Werte zuständig
sind;
-
5 Zahlen, die diese Werte anzeigen sollen.
Wie Sie sehen verwende ich nur 2 Bitmaps (arrowup_pcx und arrowdown_pcx) und alle Knöpfe haben dieselbe Funktion, die bei einem Klick darauf ausgeführt wird: change_fog.
function
change_fog(button_number)
{
if (button_number == 1)
{
d3d_fogcolor1.red = min(255, (d3d_fogcolor1.red + 5));
}
if (button_number == 2)
{
d3d_fogcolor1.red = max(0, (d3d_fogcolor1.red - 5));
}
if (button_number == 3)
{
d3d_fogcolor1.green = min(255, (d3d_fogcolor1.green + 5));
}
if (button_number == 4)
{
d3d_fogcolor1.green = max(0, (d3d_fogcolor1.green - 5));
}
if (button_number == 5)
{
d3d_fogcolor1.blue = min(255, (d3d_fogcolor1.blue + 5));
}
if (button_number == 6)
{
d3d_fogcolor1.blue = max(0, (d3d_fogcolor1.blue - 5));
}
if (button_number == 7)
{
camera.fog_start = min(5000, (camera.fog_start + 50));
}
if (button_number == 8)
{
camera.fog_start = max(0, (camera.fog_start - 50));
}
if (button_number == 9)
{
camera.fog_end = min(10000, (camera.fog_end + 50));
}
if (button_number == 10)
{
camera.fog_end = max(0, (camera.fog_end - 50));
}
}
Wenn der erste Knopf (also der, dem die erste Definition entspricht) gedrückt wurde, dann wird button_number auf 1 gesetzt. Bei Druck auf den sechsten Knopf, wird button_number auf 6 gesetzt. Danken Sie nicht mir dafür, J.C. Lotter hat mitsamt der Engine den Code für diese schlauen Panels bereitgestellt. Auf diese Weise genügt eine einzelne Funktion für alle Knöpfe und wir können sie verschiedene Dinge tun lassen, abhängig von der button_number.
Wenn der erste Knopf gedrückt wird, erhöht sich der Wert von d3d_fogcolor1.red, bis er 255 erreicht hat. Jeder Mausklick erhöht den Wert um 5, wenn Sie kleiner Schritte möchten, benutzen Sie hier einen anderen Wert. Der zweite Knopf verringert d3d_fogcolor1.red, bis 0 erreicht wird. Dasselbe geschieht mit den anderen Knöpfen und den Werten d3d_fogcolor1.green, d3d_fogcolor1.blue, camera.fog_start und camera.fog_end. Die letzten beiden Werte können sehr groß werden, daher ändert ein Klick diese Werte um 50.
Sie sicherlich bemerkt haben, ändern wir die ganze Zeit d3d_fogcolor1, das ist die Farbe des ersten Nebels in WED. Eines müssen wir also noch tun: wir müssen der Engine mitteilen, dass wir diese Farbe als Nebelfarbe benutzen wollen und diese kleine Funktion hier tut genau das:
starter
init_fog()
{
fog_color = 1;
}
Diese “Starter” Funktion läuft von selbst, wenn Sie das Level starten. Tun Sie das und setzen Sie die Nebelwerte, bis Sie zufrieden sind. Schreiben Sie die Werte dann ab und setzen Sie an das Ende Ihrer Main Funktion:
function
main()
{
..............
..............
fog_color = 1; // use the first fog color
d3d_fogcolor1.red = 85; // your values here
d3d_fogcolor1.green = 45; // your values here
d3d_fogcolor1.blue = 95; // your values here
camera.fog_start = 400; // your values here
camera.fog_end = 2500; // your values here
}
Wenn
Sie keine Knöpfe verwenden wollen, können Sie sie durch Slider
ersetzen.
Laufzeit-Debugger
"Laufzeit-Debugger" klingt zu schön um wahr zu sein, oder? Ich lasse Sie selbst entscheiden, ob dieses Tool seinen Nutzen hat oder nicht. Starten Sie die Engine, drücken Sie “I”, um den Debugger anzuzeigen, klicken Sie mit rechts, um den Mauszeiger darzustellen und bewegen Sie den Cursor über eine beliebige Entity im Level. Sie werden die Werte für x, y, z, pan, tilt, roll, red, green, blue, ambient, alpha, skill1 bis skill8 und frame sehen. Ändert sich einer dieser Werte, sehen Sie dies zur Laufzeit. Auf diese Weise können Sie Ihren Code testen und verbessern, ohne andere Tools einsetztn zu müssen. Ich bin etwas schüchtern, hätte aber ohne Probleme die restlichen Skills, die Flags und noch mehr auf demselben Panel unterbringen können, wirklich!
Wenn Sie den Debugger mögen, sind Sie sicher gespannt, wie er funktioniert; wenn Sie jetzt aber erwarten, eine Menge komplizierten Code zu sehen, werden Sie enttäuscht sein. Der Code enthält Definitionen für einen Text und ein Panel:
text
info_txt
{
font = terminal9_font;
pos_x = 10;
pos_y = 10;
string = "x:\ny:\nz:\npan:\ntilt:\nroll:\nred:\ngreen:\nblue:\nambient:\nalpha:\nskill1:\nskill2:\nskill3:\nskill4:\nskill5:\nskill6:\nskill7:\nskill8:\nframe:";
flags = d3d, visible;
}
Das Panel zeigt einen langen String an, weil ich den ganzen Text mit demselben String darstelle und mit Newline (\n) Zeilenumbrüche erzeuge. Ich benutze außerdem ein Panel mit Digits, um die Ziffern darzustellen:
panel
info_pan
{
pos_x = 0;
pos_y = 0;
digits = 50, 10, 5, terminal9_font, 1, mouse_ent.x;
digits = 50, 22, 5, terminal9_font, 1, mouse_ent.y;
digits = 50, 34, 5, terminal9_font, 1, mouse_ent.z;
digits = 50, 46, 5, terminal9_font, 1, mouse_ent.pan;
digits = 50, 58, 5, terminal9_font, 1, mouse_ent.tilt;
digits = 50, 70, 5, terminal9_font, 1, mouse_ent.roll;
digits = 50, 82, 5, terminal9_font, 1, mouse_ent.red;
digits = 50, 94, 5, terminal9_font, 1, mouse_ent.green;
digits = 50, 106, 5, terminal9_font, 1, mouse_ent.blue;
digits = 50, 118, 5, terminal9_font, 1, mouse_ent.ambient;
digits = 50, 130, 5, terminal9_font, 1, mouse_ent.alpha;
digits = 50, 142, 5, terminal9_font, 1, mouse_ent.skill1;
digits = 50, 154, 5, terminal9_font, 1, mouse_ent.skill2;
digits = 50, 166, 5, terminal9_font, 1, mouse_ent.skill3;
digits = 50, 178, 5, terminal9_font, 1, mouse_ent.skill4;
digits = 50, 190, 5, terminal9_font, 1, mouse_ent.skill5;
digits = 50, 202, 5, terminal9_font, 1, mouse_ent.skill6;
digits = 50, 214, 5, terminal9_font, 1, mouse_ent.skill7;
digits = 50, 226, 5, terminal9_font, 1, mouse_ent.skill8;
digits = 50, 238, 5, terminal9_font, 1, mouse_ent.frame;
flags = refresh, d3d, visible;
}
Ich brauche eine Menge “digits” Anweisungen. Alle Werte, die angezeigt werden brauchen bis zu 5 Stellen, in der Schriftart terminal9_font. Die Werte werden mit 1 multipliziert (also unverändert dargestellt). Nun kommt der seltsame Teil: die Werte sind alle von der Form mouse_ent.x, mouse_ent.roll, mouse_ent.skill2... was ist dieses mouse_ent überhaupt? Dem Handbuch zufolge ist mouse_ent die Entity, über welcher sich der Mauszeiger befindet. Befindet sich dieser über einer Tür, ist mouse_ent der Zeiger auf diese Tür, also sehen wir die Werte x, y, z, pan, tilt, roll, ... für die Tür. Dies geht mit jeder Entity im Level; wenn der Mauszeiger sich auf keiner Entity befindet, sind alle Werte 0.
Ich habe eine “starter” Funktion geschrieben, weil diese zum Start des Spiels ablaufen soll:
starter
debug_init()
{
while (1)
{
if (key_i == 1)
{
while (key_i == 1) {wait (1);}
info_txt.visible = (info_txt.visible == off); // toggle visibility
info_pan.visible = (info_txt.visible == on); // same thing here
}
Das Drücken der “I” Taste zeigt den Debugger an, bzw. entfernt ihn wieder (also das Panel und den Text). Ich warte, bis die Taste losgelassen würde, sonst würde der Debugger in jedem Frame erscheinen / verschwinden, solange diese Taste gedrückt ist.
if (mouse_ent != null) // entity detected?
{
if (total_frames % 100 == 1) // play a sound every 100 frames
{
snd_play(entity_wav, 10, 0);
}
}
wait (1);
}
}
Wenn die Maus über einer Entity ist, wird mouse_ent dieser Entity zugewiesen, ist also nicht null. Wenn dies geschieht, lasse ich jede 100 Frames einen Sound ertönen, der anzeigen soll, dass die Maus auf eine Entity zeigt, die angezeigten Werte also sinnvoll sind.
Wenn
Sie mehr Werte sehen wollen, fügen Sie einfach entsprechende “digits”
Anweisungen zum Panel hinzu. Das ist alles!