Probleme beim Laden von Types/Meshes
Übersicht

NerleBetreff: Probleme beim Laden von Types/Meshes |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Und wieder eine Frage/ein Problemchen ![]() 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? ![]() |
||
- Zuletzt bearbeitet von Nerle am Mo, Aug 27, 2007 8:37, insgesamt 3-mal bearbeitet
![]() |
Eingeproggt |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() |
||
![]() |
Eingeproggt |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() |
||
![]() |
Eingeproggt |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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...) ![]() Seltsam. |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich meine in BB sind die Listen Global
also das TLevelObject da sind vieleicht alle Objekte drin , aber nicht alle willst du speichern . |
||
Nerle |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() ![]() Zum Beispiel: Zitat: Blubb\modelnumber: 1020054733
Wie kommen solche Sprünge nur zustande?? ![]() Korrekt wäre eine 1... |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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... |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group