J'ai essayé de créer une dll pour permettre de sauvegarder des données (positions, et autres) des "objets" de mes éditeurs (2d et 3D).
Mais je n'arrive pas à sauvegarder la liste (list()) de ces objets via cette dll.
Savez-vous comment on fait ça avec une liste en globale si possible (ou un pointeur, si on est obligé ^^) ?
le code de la dll :
Code : Tout sélectionner
#savefile = 0
;{ structure
Structure vector3
x.w : y.w : z.w
EndStructure
Structure StObject3D
size.w
pos.vector3 : rot.vector3
type.a ; le type d'objet : 0 = object3D, 1 = light, 2 = water (createwaterr(), 4=createterrain, etc...
name$ : meshname$ : materialname$
entityId.w
EndStructure
Global NewList object.StObject3D()
;}
ProcedureDLL SaveScene3D()
file$=SaveFileRequester("Save","","*.ark",0)
MessageRequester("",Str(ListSize(object())))
If file$ <>""
If OpenFile(#savefile,RemoveString(file$,".ark")+".ark")
WriteStringN(#savefile,"Scene 3D créée avec l'éditeur Arkeos Scene Editor 3D (Ase3D) - 2012")
ForEach object()
With object()
Select \type
Case 0 ; objet 3D
param$ = "{Obj}"+Str(\entityId)+"/"+Str(\pos\x)+"/"+Str(\pos\y)+"/"+Str(\pos\z)+"/"
WriteStringN(#savefile,param$)
Case 1 ; light
param$ = "{Light}"+Str(\entityId)+"/"+Str(\pos\x)+"/"+Str(\pos\y)+"/"+Str(\pos\z)+"/"
WriteStringN(#savefile,param$)
EndSelect
EndWith
Next
CloseFile(#savefile)
EndIf
EndIf
EndProcedure
ProcedureDLL OpenScene3D()
EndProcedure
L'idée c'est de sauvegarder les 11 objets, mais ça n'enregistre que la première ligne.
Code : Tout sélectionner
;{ Infos
; sauvegarder avec un fichier dll pour l'import/export (format)
; save witht a dll for import/export format
; date : 29 april 2012
; author : blendman
; pb : 4.61b2 win xp x32
;}
;{ Structure
Structure vector3
x.w : y.w : z.w
EndStructure
Structure StObject3D
size.w
pos.vector3 : rot.vector3
type.a ; le type d'objet : 0 = object3D, 1 = light, 2 = water (createwaterr(), 4=createterrain, etc...
name$ : meshname$ : materialname$
entityId.w
EndStructure
Global NewList object.StObject3D()
For i = 0 To 10
AddElement(object())
With object()
\entityId = i
\pos\x = Random(500)
\pos\y = Random(500)
\pos\z = Random(200)
EndWith
Next i
;}
;{ enum, constante
#savefile =0
Enumeration
#Win_0
EndEnumeration
;}
;{ declare
Declare SaveAsDll() : Declare OpenAsDll()
;}
;{ window
flag = #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered
If OpenWindow(#Win_0, 0,0,800, 600, "Dll import/export", flag)
EndIf
SetWindowColor(#win_0,RGB(120,120,120))
;{ menu
CreateMenu(0,WindowID(#win_0))
MenuTitle("Fichier")
MenuItem(0,"Ouvrir")
MenuItem(1,"Enregistrer")
;}
;}
;{ loop
Repeat
Event =WaitWindowEvent()
Select Event
Case #PB_Event_CloseWindow
quit=1
Case #PB_Event_Menu
Select EventMenu()
Case 0; ouvrir fichier
OpenAsDll()
Case 1 ; enregistrer fichier
SaveAsDll()
EndSelect
EndSelect
Until quit
;}
;{ procedures
Procedure SaveAsDll()
If OpenLibrary(0, "export.dll")
CallFunction(0, "SaveScene3D")
CloseLibrary(0)
EndIf
EndProcedure
Procedure OpenAsDll()
If OpenLibrary(0, "export.dll")
CallFunction(0, "OpenScene3D")
CloseLibrary(0)
EndIf
EndProcedure
;}