Einzelnen Beitrag anzeigen

Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#719

Re: Andorra 2D [Ver. 0.40, 01.07.08]

  Alt 6. Jul 2008, 03:38
Zitat von inherited:
Da bin ich jetzt ehrlich gesagt etwas ratlos, das sieht eigentlich korrekt aus
Könntest du eventuell nochmal deine Zeicheroutine zeigen?
Der Code zum Zeichnen der Tiles ist in diesem Fall folgender:
Delphi-Quellcode:
// Diese procedure wird von TSgGame für jedes Tile aufgerufen, dass gezeichnet werden soll:
procedure TSgGame.DoPaintTile(const Tile: tSgTile);
var
  done: boolean;
begin
  done := false;
  if Assigned(fOnPaintTile) then
    fOnPaintTile(Tile,done);
  if not done then
    if Tile.sprite <> nil then
      Tile.DrawTo(adDraw,Camera);
end;

// Diese procedure wird durch den obigen Code aufgerufen:
procedure TSgEditMode.PaintTile(const Tile: tSgTile; var Done: Boolean);
{...}
begin
  {...}
  if Tile.sprite <> nil then
  begin
    Tile.sprite.Color := cl; // Tile wird je nach Typ eingefärbt
    Tile.sprite.Draw(fParent.adDraw,round(Tile.left-fParent.Camera.left),
      round(Tile.top-fParent.Camera.top),0);
    Tile.sprite.Color := clwhite;
  end;
  {...}
  Done := True;
end;
Erläuterung:
Ich habe Zusatzfunktionen, wie zum Beispiel die Editorfunktion als eine Art "Plugin" geplant. TSgGame verwaltet eine Liste mit Plugins, die sich in bestimmte Events einklinken können, um bestimmte Funktionen nachzurüsten (praktisch z.B. für einen Debug-Mode).
Dieses Plugin belegt das Event OnPaintTile des TSgGame-Objektes. Das Plugin sorgt dann dafür, dass z.B. ein Rahmen um das Tile gezeichnet wird, der im Spiel hinterher natürlich nicht erschinen soll, und dass das Tile eingefärbt wird.


Schlussendlich noch die Paint-Routine von TSgGame:
Delphi-Quellcode:
procedure TSgGame.Paint;
var
  x1,y1,x2,y2: integer;
  i: integer;
  tmptilelist: tsgtilelist;
begin
  if addraw.CanDraw then
  begin
    fPerformanceCounter.Calculate;
    fTimeGap := fPerformanceCounter.TimeGap/100;

    adDraw.BeginScene;
    adDraw.ClearSurface(clblack);

    // Der folgende Code scheint etwas komplex, was daran liegt, dass ich die gesamte Spielfläche
    // zur Optimierung in ein Raster unterteile. Jede Zelle enthält eine Liste, die speichert, welche
    // Tiles in ihr liegen.
    // Der Code tut also folgendes: Er sucht alle Quadrate die im Sichtfeld liegen und liest alle in
    // diesen Quadraten vorhandenen Tiles in eine temporäre Liste ein. In der for-Schleife wird dann
    // jedes Element gezeichnet. (natürlich kann schlimmstenfalls es passieren, dass ein Tile so 4 mal
    // gezeichnet wird, was aber imemr noch effizienter sein dürfte, als immer ALLE Tiles zu zeichnen
    x1 := floor(camera.left-bg_sectorsize);
    y1 := floor(camera.top-bg_sectorsize);
    x2 := floor(camera.left+camera.width);
    y2 := floor(camera.top+camera.height);

    tmptilelist := tsgtilelist.Create(false);
    Map.Grid.TilesNearRect(x1,y1,x2,y2,tmptilelist);
    for i := 0 to tmptilelist.Count - 1 do
      DoPaintTile(tmptilelist[i]);
    freeandnil(tmptilelist);

    {...}

    adDraw.EndScene;
    adDraw.Flip;
  end;
end;

@Diamondback2007:
Also das erste Fenster kann ich bei dir nicht in der Größe verändern, und im zweiten ändert sich die Größe der Darstellung nicht und die Buttons funktionieren auch.
Bei mir werden die Koordinaten nur beim kleinen Screenshot falsch zugeorndet, der Rest funktioniert.
  Mit Zitat antworten Zitat