Thema: Pacman

Einzelnen Beitrag anzeigen

Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#11

AW: Pacman

  Alt 8. Feb 2012, 16:17
Der komplette Quelltext liegt nicht vor.
Die Änderungsvorschläge basieren also nur auf Vermutungen oder sind allgemeiner Natur:

Den Destructor Detroy immer mit override kennzeichnen, sonst wird dieser durch Free nicht aufgerufen.
Delphi-Quellcode:
  public
    constructor Create();
    destructor Destroy(); override;
Das TphGameField kennt die eigene Position auf dem Canvas und die Position der Elemente und sollte deshalb die Berechnung der absoluten Zeichenposition übernehmen.
Das Erzeugen der TphMonster könnte z.B. im Constructor von TphGameField erfolgen, aber garantiert nicht in eine Zeichenfunktion:
Delphi-Quellcode:
procedure TphGameField.DrawMonsters(ACanvas: TCanvas);
var
  i, x, y: Integer;
begin
  for i := 0 to high(FMonsterArray) do
  begin
    if Assigned(FMonsterArray[i]) then
    begin
      // (Position des Monsters - eigener Scrollposition) * Feldgrösse
      // Feldgrösse nur multiplizieren, wenn die Positionen nur den Feldindex beinhalten
      x := (FMonsterArray[i].Position.x - FPosition.x) * FSize;
      y := (FMonsterArray[i].Position.y - FPosition.y) * FSize;
      FMonsterArray[i].Draw(ACanvas, Rect(x, y, x + FSize, y + FSize));
    end;
  end;
end;
Randomize sollte nur an einer Stelle im Programm genau einmal aufgerufen werden.
Warum ist der Aufruf des geerbten Constructor auskommentiert?
Die Anfangsposition der Monster zu setzen, ist sicher die Aufgabe des TphGameField.
Schließlich kennt nur das Spielfeld seine Größe und die Position anderer Monster, Spieler und Hindernisse.
Am besten gleich nach dem Erzeugen oder wie bereits vorgeschlagen als Parameter.
Delphi-Quellcode:
constructor TphMonster.Create(x, y: Integer);
begin
  inherited Create;
  FPosition.Position.X := x;
  FPosition.Position.Y := y;
end;
Ohne Aufruf einer Zeichenfunktion wird das Monster überhaupt nicht gezeichnet:
Delphi-Quellcode:
procedure TphMonster.Draw(ACanvas: TCanvas; ARect: TRect);
begin
  ACanvas.brush.color := clRed;
  ACanvas.Ellipse(ARect.Left, ARect.Top, ARect.Right, ARect.Bottom);
end;
  Mit Zitat antworten Zitat