Avant les modules on pouvait créer des fichiers 'pbi' qui contenaient des fonctions réutilisables pour différents codes. L'inconvénient avec ces fichiers c'est que les variables, les procédures, etc ne sont pas protégées, il peut y avoir des conflits de nom de variables ou procédures ou constantes entre les différents fichiers.
Comme dit ce matin dans un autre post, je vois les modules comme un moyen de créer des bibliothèques facilement réutilisables.
C'est aussi un moyen de travailler à plusieurs sur un projet en le découpant en modules. Chacun peut coder son module sans avoir à se soucier des noms de procédure et variables que les autres utiliseront.
J'ai commencé ce module
vector3.pbi
Code : Tout sélectionner
DeclareModule Vector3
Structure Vector3
x.f
y.f
z.f
EndStructure
Declare Add(*R.Vector3, *V1.Vector3, *V2.Vector3)
Declare Sub(*R.Vector3, *V1.Vector3, *V2.Vector3)
Declare Mul(*R.Vector3, *V1.Vector3, *V2.Vector3)
Declare Div(*R.Vector3, *V1.Vector3, *V2.Vector3)
Declare Normalize(*V.Vector3)
Declare.f DotProduct(*V1.Vector3, *V2.Vector3)
Declare directionEquals(*V1.Vector3, *rhs.Vector3, tolerance.f)
EndDeclareModule
Module Vector3
Procedure Add(*R.Vector3, *V1.Vector3, *V2.Vector3)
*R\x = *V1\x + *V2\x
*R\y = *V1\y + *V2\y
*R\z = *V1\z + *V2\z
EndProcedure
Procedure Sub(*R.Vector3, *V1.Vector3, *V2.Vector3)
*R\x = *V1\x - *V2\x
*R\y = *V1\y - *V2\y
*R\z = *V1\z - *V2\z
EndProcedure
Procedure Mul(*R.Vector3, *V1.Vector3, *V2.Vector3)
*R\x = *V1\x * *V2\x
*R\y = *V1\y * *V2\y
*R\z = *V1\z * *V2\z
EndProcedure
Procedure Div(*R.Vector3, *V1.Vector3, *V2.Vector3)
*R\x = *V1\x / *V2\x
*R\y = *V1\y / *V2\y
*R\z = *V1\z / *V2\z
EndProcedure
Procedure.f DotProduct(*V1.Vector3, *V2.Vector3)
ProcedureReturn *V1\x * *V2\x + *V1\y * *V2\y + *V1\z * *V2\z
EndProcedure
Procedure Normalize(*V.Vector3)
Protected.f magSq, oneOverMag
magSq = *V\x * *V\x + *V\y * *V\y + *V\z * *V\z
If magsq > 0
oneOverMag = 1.0 / Sqr(magSq)
*V\x * oneOverMag
*V\y * oneOverMag
*V\z * oneOverMag
EndIf
EndProcedure
Procedure Length(*V.Vector3)
ProcedureReturn Sqr(*V\x * *V\x + *V\y * *V\y + *V\z * *V\z)
EndProcedure
; Returns whether this vector is within a directional tolerance of another vector.
; @param rhs The vector To compare With
; @param tolerance The maximum angle by which the vectors may vary And still be considered equal
; @note Both vectors should be normalised.
Procedure directionEquals(*V1.Vector3, *rhs.Vector3, tolerance.f)
Protected.f dot, angle
dot = Vector3::DotProduct(*V1, *rhs)
angle = Degree(ACos(dot))
ProcedureReturn Bool(Abs(angle) <= tolerance)
EndProcedure
EndModule
pour l'utiliser
Code : Tout sélectionner
XIncludeFile 'vector3.pbi"
Define.Vector3::Vector3 R, V1, V2
V1\x = 0
V1\y = 1
V1\z = 0
V2\x = 0.01
V2\y = 0.99
V2\z = 0
Vector3::Normalize(@V2)
Vector3::Add(@R, @V1, @V2)
Debug R\x