Einzelnen Beitrag anzeigen

Peter666

Registriert seit: 11. Aug 2007
357 Beiträge
 
#9

AW: Line mit Winkel zeichnen

  Alt 14. Okt 2014, 12:45
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

Geändert von Peter666 (14. Okt 2014 um 12:53 Uhr)
  Mit Zitat antworten Zitat