Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Jul 03, 2025 22:29

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: zu viele objekte verschwinden
BeitragVerfasst: Mi Sep 22, 2010 01:17 
Offline
DGL Member

Registriert: Do Jul 15, 2010 13:28
Beiträge: 4
Hallo,

ich programmiere gerade an einem Brakeball Clone ... Spielprinzip sollte klar sein(denke ich :D)

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 ...

also
Code:
BlockList[i].free


kann bevor ich sie entferne??


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: zu viele objekte verschwinden
BeitragVerfasst: Mi Sep 22, 2010 13:05 
Offline
DGL Member
Benutzeravatar

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)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: zu viele objekte verschwinden
BeitragVerfasst: Mi Sep 22, 2010 14:11 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
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.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: zu viele objekte verschwinden
BeitragVerfasst: Mi Sep 22, 2010 22:32 
Offline
DGL Member

Registriert: Do Jul 15, 2010 13:28
Beiträge: 4
bei mir ist TBlock = object ... wusste nicht das man das so nicht mehr nutzt

aber ich glaub ich hab den Fehler gefunden ... ich musste noch eine Zusatzbedingung in der Kollisionsabfrage einbringen

aus irgendeinem Grund hat das Programm eine Kollision erkannt wo keine war ... das konnte ich durch den Zusatz beheben :D

trotzdem vielen Dank für eure Hilfe


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: zu viele objekte verschwinden
BeitragVerfasst: Mi Sep 22, 2010 22:52 
Offline
DGL Member
Benutzeravatar

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)


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.007s | 14 Queries | GZIP : On ]