C'est définitif, j'adore PureBasic ! (en ce moment je tâte le C, alors ça souligne les bons points de PB, mais ça fait aussi ressortir des manques à combler --> templates, pointeurs sur tableaux etc...)
Dans le 1er post, une mise à jour qui améliore l'interface, la stabilité, et ajoute la possibilité de changer de condition limite : soit une boite fermée, soit un espace libre.
Si quelqu'un veut tester d'autres conditions limites, il suffit de modifier FS_SetBoundaryCondition_Libre()
Je ne suis pas sur que ma modif pour l'espace libre fonctionne vraiment comme il faut...
Quelques sélections pratiques du nouveau code :
Stabilisateur de FPS :
Code : Tout sélectionner
Tps_Loop_mini.d = 0.040 ; secondes
Define dt.d
OpenWindow(0, 0, 0, 600, 400, "", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)
CanvasGadget(0, 0, 0, WindowWidth(0), WindowHeight(0), #PB_Canvas_Keyboard)
Repeat
Repeat
event = WindowEvent()
;{ Gestion event
;}
Until event = 0 Or event = #PB_Event_CloseWindow
;{ mise à jour du delta de temps et stabilisation des FPS
dt = (ElapsedMilliseconds() - time) / 1000
If dt < Tps_Loop_mini
Delay(1000 * (Tps_Loop_mini - dt)) ; on sauve du Processeur
EndIf
dt = (ElapsedMilliseconds() - time) / 1000 ; on reprend le temps total de la boucle, delay compris
time = ElapsedMilliseconds()
;}
;{ Affichage
If StartDrawing(CanvasOutput(0))
Box(0, 0, OutputWidth(), OutputHeight(), 0)
If dt
DrawText(10, 10, "FPS = " + StrD(1/dt, 1), $FFFFFF, 0)
EndIf
StopDrawing()
EndIf
;}
Until event = #PB_Event_CloseWindow
Il a également stabilisé le FPS à la variable 1/Tps_Loop_mini (ici = 25 FPS)
Et cela rend la simulation plus stable (puisque le dT réel est utilisé pour l'alimenter).
Procédure interchangeable :
Code : Tout sélectionner
Procedure FS_SetBoundaryCondition_Boite(*obj.SIM_FL, MODE.l, Array x.d(2))
; un 1er code
EndProcedure
Procedure FS_SetBoundaryCondition_Libre(*obj.SIM_FL, MODE.l, Array x.d(2))
; un autre code
EndProcedure
Procedure FS_SetBoundaryCondition_Autre(*obj.SIM_FL, MODE.l, Array x.d(2))
; un autre code
EndProcedure
Prototype FS_SetBoundaryCondition(*obj.SIM_FL, MODE.l, Array x.d(2))
Global FS_SetBoundaryCondition.FS_SetBoundaryCondition = @FS_SetBoundaryCondition_Boite()
; utilisation dans le code :
; BLABLABLA
FS_SetBoundaryCondition(mon_obj, 1, t())
; BLABLABLA
; On change les procedures comme ça :
If FS_SetBoundaryCondition = @FS_SetBoundaryCondition_Boite()
FS_SetBoundaryCondition = @FS_SetBoundaryCondition_Libre()
ElseIf FS_SetBoundaryCondition = @FS_SetBoundaryCondition_Libre()
FS_SetBoundaryCondition = @FS_SetBoundaryCondition_Autre()
ElseIf FS_SetBoundaryCondition = @FS_SetBoundaryCondition_Autre()
FS_SetBoundaryCondition = @FS_SetBoundaryCondition_Boite()
EndIf
Pointeurs vers tableaux, et Swap
Code : Tout sélectionner
Structure tableau
Array tab.d(0, 0)
EndStructure
Macro Tableau_init(_adr_, _struct_)
_adr_ = AllocateMemory(SizeOf(_struct_))
InitializeStructure(_adr_, _struct_)
EndMacro
Macro Tableau_Free(_adr_, _struct_)
ClearStructure(_adr_, _struct_)
FreeMemory(_adr_)
EndMacro
Structure Fluide
; Tableaux des vitesses du fluide
*u.tableau
*v.tableau
EndStructure
Define Mon_Fluide.Fluide
Tableau_init(Mon_Fluide\u, tableau)
Tableau_init(Mon_Fluide\v, tableau)
Dim Mon_Fluide\u\tab(20, 10)
Dim Mon_Fluide\v\tab(20, 10)
; On échange les tableaux avec un swap
Swap Mon_Fluide\u, Mon_Fluide\v
Tableau_Free(Mon_Fluide\u, tableau)
Tableau_Free(Mon_Fluide\v, tableau)
Mon alternative est quand même plus compliquée, mais une fois en place, ça fonctionne bien.