Ich habe gedacht, eine kleine, simple Sprite-Engine könnte manchen helfen, weil ich selbst erst eine Weile gebraucht hab, um sie so hinzubekommen, wie sie jetzt ist. Ich will auch sicher nicht sagen, dass das jetzt die ultimativschnellste Methode ist.. das vorweg.
Am leichtesten zu verstehen ist das Tut, wenn man den Anhang runterlädt und es dann vor Augen hat, glaub ich..
Ich habe ersteinmal gegooglet und Sprite-Bildchen von Link aus dem SNES-Zelda geholt, weil er für mich so eine Art Standard-Held ist, wenns um 2D-Games geht. (ich weiß, irgendwas ist da mitn Bildchen bzw deren Reihenfolge nicht so sauber gelungen aber die Sprites die ich gefunden hab, waren nunmal nicht vollständig..)
Im Projekt-Ordner ist ein Unterordner 'sprites', in dem alle Bilder nach l, r, u, d (left, right, up, down) und nummern geordnet sind. 1 ist das Bild, bei dem link sich nicht bewegt, also steht. Die anderen sind nacheinander Bildchen bei denen er läuft.
Man erstelle einen Timer und ein TImage (meins heißt 'link'
).
Delphi-Quellcode:
public
i, d :integer; // i als Zählvariable, d für direction, die Laufrichtung von Link.
end; // nicht irritieren lassen, im anhang sind noch x und y als Koordinaten, die jedoch noch nicht verwendet werden.
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if (GetAsyncKeystate(VK_left) = 0)
and (GetAsyncKeystate(VK_right) = 0)
and (GetAsyncKeystate(VK_up) = 0)
and (GetAsyncKeystate(VK_down) = 0) then i:=1;
// wenn der Wert bei allen 4 Pfeiltasten 0 ist, heißt es, dass keine gedrückt ist, also steht.
// i steht für die Nummer des Sprite-Bildchens. Das 'link steht'-Bild ist ja 1.
if GetAsyncKeystate(VK_left) < 0 then
begin link.Left := link.Left -2; // link soll sich um 2 bewegen (sah am besten aus, find ich)
d:=1; // ich musste ja irgendwie Richtungen zuweisen. 1=links, 2=rechts, 3=oben, 4=unten
i:=i+1; // damit die Laufbildchen sich ändern
if i=13 then i:=1; // ich habe 6 Bildchen, also müsste ich bei i=7 zu i=1 wechseln.
// aber wenn man die zu oft wechselt, siehts aber wie vorgespult aus.
// darum jedes 2. später muss ich durch 2 teilen und runden und 13/2 wäre 6,5 und gerundet 7. darum i=1 ^^
end;
if GetAsyncKeystate(VK_right) < 0 then
begin link.left := link.left +2;
d:=2;
i:=i+1;
if i=13 then i:=1; // dasselbe mit rechts.
end;
if GetAsyncKeystate(VK_up) < 0 then
begin link.top := link.top -2; // die y-Achse in Delphi geht von oben nach unten, ich bin einfach unten nach oben gewöhnt.
// darum ist oben y-2 und unten y+2 ;)
d:=3;
i:=i+1;
if i=17 then i:=1; // 17, weil ich halt 8 Bildchen hab und bei 9 wechseln muss. 17/2=8,5, gerundet 9
end;
if GetAsyncKeystate(VK_down) < 0 then
begin link.top := link.top +2;
d:=4;
i:=i+1;
if i=15 then i:=1;
end;
// hier wird jede Richtung direkt abgelesen und i wird durch 2 geteilt und gerundet und direkt in den Bildnamen eingefügt.
// das heißt aber auch, man muss schaun, dass man die Bilder, die man aufruft auch im Angegebenen Ordner hat!
if d=1 then link.Picture.loadfromfile('sprites\l'+inttostr(round(i/2+0.4))+'.bmp');
if d=2 then link.Picture.loadfromfile('sprites\r'+inttostr(round(i/2+0.4))+'.bmp');
if d=3 then link.Picture.loadfromfile('sprites\u'+inttostr(round(i/2+0.4))+'.bmp');
if d=4 then link.Picture.loadfromfile('sprites\d'+inttostr(round(i/2+0.4))+'.bmp');
// kleine Spielerei von mir, damit Link nicht aus dem Fenster ins Nichts laufen kann.
if link.Top>425 then link.Top:=-24;
if link.Left>425 then link.Left:=-24;
if link.Top<-24 then link.Top:=425;
if link.Left<-24 then link.Left:=425;
// im Anhang wird hier noch x und y angegeben. wie gesagt verwende ich sie hier nicht ^^
end;
jetzt pls nicht treten, ich bin noch keine Woche in dem Forum, dachte einfach, dass auch Noob-Tutorials gefragt sien könnten ^^