Probleme beim Laden von Types/Meshes

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Nerle

Betreff: Probleme beim Laden von Types/Meshes

BeitragMo, Aug 27, 2007 7:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Und wieder eine Frage/ein Problemchen Smile

Ich habe einen Editor erstellt, mittels dem ich 3D-Objekte positionieren, abspeichern und später wieder komplett reinladen kann (möchte).

Jedes positionierte 3D-Objekt und seine Werte wird als ein Type gespeichert. Funktioniert auch alles, nur bei der Lade-Funktion stoße ich auf ein Problem, denn hier wirft er mir dauernd ein "Entity does not Exist" bzw. "Memory Access Violation" (je nach Editor) entgegen, wenn es an den Befehl "PositionEntity" geht. Ich finde aber den genauen Fehler nicht.

Hier der Code:


Code: [AUSKLAPPEN]

Function LoadLevel()


LevelFile% = ReadFile("LevelsED\Level.dat")

While Not EOF(LevelFile)
   Blubb.TLevelObject = NEW TLevelObject
   
   

   Blubb\modelnumber%       = ReadInt   (LevelFile)
   Blubb\Mesh%               = LoadMesh("Meshes\mesh"+Blubb\modelnumber+".3ds")
   
   Blubb\texturenumber%       = ReadInt   (LevelFile)
   Blubb\Texture%               = LoadTexture("Textures\tex"+Blubb\modelnumber+".bmp")
      
   Blubb\objectType%      = ReadInt   (LevelFile)
   Blubb\posx#             = ReadFloat (LevelFile)
   Blubb\posy#             = ReadFloat (LevelFile)
   Blubb\posz#             = ReadFloat (LevelFile)
   Blubb\size#              = ReadFloat (LevelFile)
   Blubb\rotatex#           = ReadFloat (LevelFile)
   Blubb\rotatey#           = ReadFloat (LevelFile)
   Blubb\rotatez#           = ReadFloat (LevelFile)
   Blubb\livepoints%       = ReadInt   (LevelFile)
   Blubb\givedamage%        = ReadInt   (LevelFile)
   

   PositionEntity   Blubb\Mesh,CrosshairX,CrosshairY,CrosshairZ
   EntityTexture   Blubb\Mesh,Blubb\Texture
   RotateEntity   Blubb\Mesh,ObjectRotateX,ObjectRotateY,ObjectRotateZ
   ScaleEntity   Blubb\Mesh,ObjectSize,ObjectSize,ObjectSize
   
Wend
CloseFile LevelFile


End Function


Die Variable Blubb/ModelNumber enthält hier eine einfache Integerzahl (1-100), da die Modelle einfach als z.B. "mesh5.3ds" gepeichert sind.

Wo mag denn der Fehler liegen? Sad
  • Zuletzt bearbeitet von Nerle am Mo, Aug 27, 2007 8:37, insgesamt 3-mal bearbeitet

Eingeproggt

BeitragMo, Aug 27, 2007 7:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
Blubb\Mesh%          = LoadMesh("Meshes\mesh"+Container\modelnumber+".3ds")


Müsste man da nicht "Container" mit "Blubb" ersetzen? Du hast doh gesagt, dass die Nummer in blubb/ModelNumber gespeichert ist.
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9
 

Nerle

BeitragMo, Aug 27, 2007 8:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Hoppla, ja das ist klar (Ich habe den Code oben mal eben editiert). Daran lag es aber leider nicht, denn es funktioniert immer noch nicht, das Problem ist das gleiche Sad

Eingeproggt

BeitragMo, Aug 27, 2007 8:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich find jetzt auch keine weiteren Fehler. Kannst du uns mal den Speicher-Code geben? (Vlt hast ja einen falschen Variablentyp gespeichert, falsche Reihenfolge oder sonstwas)
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9
 

Nerle

BeitragMo, Aug 27, 2007 8:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Das hier ist der Speichercode (und dieser funktioniert auch, wie es scheint):

Code: [AUSKLAPPEN]

Function SaveLevel()


LevelFile% = WriteFile("LevelsED\Level.dat")

For Blubb.TLevelObject = EACH TLevelObject


   WriteInt   LevelFile,Blubb\modelnumber
   WriteInt   LevelFile,Blubb\mesh
   WriteInt   LevelFile,Blubb\texturenumber
   WriteInt   LevelFile,Blubb\texture
   
   WriteInt   LevelFile,Blubb\objectType
   WriteFloat   LevelFile,Blubb\posx
   WriteFloat   LevelFile,Blubb\posy
   WriteFloat   LevelFile,Blubb\posz
   WriteFloat   LevelFile,Blubb\size
   WriteFloat   LevelFile,Blubb\rotatex
   WriteFloat   LevelFile,Blubb\rotatey
   WriteFloat   LevelFile,Blubb\rotatez
   WriteInt    LevelFile,Blubb\livepoints
   WriteInt   LevelFile,Blubb\givedamage
Next
CloseFile LevelFile

End Function


Question

Eingeproggt

BeitragMo, Aug 27, 2007 8:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, den von mir vermuteten Fehler hast du nicht gemacht.

Jetzt musst du selbst überprüfen, welchen Wert "blubb\ModelNUmber" hat. Der Fehler liegt nämlich (so wie ich das sehe) darin, dass du zB mesh1 bis mesh5 hast und in der Variable ein Wert unter 1 oder über 5 gepeichert ist. In dem Zusammenhang: Hast du auch wirklich alles als 3ds gespeichert und enthält blubb\ModelNumber nicht vlt die Identität von LoadMesh? (blubb\Modelnumber=LoadMesh("Meshes\mesh4.3ds") wäre zB falsch!)
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9
 

Nerle

BeitragMo, Aug 27, 2007 9:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Hast du auch wirklich alles als 3ds gespeichert


Das auf jeden Fall. Ich gehe den gesamten Code mal eben nochmals durch... Wenn es wirklich nicht an den hier geposteten Zeilen liegt, ist das Problem ja immerhin auch schonmal "etwas" eingegrenzt...

Markus2

BeitragMo, Aug 27, 2007 12:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Du könntest eine identische Funk. für LoadMesh
machen die das gleiche tut und wenn das Mesh nicht geladen werden
kann (=0) erzeugste nen Cube oder macht da in der Funk. eine Meldung
mit DebugLog

function MyLoadMesh(Name$)
m=LoadMesh(Name$)
if m=0 then
m=CreateCube()
debuglog "MyLoadMesh !? "+Name$
endif
return m
end function
 

Dreamora

BeitragMo, Aug 27, 2007 16:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Geh in den DebugModus und step mal durch die Ladefunktion durch.

Und lass dir vor allem auch den pfad ausgeben an welchem das läuft.
Ich würd drauf tippen das die pfade nicht stimmen relativ zu den editoren.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

Nerle

BeitragMo, Aug 27, 2007 21:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Dreamora hat Folgendes geschrieben:
Geh in den DebugModus und step mal durch die Ladefunktion durch.

Und lass dir vor allem auch den pfad ausgeben an welchem das läuft.
Ich würd drauf tippen das die pfade nicht stimmen relativ zu den editoren.


Also, ich hab das jetzt mal gemacht, mit dem DebugLog.
Testweise habe ich 1 Objekt gesetzt, abgespeichert - und anschließend über den DebugLog überprüft, was er nach einem erneuten Laden des Objekts an gespeicherten Daten ausspuckt:

Code: [AUSKLAPPEN]

Blubb\modelnumber: 3
Blubb\Mesh: 23815616
Blubb\Texture: 23809152
Blubb\posx: 4.32781e-038
Blubb\posy: 4.32585e-038
Blubb\posz: 3.17776
Blubb\size: 3.0
Blubb\rotatex: 3.11696
Blubb\rotatey: 0.033
Blubb\rotatez: -3.0
 
 
Blubb\modelnumber: -1069547520
Blubb\Mesh: 0
Blubb\Texture: 0
Blubb\posx: -3.0
Blubb\posy: 0.0
Blubb\posz: 0.0
Blubb\size: 0.0
Blubb\rotatex: 0.0
Blubb\rotatey: 0.0
Blubb\rotatez: 0.0


Das seltsame ist - und ich vermute hier auch die Fehlerquelle -, dass ZWEI statt einem Objekt gespeichert werden wie es scheint. Alle Informationen des ersten Objekts scheinen vorhanden (ausser dass die Positions-Angaben etwas seltam scheinen!?, aber trotzdem könnte das Objekt immerhin geladen werden, oder?).

Und das geisterhafte zweite Objekt kann natürlich nicht geladen werden, da keine Informationen enthalten sind. Ich frage mich nur, wie dieses "doppelte Speichern" hier zustande kommt.

Hier nochmal die Save-Funktion:

Code: [AUSKLAPPEN]


   ; SAVE LEVEL
   If KeyHit(87)=1 Then SaveLevel


Function SaveLevel()


LevelFile% = WriteFile("LevelsED\Level.dat")

For Blubb.TLevelObject = EACH TLevelObject


   WriteInt   LevelFile,Blubb\modelnumber
   WriteInt   LevelFile,Blubb\mesh
   WriteInt   LevelFile,Blubb\texture
   
   WriteFloat   LevelFile,Blubb\posx
   WriteFloat   LevelFile,Blubb\posy
   WriteFloat   LevelFile,Blubb\posz
   WriteFloat   LevelFile,Blubb\size
   WriteFloat   LevelFile,Blubb\rotatex
   WriteFloat   LevelFile,Blubb\rotatey
   WriteFloat   LevelFile,Blubb\rotatez

Next
CloseFile LevelFile

End Function


Und hier nochmal die Lade-Funktion:

Code: [AUSKLAPPEN]

Function LoadLevel()

LevelFile% = ReadFile("LevelsED\Level.dat")

While Not EOF(LevelFile)
   Blubb.TLevelObject = NEW TLevelObject
   
   

   Blubb\modelnumber%    = ReadInt   (LevelFile)
   
   Blubb\Mesh%      = LoadMesh("Meshes\mesh"+Blubb\modelnumber+".3ds")
   Blubb\Texture%      = LoadTexture("Textures\tex"+Blubb\modelnumber+".bmp")
      
   Blubb\posx#      = ReadFloat (LevelFile)
   Blubb\posy#      = ReadFloat (LevelFile)
   Blubb\posz#      = ReadFloat (LevelFile)
   Blubb\size#       = ReadFloat (LevelFile)
   Blubb\rotatex#      = ReadFloat (LevelFile)
   Blubb\rotatey#      = ReadFloat (LevelFile)
   Blubb\rotatez#      = ReadFloat (LevelFile)
   

   DebugLog "Blubb\modelnumber: "   +Blubb\modelnumber
   DebugLog "Blubb\Mesh: "      +Blubb\Mesh
   DebugLog "Blubb\Texture: "   +Blubb\Texture
   DebugLog "Blubb\posx: "      +Blubb\posx
   DebugLog "Blubb\posy: "      +Blubb\posy
   DebugLog "Blubb\posz: "      +Blubb\posz         
   DebugLog "Blubb\size: "      +Blubb\size
   DebugLog "Blubb\rotatex: "   +Blubb\rotatex
   DebugLog "Blubb\rotatey: "   +Blubb\rotatey
   DebugLog "Blubb\rotatez: "   +Blubb\rotatez


Wend
CloseFile LevelFile


Ich kann hier nirgends einen Grund erkennen, warum jedesmal ein Objekt zuviel gespeichert, geladen oder erzeugt wird... (Wenn ich z.B. 3 Objekte speichere und hineinlade zeigt der DebugLog 4 Objekte an, und das letzte Objekt eben immer ohne Informationen...) Question
Seltsam.
 

Dreamora

BeitragMo, Aug 27, 2007 22:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Problem könnte sein dass EOF erst erreicht wird wenn du versuchst über die grenze der File zu laden.
Am einfachsten machst du es eh so, dass du an den Anfang der File als Int die Anzahl einträge speicherst
dann kannst du danach direkt soweit loopen und allfälliger garbage wird ignoriert.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Markus2

BeitragMo, Aug 27, 2007 22:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich meine in BB sind die Listen Global
also das TLevelObject
da sind vieleicht alle Objekte drin , aber nicht alle willst du speichern .
 

Nerle

BeitragDi, Aug 28, 2007 0:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Dreamora hat Folgendes geschrieben:
Am einfachsten machst du es eh so, dass du an den Anfang der File als Int die Anzahl einträge speicherst


Das hab ich mir auch schon überlegt.. Ich hab das jetzt mal so versucht.

Hier die neue Load-Funktion:

Code: [AUSKLAPPEN]

Function LoadLevel()

LevelFile% = ReadFile("LevelsED\Level.dat")

ObjectsSetted = ReadInt (LevelFile)

DebugLog "Objekte insgesamt: "+ObjectsSetted

For i = 1 To ObjectsSetted
   Blubb.TLevelObject = NEW TLevelObject
   
   Blubb\modelnumber%       = ReadInt   (LevelFile)
   
   Blubb\Mesh%         = LoadMesh("Meshes\mesh"+Blubb\modelnumber+".3ds")
   Blubb\Texture%      = LoadTexture("Textures\tex"+Blubb\modelnumber+".bmp")
      
   Blubb\posx#         = ReadFloat (LevelFile)
   Blubb\posy#         = ReadFloat (LevelFile)
   Blubb\posz#         = ReadFloat (LevelFile)
   Blubb\size#         = ReadFloat (LevelFile)
   Blubb\rotatex#      = ReadFloat (LevelFile)
   Blubb\rotatey#      = ReadFloat (LevelFile)
   Blubb\rotatez#      = ReadFloat (LevelFile)

   DebugLog "Objekt/Schleifendurchlauf: "   +i
   DebugLog "Blubb\modelnumber: "      +Blubb\modelnumber
   DebugLog "Blubb\Mesh: "         +Blubb\Mesh
   DebugLog "Blubb\Texture: "      +Blubb\Texture
   DebugLog "Blubb\posx: "         +Blubb\posx
   DebugLog "Blubb\posy: "         +Blubb\posy
   DebugLog "Blubb\posz: "         +Blubb\posz         
   DebugLog "Blubb\size: "         +Blubb\size
   DebugLog "Blubb\rotatex: "      +Blubb\rotatex
   DebugLog "Blubb\rotatey: "      +Blubb\rotatey
   DebugLog "Blubb\rotatez: "      +Blubb\rotatez
   DebugLog " "

Next

CloseFile LevelFile

End Function


Und hier das Ergebnis (ich habe 4 mal das Objekt-Nr."1" gesetzt) - zwar erscheint jetzt die korrekte Anzahl der tatsächlich gesetzten Objekte - aber nur das erste Objekt wird korrekt angezeigt, nur hier stimmen die Informationen:

Code: [AUSKLAPPEN]

Objekte insgesamt: 4

Objekt/Schleifendurchlauf: 1
Blubb\modelnumber: 1
Blubb\Mesh: 23846752
Blubb\Texture: 23809152
Blubb\posx: 4.33064e-038
Blubb\posy: 1.62031e-038
Blubb\posz: -7.63155
Blubb\size: 0.0
Blubb\rotatex: 8.28571
Blubb\rotatey: 0.025
Blubb\rotatez: 0.0
 
Objekt/Schleifendurchlauf: 2
Blubb\modelnumber: 0
Blubb\Mesh: 0
Blubb\Texture: 0
Blubb\posx: 0.0
Blubb\posy: 1.4013e-045
Blubb\posz: 4.3319e-038
Blubb\size: 4.33186e-038
Blubb\rotatex: 2.56436
Blubb\rotatey: 0.0
Blubb\rotatez: 7.75964
 
Objekt/Schleifendurchlauf: 3
Blubb\modelnumber: 1020054733
Blubb\Mesh: 0
Blubb\Texture: 0
Blubb\posx: 0.0
Blubb\posy: 0.0
Blubb\posz: 0.0
Blubb\size: 1.4013e-045
Blubb\rotatex: 4.32492e-038
Blubb\rotatey: 4.32165e-038
Blubb\rotatez: -6.58129
 
Objekt/Schleifendurchlauf: 4
Blubb\modelnumber: 0
Blubb\Mesh: 0
Blubb\Texture: 0
Blubb\posx: -1.74394
Blubb\posy: 0.025
Blubb\posz: 0.0
Blubb\size: 0.0
Blubb\rotatex: 0.0
Blubb\rotatey: 1.4013e-045
Blubb\rotatez: 9.55399e-038


Woran kann es denn liegen Question Question

Zum Beispiel:
Zitat:
Blubb\modelnumber: 1020054733

Wie kommen solche Sprünge nur zustande?? Shocked
Korrekt wäre eine 1...
 

Dreamora

BeitragDi, Aug 28, 2007 1:29
Antworten mit Zitat
Benutzer-Profile anzeigen
3 Dinge:

1. Heftig fragmentierte festplatte so dass sich byte fehler häufen
2. langsam dahinsterbende festplatte
2. Virus

Würde deswegen zu 2 Dingen raten:
1. Defragmentieren
2. Intensiv Scandisk (mit beiden flags aktiv, benötigt reboot da es nur in der bootphase geschehen kann)

und dann nochmal probieren ... denn ich frag mich schon die ganze zeit warum du durchgehen e-38 erhälst ... blitz ist noch nicht mal im ansatz im genauigkeitsbereich von float sondern rundet schon lange vorher ...
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

Nerle

BeitragDi, Aug 28, 2007 1:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Also: Ich habe jetzt jede einzelne Funktion noch einmal überprüft und mir die Werte ausgeben lassen: Objekte platzieren, Objekte speichern, Objekte laden. Die beiden ersten Funktionen arbeiten absolut korrekt. An ihnen liegt es definitiv nicht.

Der Fehler entsteht tatsächlich beim Laden der Daten.

Zitat:
3 Dinge:

1. Heftig fragmentierte festplatte so dass sich byte fehler häufen
2. langsam dahinsterbende festplatte
2. Virus


Das wäre schon krass. Aber wenn an dieser Load-Funktion, die ich hier als letztes postete nichts Falsches ist, dann kann ich mir auch nichts anderes mehr erklären - obwohl ich ansonsten keinerlei Probleme mit meiner Festplatte habe.

Zitat:
Würde deswegen zu 2 Dingen raten:
1. Defragmentieren
2. Intensiv Scandisk (mit beiden flags aktiv, benötigt reboot da es nur in der bootphase geschehen kann)


Mach ich. Und dann werde ich es heute auch mal an einem anderen PC probieren...

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group