Einzelnen Beitrag anzeigen

Benutzerbild von pustekuchen
pustekuchen

Registriert seit: 27. Aug 2010
265 Beiträge
 
Delphi 11 Alexandria
 
#12

AW: Gegner auf Spielfeld richtig positionieren

  Alt 13. Okt 2010, 08:31
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;

Geändert von pustekuchen (13. Okt 2010 um 10:18 Uhr)
  Mit Zitat antworten Zitat