Animierte Sprites

Alle paar Wochen höre ich diese Frage: ist es möglich, ein Panel zu animieren? Normalerweise würde ich mit „Nein“ antworten, aber dieses Magazin widerlegt mich wieder einmal; wir können eine Sprite Entity erzeugen und sie irgendwo auf dem Bildschirm platziere.

Als erstes erstellen wir ein Panel:

panel energy_pan // background panel
{
bmap = panel_pcx;
layer = 20;
pos_x = 0;
pos_y = 0;
flags = d3d, overlay, refresh, visible;
}

Danach erstellen wir die Sprite Entity, unser animiertes Sprite:

entity energy_sprite
{
type = <energy+10.pcx>;
layer = 25;
view = camera;
x = 350;
y = 134;
z = 124;
flags = visible, flare, bright;
}

Es ist wichtig, die korrekten Werte für x, y und z zu wählen, denn sie bestimmen Ort und Größe des Sprites. Nun müssen wir nur noch die Animation abspielen, indem wir eine simple Funktion verwenden:
function init_animsprite()
{
while (1)
{
energy_sprite.frame += 0.3 * time;
if (energy_sprite.frame > 10)
{
energy_sprite.frame %= 10; // loop
}
wait (1);
}
}
Wie Sie sehen hat das Sprite 10 Frames, die in einer Schleife laufen; die Geschwindigkeit kann verändert werden, wenn Sie die 0,3 abändern.

Neuer Debug Code

Ich schätze, Sie kennen die Reihen von Zahlen, die erscheinen, wenn Sie D drücken, während das Spiel läuft. Ich muß zugeben, dass ich ein wenig Angst hatte, als ich diese Werte das erste Mal sah (ich habe immer noch Angst, aber behalten Sie das bitte für sich), vor allem, weil ich keine Ahnung hatte, wofür sie stehen. Dieser neue Debug Code wird ein Panel mit wichtigen Daten anzeigen, zusammen mit Text, der erklärt, wofür alles steht. Ich hoffe, dass Sie ihre Levels mit diesem neuen Tool besser optimieren können.

Als erstes sehen wir uns die interessanten Werte an, die die Engine uns abietet:
- num_actions, die Anzahl der laufenden Actions;
- num_visents, die Anzahl der sichtbaren Entities;
- num_visentpolys, die Anzahl der sichtbaren Model und Sprite Polygone;
- num_smappolys, die Anzahl der sichtbaren Map und WMB Polygone;
- d3d_texskins, Speicher, der von Models und Sprites genutzt wird;
- d3d_texbmaps, Speicher, der von Panels und globalen Entities genutzt wird;
- d3d_texsurfs, Speicher, der von WMB Entities genutzt wird;
- d3d_texsmaps, Speicher, der von den Schatten Maps genutzt wird;
- d3d_texfree, freier Videospeicher
All diese Werte (und ein paar weitere) werden auf einem Panel angezeigt, welches die folgende Definition hat:

panel debug_panel
{
bmap = debug_pcx;
layer = 30;
pos_x = 0;
pos_y = 0;

digits = 40,20,5,arial10_font,1,num_actions;
digits = 40,60,5,arial10_font,1,num_visents;
digits = 40,100,5,arial10_font,1,num_visentpolys;
digits = 40,142,5,arial10_font,1,num_vismappolys;
digits = 40,186,5,arial10_font,1,temp_texskins;
digits = 40,230,5,arial10_font,1,temp_texbmaps;
digits = 40,274,5,arial10_font,1,temp_texsurfs;
digits = 40,321,5,arial10_font,1,temp_texsmaps;
digits = 40,364,5,arial10_font,1,temp_total;
digits = 40,410,5,arial10_font,1,temp_free;
digits = 40,455,5,arial10_font,16,temp_fps;

flags = overlay, refresh, d3d;
}

Wie Sie sehen erscheinen einige der Werte in der Definition ohne Änderung; andere werden in einer Schleife berechnet:

function toggle_debug()
{
on_d = null; // deactivate the standard debug panel
while (1)
{
temp_texskins = d3d_texskins / 1024;
temp_texbmaps = d3d_texbmaps / 1024;
temp_texsurfs = d3d_texsurfs / 1024;
temp_texsmaps = d3d_texsmaps / 1024;
temp_total = (d3d_texskins + d3d_texbmaps + d3d_texsurfs + d3d_texsmaps) / 1024;
temp_free = d3d_texfree / 1024;
temp_fps = 0.9 * temp_fps + 0.1 / time;
if (key_d == 1)
{
while (key_d == 1) {wait (1);}
debug_panel.visible = (debug_panel.visible == off);
}
wait (1);
}
}

Die erste Zeile deaktiviert das Standard Debugpanel, welches erscheint, wenn man D drückt. Alle Werte, die sich auf Speicher beziehen werden in Kb angegeben, also teilen wir sie durch 1024, um Sie in Mb anzeigen zu können. Wir addieren diese Werte für den gesamten Speicherverbrauch des Levels und ermitteln die Frame Rate (1 / time), um Einbrüche der Fps zu sehen. Das Panel wird erscheinen bzw. verschwinden, wenn D gedrückt wird.

Beachten Sie bitte, dass d3d_texfree einen größeren Wert anzeigen kann, als tatsächlich Speicher auf Ihrer Grafikkarte vorhanden ist, denn viele moderne 3D Karten verschieden Komprimieralgorithmen verwenden. Einige Ihrer Kunden werden ältere Karten benutzen, also achten Sie eher auf „Total Memory Used“ und nicht so sehr auf „Texture free“.