ich programmiere gerade an einem Brakeball Clone ... Spielprinzip sollte klar sein(denke ich )
mein Problem ist das es vorkommt, dass bei der Kollision des Balls mit einem Block der Block verschwindet(was auch gewollt ist) aber dann noch ein zweiter verschwindet der mit der Kollision nichts zu tun hat.
Meine Blöcke sind objecte ... alle Blöcke eines levels sind in einem array(blocklist) gespeichert ... wenn der Ball sich bewegt wird die Kollisionabfrage für die Blöcke gestartet. Wird ein Block getroffen, dann wird eine blockrebound aufgerufen, bei der abgefragt wird wieviele hits der Block hat und der Ball abprallt. Sollte hits = 1 sein, dann wird der Block über die delete procedure aus dem array entfernt
Code:
procedure DeleteBlock(const X: integer); procedure Switch(var a, b: TBlock); var c: TBlock; begin c:= a; a:= b; b:= c; end; var i: integer; begin if BlockList[X].Portal then // auf manchen blöcken sind portale die ebenfals entfernt werden wenn der block zerstört wird begin i:= GetPortal(BlockList[X].BlockID); // deshalb wird erst überprüft ob ein portal vorhanden ist, wenn ja wird es aus dem portalarray entfern bevor DeletePortal(i); // der eigentliche block entfernt wird end; for i:= X to High(BlockList)-1 do Switch(BlockList[i], BlockList[i+1]); // hier wird der block der verschwinden soll ans ende des arrays gesetzt SetLength(BlockList, High(BlockList)); // hier wird er dann entfernt dec(DesBlo); // desBlo ist ein integer wert der die anzahl an zerstörbaren blocks speichert if DesBlo = 0 then begin if not AutoPlayer then InitNextLevel else begin NextLev:= true; InitNextAuPlLevel; end; end; end;
könnte es damit zu tun haben, das meine Blöcke Objecte und keine Klassen sind und ich sie somit nicht frei geben ...
Registriert: Do Jul 23, 2009 04:33 Beiträge: 157
Programmiersprache: Turbo Delphi Pro
Ist BlockList ein array? Wenn du stattdessen TList nimmst, kannst du einfach mit TList.delete das Element rauslöschen, auf nil setzen und mit TList.pack wird die Liste wieder in Ordnung gebracht (du brauchst das Element also nicht ans Ende zu schieben). Ausserdem hast du bei Listen befehle wie TList.add und TList.insert um neue Element an beliebigen Stellen einzufügen.
Was meinst du damit, dein tBLock sei keine Klasse sondern ein Object - alles was von TObject abgeleitet ist, ist eine Klasse. Oder meinst du das Schlüsselwort "object", so hießen Klassen früher in Turbo Pascal - das ist aber antiquirt und sollte nicht mehr verwendet werden (und muss ausserdem mit Dispose oder so freigegeben werden!). Oder ist dein tBlock ein Record? Zeig mal die Definition des Typs her
_________________ Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen. (Koreanisches Sprichwort)
Ich habe als C++ Mensch leider zu wenig Ahnung von Delphi um dir zu sagen wann du free auf rufen musst und wann nicht. Jedenfalls ist der "Unterschied" zwischen einer Klasse und einem Objekt der das Objekte die Instanzen einer Klasse sind. Um einen Autovergleich zu bringen: Die Klasse ist z.B. "Mercedes A-Klasse" und die Autos die du dann auf der Straße herum fahren siehst sind dann die Objekte.
Ich vermute das eigentliche Problem liegt darin das du mit Array-Indices (z.B. deleteBlock bekommt ein Integer "X") arbeitest, dann aber Objekte aus der Mitte des Arrays löscht. D.h. es könnte sein das du irgendwo vergisst einen gespeicherten Array-Index zu aktualisieren der durch diese Operation ungültig wurde.
Registriert: Do Jul 23, 2009 04:33 Beiträge: 157
Programmiersprache: Turbo Delphi Pro
Wie gesagt, freigeben musst du den Speicherplatz dann aber trotzdem, die Delphi-Hilfe weiß darüber mehr. Aber du solltest besser class benutzen und ganz korrekt den Destructor "Destroy" überschreiben und dann .Free benutzen.
_________________ Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen. (Koreanisches Sprichwort)
Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.