Verzweiflung Pur, FreeEntity(block\handle)...Bitte helfen
Übersicht

tmode00Betreff: Verzweiflung Pur, FreeEntity(block\handle)...Bitte helfen |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hi,
Wir sind gerade bei der Entwicklung eines Space-Games, Kosmo3d Gennant. Es soll ein SkyRoads (Dos-Game) remake werden. Ich bin schon seid ca. 1,5 Jahren am proggen, Freunde von mir kümmern sich um die Grafik, Modelle, Musik..... ---> YouTube Video <--- ![]() Unsere Homepage: ------------------------ http://ttlabs.tt.funpic.de ....Soweit die Vorstellung ![]() leider habe ich ein Problem. Ich habe einen Typ in Verwendung, welcher 3d-Mesh Daten speichert: stark vereinfacht: Code: [AUSKLAPPEN] type Tk3dobjekt
Field file_handle;Speichert die 3d-Mesh Daten end type ...Nun habe ich eine einfache ,,Block-löschen" routine geschrieben: Aufbau: -K3dObjekt suchen (each...) und zurückgeben (function search.Tk3dobjekt) -nachdem zurückgegeben das Feld file_handle ansprechen -die darin enthaltenen Meshdaten mit FreeEntity(k3dobj\file_handle) freigeben -Sound blubb (objekt lösch Sound) abspielen Code: [AUSKLAPPEN] ;Ein Objekt löschen If (KeyDown(211)) Then K3dObj=search_k3dobj(X,Y,Z If Handle(K3dObj) Then K3d_lfdid=K3d_lfdid-1 If (K3dObj\file_handle) Then FreeEntity(K3dObj\file_handle) PlaySound(delete_snd) Delete K3dObj EndIf EndIf Leider leider ist die Entity nach wie vor sichtbar und wird nicht gelöscht obwohl es keine AccessViolation gibt und obwohl ich alles genau im Debugger Überprüft habe (per Type + ...variablen angeschaut). auch die suche des objektes mit rückgabe erfolgt mit 100% sicherheit , da ich mit Handle die Existens des Objekt prüfe und mir bereits meine Objekt-Idendifikation so habe Testhalber anzeigen lassen. Alles sollte also richtig sein, trotzdem bleit der Block und wird nicht freigegeben (FreeEntity) Anhang: ich habe diesen text sehr schnell geschrieben und versucht mein Problem so direkt wie möglich zu schildern, desshalb die etwas verkorksten Sätze+Rechtschreibung. sicherlich wird es auch etwas seltsam klingen eine solche Frage nach so langer Zeit zu stellen, das Problem tritt aber erst jetzt auf, da ich das ganze Spiel versuche so stark wie möglich von globals und arrays zu befreien (Überarbeitung). Mit der alten Technik (Dim....) war das alles einfacher aber extrem Speicherfressend. bitte um Verständniss.... Danke im Voraus...... |
||
![]() |
The_Nici |
![]() Antworten mit Zitat ![]() |
---|---|---|
Na wenn du den type löschst interessiert das das Entity n'Feuchten. FreeEntity![]() PS: Ich glaube ich hab das Original schonmal gespielt, da war ich glaub 4 oder 5. EDIT: Hoppala sry |
||
- Zuletzt bearbeitet von The_Nici am Mo, Mai 12, 2008 20:47, insgesamt einmal bearbeitet
tmode00Betreff: ....hab ich gemacht |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Danke für die schnelle Hilfe.
Ich habe selbstverständlich FreeEntity, - wie bereits im Titel des Threads zu sehen ist - verwendet: nachdem das richtige Objekt gefunden: ---> Code: [AUSKLAPPEN] FreeTexture(K3dObj\texture_handle)
FreeEntity(K3dObj\file_handle) PlaySound(delete_snd) Delete K3dObj ..an was könnte es noch liegen ![]() |
||
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
So auf die schnelle fällt mir da nun nichts auf.
Könnte es sein, dass du dem File_Handle gar keinen Wert zuteilst? Dann würde es natürlich durch deine Schutzüberprüfung durchfallen und nicht gelöscht werden. |
||
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun |
![]() |
Silver_Knee |
![]() Antworten mit Zitat ![]() |
---|---|---|
Deine tabulatoren sind falsch ![]() Code: [AUSKLAPPEN] If Handle(K3dObj) Then
K3d_lfdid=K3d_lfdid-1 If (K3dObj\file_handle) Then FreeEntity(K3dObj\file_handle) PlaySound(delete_snd) Delete K3dObj EndIf Das If Handle()... häte kein endif Code: [AUSKLAPPEN] If Handle(K3dObj) Then
K3d_lfdid=K3d_lfdid-1 If (K3dObj\file_handle) Then FreeEntity(K3dObj\file_handle) PlaySound(delete_snd) Delete K3dObj EndIf naja der Fehler wäre damit nicht ganz erklärt aber vllt hilfts EDIT kombiniert mit Noobodys idee würde das helfen |
||
tmode00Betreff: FileHandle ist Vorhanden... |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
....nochmals Danke!!!
Nobody: Zitat: Könnte es sein, dass du dem File_Handle gar keinen Wert zuteilst?
...leider habe ich auch das schon probiert:
Dann würde es natürlich durch deine Schutzüberprüfung durchfallen und nicht gelöscht werden. file_handle ist verfügbar und wird auch angezeigt und vorallem von der searchfunktion die per... for k3dobj.Tk3dobject = each Tk3dobject ...sucht werden alle felder zurückgegeben und sind verfügbar. Zitat: Das If Handle()... häte kein endif
ich habe nur das endif nicht mitkopiert. Ohne EndIf würde es eine Violation geben Weitere Ideen ![]() |
||
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
Jetzt gehen mir die Ideen aus ![]() Was du noch tun kannst, ist, ein Stop in den Block von FreeEntity zu setzen, um zu schauen, ob es auch wirklich aufgerufen wird. Wenn das Objekt vorher nicht in irgendeiner Weise dupliziert wurde, kann es gar nicht mehr in der Landschaft stehen. Eventuell hast du aus Versehen das Objekt mitsamt dem Typeeintrag doppelt erstellt, oder du hast gar nicht den richtigen Eintrag erwischt (schliesslich können an einer Position auch mehrere Objekte stehen). Ansonsten müsste es eigentlich mit deinem gepasteten Code funktionieren. |
||
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun |
tmode00Betreff: ....pending |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Vielen Dank,
ich werde das alles prüfen und morgen über [eventuellen] erfolg berichten. Das mit dem Stop ist ne Gute Idee. Kurze Frage noch: Kannst du mit sicherheit sagen, das man in einem Type Field eine Variable vom typ BB Mesh laden kann und per FreeEntit(typenname\feld) das wieder freigeben kann? |
||
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
Selbstverständlich kann man das.
Ladebefehle liefern nur Werte zurück, wo im Arbeitsspeicher sich die relevanten Daten befinden - es ist völlig egal, wo du nun diesen Wert speicherst. Genauso erwartet FreeEntity() auch nur einen Wert, den interessiert es nicht, worin er gespeichert wurde. |
||
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Und was meint der code hier?
Code: [AUSKLAPPEN] If K3dObj <> null Then K3d_lfdid=K3d_lfdid-1 If K3dObj\file_handle <> 0 FreeEntity(K3dObj\file_handle) K3dObj\file_handle = 0 ; nur nötig wenn du im debugger ne änderung sehen willst. FreeEntity ändert am wert nicht den du in variablen speicherst endif PlaySound(delete_snd) Delete K3dObj endif handle zu nutzt ist prinzipiell net soo die dolle idee für ein simples checken ![]() einfach weils mehr zeit kostet als rasch zu gucken. Wenn das objekt noch angezeigt wird trotz dem oben ist es vermutlich nicht dieses objekt sondern ein anderes das du erzeugt hast, denn FreeEntity versagt net. Verwendest du evtl copyentity oder so? |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
tmode00Betreff: Problem gelöst.... |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich habe das Problem gefunden. Beim drücken der Leertaste (Keydown) wird eine Funktion vom typ TK3dObjekt aufgerufen die per übergabe der momentanen Rasterposition prüft ob sich an der gewählten Stelle bereits ein Objekt befindet. Leider habe ich lediglich die ,,neues Objekt bilden" Stelle geprüft, so wird immer ein neues file_handle einem bereits existierenden Objekt gegeben, da ich die Funktion vergaß mit Return vorzeitig zu beenden. Ein kleines Debugpanel (gelber Text ![]() Es lag somit lediglich am doppelten zuweisen von Mesh-Daten, was ein Freeentity unmöglich macht da auf dem Heap viele Variablen mit Mesh-Daten lagen. ![]() ![]() |
||
- Zuletzt bearbeitet von tmode00 am Mi, Mai 14, 2008 16:32, insgesamt 2-mal bearbeitet
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ich nehm an wenn du etwas neues zuweist hebst du das alte mit freeentity auf oder? weil sonst wirds für immer da bleiben. | ||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
tmode00Betreff: ? |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Zitat: ich nehm an wenn du etwas neues zuweist hebst du das alte mit freeentity auf oder? weil sonst wirds für immer da bleiben.
Ja, genau. So mache ich das. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group