Einzelnen Beitrag anzeigen

Oxmyx

Registriert seit: 21. Sep 2004
499 Beiträge
 
#8

Re: [DelphiX] Im RPG die Karte flüssig bewegen...

  Alt 24. Jul 2005, 13:47
Zitat von Master_RC:
danke!

jetzt muss mir nur mehr erklärt werden, wie ich dann den offset zeichne und nicht immer die "kompletten" tiles
Na indem du beim Zeichnen nicht immer nur in Vielfachen von 32 verschiebst, sondern auch mit den Zwischenwerten.

Am besten machst du es so: Du hast ein 2D-Array, das dein Spielfeld darstellt. Wenn jedes Feld 32x32 Pixel groß ist, und du z.B. 128 Felder in beide Richtungen hast, ist dein Spielfeld umgerechnet 4096x4096 Pixel groß. Den aktuellen Bildschirmausschnitt gibst du dann mit der linken oberen Koordinate des Bildschirms an.

Beispiel: Nehmen wir an, die linke obere Ecke des Bildschirms befindet sich an der Position ViewTopLeft = (1500/2700). Daraus berechnest du, welche Felder gezeichnet werden müssen:
Delphi-Quellcode:
  TileLeft := Trunc(ViewTopLeft.X / 32.0);
  TileTop := Trunc(ViewTopLeft.Y / 32.0);
  LeftOffset := ViewTopLeft.X mod 32;
  TopOffset := ViewTopLeft.Y mod 32;
Jetzt weißt du, dass du die Felder im Array ab den Indizes (TileLeft/TileTop) zeichnen musst, und davon noch LeftOffset bzw. TopOffset abziehen musst.

Die Zeichenroutine könnte so aussehen, wenn du ein TImage (Image1) als Zeichenfläche verwendest:
Delphi-Quellcode:
  for i := 0 to 20 do begin
    if i > MapWidth-1 then Continue;
    for j := 0 to 16 do begin
      if j > MapHeight-1 then Continue;
      BitBlt(Image1.Picture.Bitmap.Canvas.Handle,
             i * 32 - LeftFrac, j * 32 - TopFrac, 32, 32,
             Bitmaps[Map[BlockLeft+i, BlockTop+j]].Canvas.Handle,
             0, 0, SRCCOPY);
    end;
  end;
MapWidth ist die Breite der Karte, also z.B. 128 Felder. MapHeight analog dazu.
Map ist das 2D-Array der Karte, das Integers enthält. Dabei steht z.B. 0 für Wasser, 1 für Gras, 2 für Wege, etc.
Bitmaps ist ein Array aus Bitmaps, das die Bilder enthält, die schließlich gezeichnet werden.
  Mit Zitat antworten Zitat