![]() |
Collisionsabfrage
So Gegner habe ich auch schon - zu mindest einen :mrgreen:.
Zum Schiessen verwende ich jbg's Code und um zu prüfen, ob ich ihn getroffen habe, verwende ich folgenden Code in einem Timer:
Code:
In einem anderen Timer wird bHit geprüft und wenn das TRUE ist der Gegner wieder neu positioniert und der Collisions-Timer neu gestartet und alles geht von vorne los.
[b]procedure[/b] TForm1.tmrDefenderHittingTimer(Sender: TObject);
[b]var[/b] ii: DWORD; p: PPoint; [b]begin[/b] [b]for[/b] ii := 0 [b]to[/b] AllShoots.Count -1 [b]do[/b] [b]begin[/b] p := PPoint(AllShoots.Items[ii]); [b]if[/b] (p^.x > Image2.Left) [b]and[/b] (p^.x < Image2.Left + Image2.Width) [b]and[/b] (p^.y < Image2.Top) [b]then[/b] [b]begin[/b] Image2.Picture.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'expl1.bmp'); bHit := TRUE; tmrDefenderHitting.Enabled := FALSE; [b]end[/b]; [b]end[/b]; [b]end[/b]; Nun mein Problem: Wenn ich den Gegner einmal getroffen habe und schon mehr mals geschossen habe, explodiert er von alleine mehr mals. Ich habe so das dumpfe Gefühl, dass nach dem der Gegner neu gestartet wurde, noch Schüsse in der Liste sind, die dann auch noch die Bedingung erfüllen. Löschen der Liste:
Code:
Rufe ich das aber nach einem Treffer auf, bekomme ich eine Zugriffsverletzung.
[b]procedure[/b] TForm1.DeleteDeadShoots(DeleteAll: Boolean);
[b]var[/b] p, penemy: PPoint; ii: Integer; [b]begin[/b] [b]for[/b] ii := AllShoots.Count - 1 [b]downto[/b] 0 [b]do[/b] [b]begin[/b] p := PPoint(AllShoots.Items[ii]); [b]if[/b] (p^.y < 0) [b]or[/b] (DeleteAll) [b]then[/b] [b]begin[/b] Fire; [color=#000080][i]// deswegen die Schleife rückwärts durchlaufen[/i][/color] Dispose(p); [b]end[/b]; [b]end[/b]; [b]for[/b] ii := AllShootsEnemy.Count - 1 [b]downto[/b] 0 [b]do[/b] [b]begin[/b] penemy := PPoint(AllShootsEnemy.Items[ii]); [b]if[/b] (penemy^.y > Width) [b]or[/b] (DeleteAll) [b]then[/b] [b]begin[/b] FireEnemy; [color=#000080][i]// deswegen die Schleife rückwärts durchlaufen[/i][/color] Dispose(penemy); [b]end[/b]; [b]end[/b]; [b]end[/b]; by Daniel B; ich habe mir erlaubt aus den Variablen i ein ii zu machen, da sonst die Formatierung nicht funktioniert hätte. |
Dein Code:
Code:
Das ist wohl die eigentliche Kollisionsabfrage. Nun, wenn du abfragst, ob x zwischen Left und Left + Width liegt, musst du auch abfragen, ob y zwischen Top und Top + Height liegt. Weil so wird auch ein Schuss ein Treffer sein, der unterhalb des Zielobjekts liegt.
[b]if[/b] (p^.x > Image2.Left)
[b]and[/b] (p^.x < Image2.Left + Image2.Width) [b]and[/b] (p^.y < Image2.Top) Setzt du bHit nach der Abfrage auch wieder auf false? Und musst du beim Löschen der Schüsse nicht zum einen den Schuss selbst löschen (machst du ja mit Dispose()), als auch den Eintrag in der TList (TList.Delete())? Steht auch in dem anderen Thread drin, aber im hier geposteten Code nicht... Mir ist außerdem folgende Zeile unklar:
Code:
Warum soll y größer als Width sein?
[b]if[/b] (penemy^.y > Width) [b]or[/b] (DeleteAll) [b]then[/b]
|
Danke werde ich mir mal ankucken.
bHit setze ich wieder uaf TRUE und zur Information, falls es wichtig ist: Der Schuß von mir geht von unten nach oben und der des Gegner von oben nach unten, deswegen muß er gelöscht werden, wenn er größer der Höhe des Formulars wird. |
Re: Collisionsabfrage
Zitat:
|
Sah das echt anders aus? Ehrlich gesagt habe ich mich die ganze Zeit gewundert warum da Fire steht :mrgreen:.
|
Wenn du y mit der Breite vergleichst, wird er aber nicht gelöscht, wenn y größer als die Höhe des Formulars ist, sondern erst, wenn es größer als die Breite ist ;c)
|
Zitat:
schreiben. Diese Vorgehensweise ist um einiges schneller, da das Bild nicht jedesmal von der im Verhältinis zum Arbeitsspeicher langsamen Festplatte geladen werden muss. |
Danke Jungs so klatt es.
@jbg: Kommt noch alles. Die Bitmaps und das ganze Zeugs wird in die Ressource gepackt nur so lnage ich noch am basteln bin ist es so etwas einfacher. Die Grafiken sind bis her noch nicht so toll. Ich werde mal sehen ob ich für die Spezial Effekts George Lucas gewinnen kann :wink: . Von der Optimierung habe ich schon geträumt und von Collosionsabfragen, Schleifen, Feuern, explodierenden Raumschiffen usw. :mrgreen:. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz