Vorweg: Ich arbeite an einem 2D Spiel und verwende Andorra 2D...
Delphi-Quellcode:
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
if Key = #27 then Close;
if (Key = 'a') and (Spieler.IsIdle) then
begin
Spieler.FDistance := 40;
Spieler.RRichtung := Links;
Spieler.IsMoving := true;
end;
if (Key = 'w') and (Spieler.IsIdle) then
begin
Spieler.FDistance := 40;
Spieler.RRichtung := Hoch;
Spieler.IsMoving := true;
end;
if (Key = 'd') and (Spieler.IsIdle) then
begin
Spieler.FDistance := 40;
Spieler.RRichtung := Rechts;
Spieler.IsMoving := true;
end;
if (Key = 's') and (Spieler.IsIdle) then
begin
Spieler.FDistance := 40;
Spieler.RRichtung := Runter;
Spieler.IsMoving := true;
end;
end;
Dann soll er bei jedem Frame berechnen:
Delphi-Quellcode:
if Spieler.IsMoving then
begin
Spieler.Schritt();
end;
und dann:
Delphi-Quellcode:
procedure TSpieler.Schritt();
begin
FDistance := FDistance - FSpeed * Performance.Timegap / 1000;
case RRichtung of
Links:begin
FXpos := FXpos - FSpeed * Performance.Timegap / 1000;
FXPosTile := FXPosTile - (FSpeed/48) * Performance.Timegap / 1000;
end;
Rechts:begin
FXpos := FXpos + FSpeed * Performance.Timegap / 1000;
FXPosTile := FXPosTile + (FSpeed/48) * Performance.TimeGap / 1000;
end;
Hoch:begin
FYpos := FYpos - FSpeed * Performance.Timegap / 1000;
FYPosTile := FYPosTile - (FSpeed/48) * Performance.TimeGap / 1000;
end;
Runter: begin
FYpos := FYpos + FSpeed * Performance.Timegap / 1000;
FYPosTile := FYPosTile + (FSpeed/48) * Performance.TimeGap / 1000;
end;
end;
if FDistance <= 0 then
begin
if ((RRichtung = Links) and (GetAsyncKeyState(65) <> 0) or // A
(RRichtung = Rechts) and (GetAsyncKeyState(68)<> 0 ) or // D
(RRichtung = Hoch) and (GetAsyncKeyState(87)<> 0) or // W
(RRichtung = Runter) and (GetAsyncKeyState(83)<> 0)) then // S
begin
FDistance := 5;
end
else
FMoving := false;
end;
end;
*Edit
Delphi-Quellcode:
// Wenn er aus der Karte herausgeht, dann
if Spieler.FXposTile >= 26 then //rechts
begin
Spieler.FXposTile := 0;
MapTeilX := MapTeilX + 1;
Map.Start;
end;
if Spieler.FYposTile > 20 then //unten
begin
Spieler.FYposTile := 0;
MapTeilY := MapTeilY +1;
Map.Start;
end;
if Spieler.FXposTile < 0 then //links
begin
Spieler.FXposTile := 25;
MapTeilX := MapTeilX - 1;
Map.Start;
end;
if Spieler.FYposTile < 0 then //oben
begin
Spieler.FYposTile := 19;
MapTeilY := MapTeilY - 1;
Map.Start;
end;