![]() |
abs funktioniert nicht
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen,
habe ein Programm geschrieben, in dem Kugeln Raumschiffe treffen sollen. Das habe ich dann mit abs(... - ... < 1) gelöst, doch das Programm stürzt sofort ab. Danke schonmal für die Mithilfe. :) Grüße Timo ;)
Delphi-Quellcode:
procedure TForm1.TiRaumschiffTimer(Sender: TObject);
begin FOR r:=1 TO number DO begin IF Raumschiff[r] <> nil THEN begin Raumschiff[r].GoRight; ShRaumschiff[r].Left := Raumschiff[r].xCoord; IF Raumschiff[r].xCoord > 700 THEN begin Raumschiff[r].xCoord := -50; ShRaumschiff[r].Left := Raumschiff[r].xCoord; end; If (abs(Raumschiff[r].xCoord-Kugel[i].xCoord)<1) and (abs(Raumschiff[r].yCoord-Kugel[i].yCoord)<1) then begin Raumschiff[r].Destroy; Abgeschossen := Abgeschossen+1; end; end; end; LaRaumschiffe.caption := inttostr(Abgeschossen); end; |
Re: abs funktioniert nicht
- Debuggen? -> Welche Zeile?
- Mit Destroy gibt man keine Objekte frei. |
Re: abs funktioniert nicht
Wie in der OH steht, ruft man Destroy nicht direkt auf, :warn:
sondern nutzt Free. Wobei, da du auf NIL prüfst, solltest du ![]() |
Re: abs funktioniert nicht
Ich verstehe leider kein Wort :(
Was muss ich jetzt machen, damit es funktioniert ? :) Grüße Timo |
Re: abs funktioniert nicht
Delphi-Quellcode:
:
If (abs(Raumschiff[r].xCoord-Kugel[i].xCoord)<1) and (abs(Raumschiff[r].yCoord-Kugel[i].yCoord)<1) then begin Raumschiff[r].Free; Raumschiff[r]:=nil; Abgeschossen := Abgeschossen+1; end; : |
Re: abs funktioniert nicht
Verstehe deinen Ansatz, aber es geht immer noch nicht.
Habe mein Programm auch online gestellt, falls du es dir im Ganzen angucken möchtest. Grüße |
Re: abs funktioniert nicht
Schau dir einfach mal die Warnungen an, die dein Compiler dir ausspuckt und beheben diese. Dann läuft dein Programm einwandfrei.
Edit: Globale Variablen sind böse und so wenig wie nötig zu verwenden! |
Re: abs funktioniert nicht
Aber wenn ich i global mache, so wird sie bei abs(....[i]) wohl nicht erkannt, oder ?
Grüße :) |
Re: abs funktioniert nicht
Ich verstehe deine Probleme nicht.
Der Compiler sagt, dass die Laufvariable einer FOR-Schleife immer lokal deklariert sein muss. Also deklariere dein i und r lokal, dort wo deine Schleifen sind und fertig. Mach es doch nicht kompilzierter als es ist. |
Re: abs funktioniert nicht
Ja, das habe ich doch gemacht, aber nun verschwinden die Raumschiffe
bei Berührung mit der Kugel nicht und 'Abgeschossen' geht auch nicht hoch. :( |
Re: abs funktioniert nicht
Ok, jetzt sehe ich was du meinst.
So geht das aber nicht! Dann musst du dein Konzept umstellen. Du kannst nicht in einer Routine eine Schleife haben und in einer anderen auf deren Zählwert zugreifen. So kann man nicht programmieren. |
Re: abs funktioniert nicht
Das ist klar.
Aber wie löse ich das bzw. wo mache ich die ABS-Abfrage rein, sodass alles geht ? :) |
Re: abs funktioniert nicht
Dafür muss man erstmal verstehen, was du überhaupt machen willst und das muss ganz anders aufgebaut werden.
Der erste Ansatz wäre erstmal nur einen einzigen Timer für alles zubenutzen. Dann musst du eben jeweils für jedes Objekt nachschauen, ob es mit einem anderen kollidiert. |
Re: abs funktioniert nicht
Delphi-Quellcode:
[Warnung] Unit1.pas(153): FOR-Schleifenvariable 'r' kann nach Durchlauf undefiniert sein
procedure TForm1.TiRaumschiffTimer(Sender: TObject);
var r,i: integer; begin FOR r:=1 TO number DO begin IF Raumschiff[r] <> nil THEN begin Raumschiff[r].GoRight; ShRaumschiff[r].Left := Raumschiff[r].xCoord; IF Raumschiff[r].xCoord > 700 THEN begin Raumschiff[r].xCoord := -50; ShRaumschiff[r].Left := Raumschiff[r].xCoord; end; end; end; FOR i:=1 TO nummer DO begin IF Kugel[i] <> nil THEN begin Kugel[i].GoUp; ShKugel[i].Top := Kugel[i].yCoord; end; end; If (abs(Raumschiff[r].xCoord-Kugel[i].xCoord)<1) and (abs(Raumschiff[r].yCoord-Kugel[i].yCoord)<1) then begin Raumschiff[r].Destroy; Abgeschossen := Abgeschossen+1; end; LaRaumschiffe.caption := inttostr(Abgeschossen); end; [Warnung] Unit1.pas(153): FOR-Schleifenvariable 'i' kann nach Durchlauf undefiniert sein Funktioniert leider nicht. :( Oder was ist mein Fehler ? |
Re: abs funktioniert nicht
Die Meldung ist doch eindeutig. Du kannst nicht auf eine Laufvariable einer FOR-Schleife außerhalb der Schleife zugreifen.
Also entweder den Wert in einer anderen Variablen abspeichern oder die zweite Schleife innerhalb der ersten notieren? Das kommt darauf an, was man machen will. |
Re: abs funktioniert nicht
Guten Abend,
du nutzt die Schleifenvariablen r und i nach der Schleife. Da können sie einen undefinierten Wert haben. In Deinem Fall hat r den Wert number und i den Wert nummer. Wenn in der Schleife ein Überprüfungskriterium zutrifft solltest Du den Wert von r bzw. i in einer separaten Variable speichern. Grüße Klaus |
Re: abs funktioniert nicht
Es wird nie mehr was glaube ich :D
Delphi-Quellcode:
Stürzt wieder sofort ab. Habe jetzt alles so geändert, wie vorgeschlagen.
procedure TForm1.TiRaumschiffTimer(Sender: TObject);
var r,i: integer; begin FOR i:=1 TO nummer DO begin FOR r:=1 TO number DO begin IF Raumschiff[r] <> nil THEN begin Raumschiff[r].GoRight; ShRaumschiff[r].Left := Raumschiff[r].xCoord; IF Raumschiff[r].xCoord > 700 THEN begin Raumschiff[r].xCoord := -50; ShRaumschiff[r].Left := Raumschiff[r].xCoord; end; If (abs(Raumschiff[r].yCoord-Kugel[i].yCoord)<1) and (abs(Raumschiff[r].xCoord-Kugel[i].xCoord)<1) then begin Raumschiff[r].Free; Raumschiff[r] := nil; Abgeschossen := Abgeschossen+1; end; end; end; IF Kugel[i] <> nil THEN begin Kugel[i].GoUp; ShKugel[i].Top := Kugel[i].yCoord; end; end; LaRaumschiffe.caption := inttostr(Abgeschossen); |
Re: abs funktioniert nicht
Du prüfst ja auch nicht (überall) ob du überhaupt auf die Kugel zugreifen darfst.
Setzt einen Breakpoint, schau dir an, wo das was du dir überlegt hast nicht mehr mit dem übereinstimmt, was passiert und ändere das, was falsch läuft ab. So programmiert man. |
Re: abs funktioniert nicht
Delphi-Quellcode:
[edit] das ist natürlich Mumpitz, denn Du prüfst ja auf <> nil im SchleifenbeginFOR i:=1 TO nummer DO begin FOR r:=1 TO number DO begin IF Raumschiff[r] <> nil THEN begin Raumschiff[r].GoRight; ShRaumschiff[r].Left := Raumschiff[r].xCoord; IF Raumschiff[r].xCoord > 700 THEN begin Raumschiff[r].xCoord := -50; ShRaumschiff[r].Left := Raumschiff[r].xCoord; end; If (abs(Raumschiff[r].yCoord-Kugel[i].yCoord)<1) and (abs(Raumschiff[r].xCoord-Kugel[i].xCoord)<1) then begin Raumschiff[r].Free; // Raumschiff r wird freigegeben und beim nächsten Durchlauf i+1 kracht es Raumschiff[r] := nil; Abgeschossen := Abgeschossen+1; end; end; end; Grüße Klaus |
Re: abs funktioniert nicht
Zitat:
|
Re: abs funktioniert nicht
Ja also jetzt geht nichts mehr.
Gibt es vielleicht eine andere Lösung für abs ? Grüße |
Re: abs funktioniert nicht
@omata
mit Mumpitz meinte ich das, was ich geschrieben hatte. Grüße Klaus |
Re: abs funktioniert nicht
habe es jetzt hinbekommen beide sachen in einen timer zu packen, in dem auch bei jeder abfrage jede variable deklariert ist..
mein letztes problem ist somit die kollisionsabfrage: ich habe es, wie in den vorherigen posts sichtbar, mit abs probiert, allerdings geht das nicht. es passiert einfach nichts.. gibts eine alternativbefehl für eine kollisionsabfrage?
Delphi-Quellcode:
FOR i:= 1 TO nummer DO
begin FOR u:= 1 TO n DO begin IF Raumschiff[u] <> nil THEN begin Raumschiff[u].GoRight; ShRaumschiff[u].Left := Raumschiff[u].xCoord; IF Raumschiff[u].xCoord > 700 THEN begin Raumschiff[u].xCoord := -50; ShRaumschiff[u].Left := Raumschiff[u].xCoord; end; end; IF Kugel[i] <> nil THEN begin Kugel[i].GoUp; ShKugel[i].Top := Kugel[i].yCoord; end; IF (Raumschiff[u] <> nil) AND (Kugel[i] <> nil) THEN begin // kollisionsabfrage end; end; end; |
Re: abs funktioniert nicht
Baue deine Kollisionsabfrage doch wieder ein.
Das abs entfernt das Vorzeichen, sodass das Ergebnis deiner Subtraktion niemals negativ sein kann. |
Re: abs funktioniert nicht
welches vorzeichen vor abs??
habe doch geschrieben das diese nicht funktioniert. gibt es jetzt eine alternative zu abs? gibts da nicht irgendwie was mit toleranz oder so? auf wunsch lade ich auch gerne das aktuelle programm hoch... vielen dank für jegliche hilfe! //EDIT: aaah ich korregiere mich, es klappt doch, entschuldigung :/ der toleranzbereich 1 war einfach zu klein.. |
Re: abs funktioniert nicht
Nun ein letztes Problem :/
Die Raumschiffe werden immer schneller. Ich habe keine Ahnung woran das liegt. Grüße |
Re: abs funktioniert nicht
Mh, nur so am Rande: Ich glaube du hast eine falsche Vorstellung von dem, was abs() macht. Es steht nicht für Abstand, und ist gewiss keine Funktion speziell für Kollisionsabfragen.
|
Re: abs funktioniert nicht
Hi!
Mach bitte für dein neues Problem auch einen neuen Thread auf - sonst geht es hier drunter und drüber ;) Grüße, Frederic |
Re: abs funktioniert nicht
Ja, das hängt doch aber mit dem einem Timer zusammen.
Also wäre es echt nett, wenn mir das einer hier schnell beantworten könnte. Grüße |
Re: abs funktioniert nicht
Threadtitel: "abs funktioniert nicht"
Hat nix mit Timern und schnellen Raumschiffen zu tun. |
Re: abs funktioniert nicht
Hi!
Soweit ich das hier erkennen kann, geht es hier um Kollisionserkennung und nicht um irgendetwas mit Timern. Insofern schneidest du jetzt ein ganz neues Thema an - und das führt zu Verwirrung. Daher: Mach dafür bitte ein neues Thema auf! Grüße, Frederic |
Re: abs funktioniert nicht
Zitat:
|
Re: abs funktioniert nicht
Manche schaffen echt die unmöglichsten Dinge =)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:01 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