Einzelnen Beitrag anzeigen

Benutzerbild von pustekuchen
pustekuchen

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

Gegner auf Spielfeld richtig positionieren

  Alt 12. Okt 2010, 10:23
Delphi-Version: 2010
Guten Tag,

Ich bräuchte mal eure Hilfe, ich weiß grade nicht wie ich mein Problem genau realisieren soll.

Erstmal zum Programm:

Ich bin dabei eine Tower Defense zu programmieren. Bauen von Türmen, Erstellen von Karten, sowie das "Spawnen" von Gegner und das durchlaufen durch die Karte klappen.
Doch leider sind die Gegner nicht wirklich gut Positioniert, wenn sie über das Spielfeld laufen.

Hier mal ein Screenshot zur Verbildlichung

Klick Mich
Und mich

Und hier die Prozedure mit der ich die Gegner zeichne.

Zur Info: Jedes Feld ist 32x32 px groß. Und eine Karte hat 16*16 Felder.

Code:
procedure TEnemyManager.drawEnemys(level: Integer);
var i: integer;
begin
  bmEnemys.Canvas.Brush.Color := clFuchsia;
  bmEnemys.Canvas.Rectangle(-1,-1,513,513);
  bmEnemys.Canvas.Brush.Color := clBlue;
  for i := 0 to High(enemys[level]) do
  begin
    if enemys[level][i].isRunning then
    begin
      bmEnemys.Canvas.Rectangle(
        enemys[level][i].PosX+10,      //ANHANG 1!
        enemys[level][i].PosY+10,      // Hier läufts flüssig, aber 'schief' :/
        enemys[level][i].PosX+15,
        enemys[level][i].PosY+15);
//      bmEnemys.Canvas.Rectangle(         // ANHANG 2!Zeichnet die Gegner
//        enemys[level][i].FeldX*32,      // Oben links in die ecken der Felder
//        enemys[level][i].FeldY*32,      // Kein flüssiger spielverlauf,
//        enemys[level][i].FeldX*32+10,   // da Gegner NUR in die mitte
//        enemys[level][i].FeldY*32+10);  // des Feldes gezeichnet werden
    end;
  end;
  uFormMain.FormMain.pb.Canvas.Draw(0,0,bmEnemys);
end;
Code:

procedure TEnemyManager.moveEnemy(enemy: TEnemy; next: TNextField);
begin
  case next of
    nfDown: enemy.PosY := enemy.PosY+1;
    nfRight: enemy.PosX := enemy.PosX+1;
    nfUp:   enemy.PosY := enemy.PosY-1;
    nfLeft: enemy.PosX := enemy.PosX-1;
  end;
  if next <> nfStay then
    Inc(enemy.movedPixel);

  enemy.FeldX := enemy.PosX div 32;
  enemy.FeldY := enemy.PosY div 32;
end;

Dieser Teil hat sich erledigt:
Zitat:
(Anhang 1)Wie man auf den Screenshots sieht sind die Gegner nicht mittig auf den Feldern.
(Anhang 2)Beim auskommentiertem zeichnen, sind sie zwar mittig auf den Feldern, aber wirklich NUR mittig.
Und ecken überspingen sie.

Nun ist die frage wie ich einen flüssigen Spielablauf hinbekomme und die gegner mittig auf den Feldern laufen.

EDIT: Habe noch ein zweites Problem. Die Gegner "flackern". Das liegt wahrscheinlich an der draw methode. Doch Bitblt kann ich leider nicht benutzten, da diese keine transparenz unterstützt. Gibt es noch etwas anderes?


Habs mitlerweile hinbekommen, das es nach RECHTS und nach UNTEN so klappt wie es soll.

Aber wenns nach LINKS oder nach OBEN gehen soll macht es Probleme...

Ich danke schonmal für jede Antwort

Crosspost im Delphi-Forum

mfg pustekuchen
Miniaturansicht angehängter Grafiken
td.jpg   td2.jpg  
Angehängte Dateien
Dateityp: rar TD.rar (418,0 KB, 2x aufgerufen)

Geändert von pustekuchen (12. Okt 2010 um 14:23 Uhr)
  Mit Zitat antworten Zitat