Die Anzeige ist abstrakt gehalten. Das Spiel nutzt lediglich ein Interface das die Hauptanwendung für die Anzeige anbietet.
Die Spieleklasse bekommt die Größe des Anzeigefenster, weiß die Spielfeldgröße und soll stets anhand des Skalierungsfaktors einen Spielausschnitt zeichnen, wobei bei Faktor 1 das Spielfeld komplett im Fenster (unter Berücksichtigung des Bildseitenverhältnisses) angezeigt wird.
Mir schwebt so etwas vor:
Delphi-Quellcode:
TScaleScene = class
protected
FScale: integer;
FScreenWidth: integer;
FScreenHeight: integer;
FMousePos: TPointF;
FCameraPos: TPointF;
FPreMovePos: TPointF;
public
constructor Create;
procedure SetScreen(const AWidth, AHeight: integer);
procedure DoMouseMove(const x, y: single; const ButtonA, ButtonB: Boolean);
procedure DoMouseDelta(const Delta: Integer);
end;
constructor TScaleScene.create;
begin
FScale := 32;
FCameraPos := PointF(0, 0);
FPreMovePos := PointF(-1, -1);
end;
procedure TScaleScene.SetScreen(const AWidth, AHeight: integer);
begin
FScreenWidth := AWidth;
FScreenHeight := AHeight;
end;
procedure TScaleScene.DoMouseDelta(const Delta: Integer);
var cmx, cmy: single;
begin
if (Delta <> 0) then
begin
cmx := FCameraPos.X / FScale;
cmy := FCameraPos.Y / FScale;
FScale := FScale - Delta;
if (FScale < 16) then
FScale := 16;
if (FScale > 64) then
FScale := 64;
FCameraPos.X := trunc(cmx * FScale);
FCameraPos.Y := trunc(cmy * FScale);
end;
end;
procedure TScaleScene.DoMouseMove(const x, y: single; const ButtonA, ButtonB: Boolean);
var
cmx, cmy: single;
begin
if ButtonA then
begin
if (FPreMovePos.X <> -1) and (FPreMovePos.Y <> -1) then
begin
FCameraPos.X := FCameraPos.X - (x - FPreMovePos.X);
FCameraPos.Y := FCameraPos.Y - (y - FPreMovePos.Y);
end;
FPreMovePos.X := x;
FPreMovePos.Y := y;
end
else
begin
FPreMovePos.X := -1;
FPreMovePos.Y := -1;
end;
if ButtonB then
begin
cmx := FCameraPos.X / FScale;
cmy := FCameraPos.Y / FScale;
FScale := 32;
FCameraPos.X := trunc(cmx * FScale);
FCameraPos.Y := trunc(cmy * FScale);
end;
if (FCameraPos.X < 0) then
FCameraPos.X := 0;
if (FCameraPos.Y < 0) then
FCameraPos.Y := 0;
if FCameraPos.X > FScreenWidth then
FCameraPos.X := FScreenWidth;
if FCameraPos.Y > FScreenHeight then
FCameraPos.Y := FScreenHeight;
FMousePos.X := FMousePos.X / FScale;
FMousePos.Y := FMousePos.Y / FScale;
end;
Peter