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

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

tmode00

Betreff: Verzweiflung Pur, FreeEntity(block\handle)...Bitte helfen

BeitragMo, Mai 12, 2008 20:20
Antworten mit Zitat
Benutzer-Profile anzeigen
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 <---

user posted image


Unsere Homepage:
------------------------
http://ttlabs.tt.funpic.de

....Soweit die Vorstellung Smile

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

BeitragMo, Mai 12, 2008 20:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Na wenn du den type löschst interessiert das das Entity n'Feuchten. FreeEntity benutzen, vor dem Delete.

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
 

tmode00

Betreff: ....hab ich gemacht

BeitragMo, Mai 12, 2008 20:35
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Question ?

Noobody

BeitragMo, Mai 12, 2008 20:43
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Mai 12, 2008 20:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Deine tabulatoren sind falsch Wink
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
 

tmode00

Betreff: FileHandle ist Vorhanden...

BeitragMo, Mai 12, 2008 20:50
Antworten mit Zitat
Benutzer-Profile anzeigen
....nochmals Danke!!!

Nobody:
Zitat:
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.
...leider habe ich auch das schon probiert:

user posted image

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 Question

Noobody

BeitragMo, Mai 12, 2008 21:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Jetzt gehen mir die Ideen aus Razz

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
 

tmode00

Betreff: ....pending

BeitragMo, Mai 12, 2008 21:08
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Mai 12, 2008 21:13
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Mai 12, 2008 21:32
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Smile
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.
 

tmode00

Betreff: Problem gelöst....

BeitragMi, Mai 14, 2008 16:22
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Smile) schaffte abhilfe. Wenn man 5 sekunden Space drückt wird zwar nur ein Objekt erstellt aber 100erte Filehandles zugewiesen da die Funktion wieder und wieder aufgrufen wird, das ,,ist besetzt" sich aber nur auf ,,neues objekt erstellen und erstellsound abspiellen" und nicht auf ,,dem erstellten objekt eigenschaften geben" bezieht. Ein kleines Return und alles läuft glatt....
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.

Smile Vielen Dank für die anstösse, die mir letztlich auf die Sprünge hielfen!


user posted image
  • Zuletzt bearbeitet von tmode00 am Mi, Mai 14, 2008 16:32, insgesamt 2-mal bearbeitet
 

Dreamora

BeitragMi, Mai 14, 2008 16:26
Antworten mit Zitat
Benutzer-Profile anzeigen
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.
 

tmode00

Betreff: ?

BeitragMi, Mai 14, 2008 16:30
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group