AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Line mit Winkel zeichnen

Ein Thema von Peter666 · begonnen am 11. Okt 2014 · letzter Beitrag vom 14. Okt 2014
Antwort Antwort
Jens01

Registriert seit: 14. Apr 2009
674 Beiträge
 
#1

AW: Line mit Winkel zeichnen

  Alt 13. Okt 2014, 23:22
Bei Graphics32 gibts solche TImage-Komponenten, die skalieren können.
Ansonsten Vektorgraphik benutzen.
Achtung: Bin kein Informatiker sondern komme vom Bau.
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Line mit Winkel zeichnen

  Alt 14. Okt 2014, 09:02
Dann wir es vermutlich Zeit sich von den CanvasPixeln zu verabschieden und mm Werte zu verwenden? Ich würde die Objekte in mm speichern und ausrechnen, mit ppMM in CanvasPunkte umrechnen und auf eine Metafile zeichnen. Die Metafile dann mit StrechDraw in einer Paintbox anzeigen (so kann man auch bequem zoomen). Die Objekte zentriert zu platzieren ist gar nicht so leicht, aber auch nix weltbewegendes (Zusammenspiel von Grafik-Schwerpunkt und Canvas-Schwerpunkt). Zunächst brauchst du eine Entscheidung wo der Ursprung deines mm Koordinatensystems liegen soll. Gebräuchlich sind unten links (mmY nach oben positiv) und oben links (mmY nach unten positiv).
  Mit Zitat antworten Zitat
Peter666

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

AW: Line mit Winkel zeichnen

  Alt 14. Okt 2014, 10:38
Das Spielfeld ist ja kein Bild sondern ein Array aus den entsprechenden Tiles. Gezeichnet wird das ganze dann in etwa so: Display.DrawTile(X,Y,ScaleFactor,Tile);

Wobei der Scalefactor dann der Anzeigelogik sagt wie groß das Tile gezeichnet werden soll. Das komplett auf ein Bild zu malen wäre zu viel des Guten.

Peter
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Line mit Winkel zeichnen

  Alt 14. Okt 2014, 11:33
Dann hast du es doch schon fast so? Was für ein Canvas meinst du mit Display? Ist das FMX Zeugs?
  Mit Zitat antworten Zitat
Peter666

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

AW: Line mit Winkel zeichnen

  Alt 14. Okt 2014, 11: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 11:53 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:21 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz