Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Gegner auf Spielfeld richtig positionieren (https://www.delphipraxis.net/155178-gegner-auf-spielfeld-richtig-positionieren.html)

pustekuchen 13. Okt 2010 07:17

AW: Gegner auf Spielfeld richtig positionieren
 
Danke Fabian, hast natürlich recht ;)

Dennoch würd ich es dann so machen

Delphi-Quellcode:
type
  TEnemy = class(TObject)
  private
    FPos : TPoint; // Gibt die Position in Pixeln an

    function GetField : TPoint;
  public
    property Field : TPoint read GetField;
    property Pixels : TPoint read FPos write FPos;
  end;

function TEnemy.GetField : TPoint;
begin
  Result.X := FPos.X div 32;
  Result.Y := FPos.Y div 32;
end;

pustekuchen 13. Okt 2010 08:31

AW: Gegner auf Spielfeld richtig positionieren
 
Hab jetzt entgültig den Fehler gefunden, wodran es liegt das sie halt manchmal früher abbiegen.

Ich habe die Gegner immer nur einen pixel verschoben. Sobald also der Feldrand erreicht wurde zählte schon das nextField vom neuem Feld, obwohl er noch nicht richtig drauf ist und somit sind sie dann zu früh abgebogen.

Habs gelöst ;)
Zitat:

----

Jetzt hab ich aber ein Problem.
Wenn ich die Zeichenprozedur ausführe sobald i-ein gegner bewegt wird, dann läufts so ab:

Code:
Gegner 1 bewegt sich 1 Feld nach vorne...
[ZEICHNEN]
Gegner 1 bewegt sich 1 Feld nach vorne...
[ZEICHNEN]
[..bis 32..]

Gegner 2 bewegt sich 1 Feld nach vorne...
[ZEICHNEN]
Gegner 2 bewegt sich 1 Feld nach vorne...
[ZEICHNEN]
[..bis 32..]

usw..
Also wird jeder gegner nacheinander bewegt. Aber es soll ja so sein als würden, sich alle "gleichzeitig" bewegen.


--
Hier jetzt nochmal die aktuellen Prozeduren:

Delphi-Quellcode:
procedure TFormMain.moveEnemies(value: TGameStatus);
var
  fieldX, fieldY: Integer;
  i,k,j: Integer;
  tmpField :array of TNextField;
begin
  SetLength(tmpField,High(EnemyManager.enemys[FPlayerLevel])-1);
  for k := 0 to High(EnemyManager.enemys[FPlayerLevel]) do
  begin
    fieldX := (EnemyManager.enemys[FPlayerLevel][k].Pixels.X ) div 32;
    fieldY := (EnemyManager.enemys[FPlayerLevel][k].Pixels.Y ) div 32;
    tmpField[k] := map.Playground[fieldX][fieldY].nextField;
  end;

  for j := 0 to 31 do
  begin
    for i := 0 to High(EnemyManager.enemys[FPlayerLevel]) do
    begin
      if EnemyManager.enemys[FPlayerLevel][i].isRunning then
      begin
        case tmpField[i] of
          nfDown: EnemyManager.moveEnemy(EnemyManager.enemys[FPlayerLevel][i],nfDown);
          nfRight: EnemyManager.moveEnemy(EnemyManager.enemys[FPlayerLevel][i],nfRight);
          nfLeft: EnemyManager.moveEnemy(EnemyManager.enemys[FPlayerLevel][i],nfLeft);
          nfUp:   EnemyManager.moveEnemy(EnemyManager.enemys[FPlayerLevel][i],nfUp);
          nfStay:
          begin
            EnemyManager.enemys[FPlayerLevel][i].isRunning := false;
            Dec(FPlayerLives);
            initLabels;
            if FPlayerLives = 0 then
            begin
              SetGameStatus(gsGAMEOVER);
              exit;
            end;
          end;
        end;
      end;
    end;
    Draw;
  end;
end;
Delphi-Quellcode:
procedure TEnemyManager.moveEnemy(enemy: TEnemy; next: TNextField);
var Pos: TPoint;
begin
  case next of
    nfDown:
    begin
      Pos.Y := enemy.Pixels.Y+1;
      Pos.X := enemy.Pixels.X;
    end;
    nfRight:
    begin
      Pos.X := enemy.Pixels.X+1;
      Pos.Y := enemy.Pixels.Y;
    end;
    nfUp:
    begin
      Pos.Y := enemy.Pixels.Y-1;
      Pos.X := enemy.Pixels.X;
    end;
    nfLeft:
    begin
      Pos.X := enemy.Pixels.X-1;
      Pos.Y := enemy.Pixels.Y;
    end;
  end;
  if next <> nfStay then
  begin
    enemy.Pixels := Pos;
    Inc(enemy.movedPixel);
  end;
end;

xZise 13. Okt 2010 09:41

AW: Gegner auf Spielfeld richtig positionieren
 
Also ich kann nichts erkennen, du zeichnest 32x das Spielfeld und vorher positionierst du einmal alle Gegner neu.

MfG
Fabian

PS: Und natürlich man sollte lieber die Pixelposition definieren ;)

pustekuchen 13. Okt 2010 10:20

AW: Gegner auf Spielfeld richtig positionieren
 
Jap, läuft jetzt auch ;)

Danke an alle die geholfen haben :)

Jetzt läuft es zwar flüssig, aber wenn man das fenster bewegt springt es. Naja kann auch am schwachen Pc liegen ;)

xZise 14. Okt 2010 19:06

AW: Gegner auf Spielfeld richtig positionieren
 
Nein: Solange das Fenster bewegt wird, zeichnet es sich nicht neu ;)

MfG
Fabian

pustekuchen 15. Okt 2010 07:02

AW: Gegner auf Spielfeld richtig positionieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Das ist es ja, ich kann das Fenster nicht vernünftig bewegen,da es springt. Erst zeichnet sozusagen fertig und falls das Fenster bewegt wurde, springt er dort hin.

Am besten schaut man sich das selbst an ^^ Hab mal die aktuellen Datein als Anhang beigefügt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:22 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz