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