J'ai bien pris le temps de faire le tour des possibilité de pure, c'est bien pour la 2d, bien pour les application, mais pas pour la 3d.
Les meshs ne peuvent contenir de sous-objets, et n'ont pas de collision, ceux animés plantent, les lumières sont invisible, les move entity sont relative a l'orientation de l'entity, et le comble du tout est qu'on ne peut même pas mesurer son orientation. Le skydome ne peut pas etre immobile, et j'en passe...
comment programmer un jeu dans ces condition?
Voici le source de la lib inachevé, que j'allais baptiser "Game 3D Lib" mais comme je n'ai fait que les rotations qu'ils ne marchent pas, je l'appelle "Trigonométryzpa Lib"
si rotateentity ne marche pas, ma lib ne marche pas...
Il vous suffit juste de compiler le code ci dessous avec Tailbite
Qui sait ca servira peut etre le jour ou les rotateentity marcheront...
Les commandes
GL_InitRotationSys(NbrEntity,NbrCamera)
Initialise le systeme, doit etre appellé pour utiliser les autres commandes.
Tout les angles de toutes les entitées (de 0 à NbrEntity) sont mise a 0
GL_RotateEntityX(Entity,Angle)
GL_RotateEntityY(Entity,Angle)
GL_RotateEntityZ(Entity,Angle)
Remplace la commande RotateEntity()
(et met a jour les angles)
résultat.w = GL_EntityAngleX(Entity)
résultat.w = GL_EntityAngleY(Entity)
résultat.w = GL_EntityAngleZ(Entity)
Renvoie l'angle de l'entitée spécifiée
GL_AbsoluteRotateX(Entity,Angle,Sens,vitesse)
GL_AbsoluteRotateY(Entity,Angle,Sens,vitesse)
GL_AbsoluteRotateZ(Entity,Angle,Sens,vitesse)
Oriente l'entitée vers l'angle spécifié, dans la vitesse et le sens spécifié
"sens" doit etre un nombre entier entre 0 et 3
0 = sens le plus rapide
1 = sens trigonométrique
2 = sens des auguilles d'une montre
3= le plus long
Je me suis arreté a ModifyRotationCenter(Entity,x,y,z), que je commencais tout juste en fait...
Code : Tout sélectionner
; Game Library _ Rotations _
; Par Pacificator
;ANGLES INIT SESSION
Declare EngineProcess()
ProcedureDLL GL_InitRotationSys(NbrEntity,NbrCamera)
Global NbrEntity.w
Structure Angles
AngleXZ.w
AngleXY.w
AngleYZ.w
EndStructure
Structure Rotation
AngleXPas.w
AngleYPas.w
AngleZPas.w
AngleXMod.w
AngleYMod.w
AngleZMod.w
AngleXVit.w
AngleYVit.w
AngleZVit.w
RotationpointX.w
RotationpointY.w
RotationpointZ.w
EndStructure
Dim EntityAngle.w(Entity)
Dim Rotationlist.w(Entity)
Dim CameraAngle.w(Camera)
Processus = CreateThread(@EngineProcess(), Valeur)
EndProcedure
;ANGLES CONVERTIONS
ProcedureDLL.f AngleRadiant(Angle)
Result.f = 3.1415* angle/ 180
ProcedureReturn Result
EndProcedure
ProcedureDLL.f AngleDegree(Angle)
Result.f = 180 * angle / 3.1415
ProcedureReturn Result
EndProcedure
;ROTATIONCENTER
ProcedureDLL ModifyRotationCenter(Entity,x,y,z)
*Rotation.Rotation=@rotationlist
*Rotation+Entity
*rotation\RotationpointX= x
*rotation\RotationpointY= y
*rotation\RotationpointZ= z
EndProcedure
;ANGLES RELATIVE SESSION
ProcedureDLL GL_RotateEntityY(Entity,Angle)
*CameraAngle.Angles = @CameraAngle()
*EntityAngle.Angles = @EntityAngle()
*EntityAngle + Entity
*EntityAngle\AngleXZ + Angle
If *EntityAngle\AngleXZ < 0
*EntityAngle\AngleXZ+360
ElseIf *EntityAngle\AngleXZ >= 360
*EntityAngle\AngleXZ-360
EndIf
RotateEntity(entity,angle,0,0)
EndProcedure
ProcedureDLL GL_RotateEntityX(Entity,Angle)
*CameraAngle.Angles = @CameraAngle()
*EntityAngle.Angles = @EntityAngle()
*EntityAngle+Entity
*EntityAngle\AngleYZ + Angle
If *EntityAngle\AngleYZ < 0
*EntityAngle\AngleYZ+360
ElseIf *EntityAngle\AngleYZ >= 360
*EntityAngle\AngleYZ-360
EndIf
RotateEntity(entity,0,angle,0)
EndProcedure
ProcedureDLL GL_RotateEntityZ(Entity,Angle)
*CameraAngle.Angles = @CameraAngle()
*EntityAngle.Angles = @EntityAngle()
*EntityAngle+Entity
*EntityAngle\AngleXY+ Angle
If *EntityAngle\AngleXY < 0
*EntityAngle\AngleXY+360
ElseIf *EntityAngle\AngleXY >= 360
*EntityAngle\AngleXY-360
EndIf
RotateEntity(entity,0,0,angle)
EndProcedure
;ANGLES DISPLAY SESSION
ProcedureDLL.f GL_EntityAngleX(Entity)
*CameraAngle.Angles = @CameraAngle()
*EntityAngle.Angles = @EntityAngle()
*EntityAngle+Entity
AngleX.w = *EntityAngle\AngleYZ
ProcedureReturn AngleX.w
EndProcedure
ProcedureDLL.f GL_EntityAngleY(Entity)
*CameraAngle.Angles = @CameraAngle()
*EntityAngle.Angles = @EntityAngle()
*EntityAngle+Entity
AngleY.w = *EntityAngle\AngleXZ
ProcedureReturn AngleY.w
EndProcedure
ProcedureDLL.f GL_EntityAngleZ(Entity)
*CameraAngle.Angles = @CameraAngle()
*EntityAngle.Angles = @EntityAngle()
*EntityAngle+Entity
AngleZ.w = *EntityAngle\AngleXY
ProcedureReturn AngleZ.w
EndProcedure
;ANGLES ABSOLUTE SESSION
ProcedureDLL GL_AbsoluteRotateZ(Entity,Angle,Sens,vitesse)
*CameraAngle.Angles = @CameraAngle()
Rotation.w=0
If angle<> GL_EntityAngleZ(entity)
If angle > GL_EntityAngleZ(entity)
DistanceTrigo= angle - GL_EntityAngleZ(entity)
ElseIf angle < GL_EntityAngleZ(entity)
DistanceTrigo= 360 - GL_EntityAngleZ(entity) + angle
EndIf
DistanceATrigo= (360 - DistanceTrigo)
Select sens
Case 0
If DistanceTrigo < DistanceAtrigo
rotation = DistanceTrigo
If vitesse > rotation : vitesse = rotation : EndIf
Pas.w = rotation/vitesse
Pas= Round(pas,1)
vit = vitesse
Mod.w = rotation % vitesse
mod = mod
Else
rotation = DistanceATrigo
If vitesse > rotation : vitesse = rotation : EndIf
Pas.w = rotation/vitesse
Pas= Round(pas,1)
vit = -vitesse
Mod.w = rotation % vitesse
mod = -mod
EndIf
Case 1
rotation = DistanceTrigo
If vitesse > rotation : vitesse = rotation : EndIf
Pas.w = rotation/vitesse
Pas= Round(pas,1)
vit = vitesse
Mod.w = rotation % vitesse
Case 2
rotation = DistanceATrigo
If vitesse > rotation : vitesse = rotation : EndIf
Pas.w = rotation/vitesse
Pas= Round(pas,1)
vit = -vitesse
Mod.w = rotation % vitesse
mod = -mod
Case 3
If DistanceTrigo > DistanceAtrigo
rotation = DistanceTrigo
If vitesse > rotation : vitesse = rotation : EndIf
Pas.w = rotation/vitesse
Pas= Round(pas,1)
vit = vitesse
Mod.w = rotation % vitesse
Else
rotation = DistanceATrigo
If vitesse > rotation : vitesse = rotation : EndIf
Pas.w = rotation/vitesse
Pas= Round(pas,1)
vit = -vitesse
Mod.w = rotation % vitesse
mod = -mod
EndIf
EndSelect
*Rotation.Rotation=@Rotationlist()
*rotation+entity
*Rotation\AngleZPas = Pas
*Rotation\AngleZMod = Mod
*Rotation\AngleZVit = vit
EndIf
EndProcedure
ProcedureDLL GL_AbsoluteRotateX(Entity,Angle,Sens,vitesse)
*CameraAngle.Angles = @CameraAngle()
Rotation.w=0
If angle<> GL_EntityAngleX(entity)
If angle > GL_EntityAngleX(entity)
DistanceTrigo= angle - GL_EntityAngleX(entity)
ElseIf angle < GL_EntityAngleX(entity)
DistanceTrigo= 360 - GL_EntityAngleX(entity) + angle
EndIf
DistanceATrigo= (360 - DistanceTrigo)
Select sens
Case 0
If DistanceTrigo < DistanceAtrigo
rotation = DistanceTrigo
If vitesse > rotation : vitesse = rotation : EndIf
Pas.w = rotation/vitesse
Pas= Round(pas,1)
vit = vitesse
Mod.w = rotation % vitesse
mod = mod
Else
rotation = DistanceATrigo
If vitesse > rotation : vitesse = rotation : EndIf
Pas.w = rotation/vitesse
Pas= Round(pas,1)
vit = -vitesse
Mod.w = rotation % vitesse
mod = -mod
EndIf
Case 1
rotation = DistanceTrigo
If vitesse > rotation : vitesse = rotation : EndIf
Pas.w = rotation/vitesse
Pas= Round(pas,1)
vit = vitesse
Mod.w = rotation % vitesse
Case 2
rotation = DistanceATrigo
If vitesse > rotation : vitesse = rotation : EndIf
Pas.w = rotation/vitesse
Pas= Round(pas,1)
vit = -vitesse
Mod.w = rotation % vitesse
mod = -mod
Case 3
If DistanceTrigo > DistanceAtrigo
rotation = DistanceTrigo
If vitesse > rotation : vitesse = rotation : EndIf
Pas.w = rotation/vitesse
Pas= Round(pas,1)
vit = vitesse
Mod.w = rotation % vitesse
Else
rotation = DistanceATrigo
If vitesse > rotation : vitesse = rotation : EndIf
Pas.w = rotation/vitesse
Pas= Round(pas,1)
vit = -vitesse
Mod.w = rotation % vitesse
mod = -mod
EndIf
EndSelect
*Rotation.Rotation=@Rotationlist()
*rotation+entity
*Rotation\AngleXPas = Pas
*Rotation\AngleXMod = Mod
*Rotation\AngleXVit = vit
EndIf
EndProcedure
ProcedureDLL GL_AbsoluteRotateY(Entity,Angle,Sens,vitesse)
*CameraAngle.Angles = @CameraAngle()
Rotation.w=0
If angle<> GL_EntityAngleY(entity)
If angle > GL_EntityAngleY(entity)
DistanceTrigo= angle - GL_EntityAngleY(entity)
ElseIf angle < GL_EntityAngleY(entity)
DistanceTrigo= 360 - GL_EntityAngleY(entity) + angle
EndIf
DistanceATrigo= (360 - DistanceTrigo)
Select sens
Case 0
If DistanceTrigo < DistanceAtrigo
rotation = DistanceTrigo
If vitesse > rotation : vitesse = rotation : EndIf
Pas.w = rotation/vitesse
Pas= Round(pas,1)
vit = vitesse
Mod.w = rotation % vitesse
mod = mod
Else
rotation = DistanceATrigo
If vitesse > rotation : vitesse = rotation : EndIf
Pas.w = rotation/vitesse
Pas= Round(pas,1)
vit = -vitesse
Mod.w = rotation % vitesse
mod = -mod
EndIf
Case 1
rotation = DistanceTrigo
If vitesse > rotation : vitesse = rotation : EndIf
Pas.w = rotation/vitesse
Pas= Round(pas,1)
vit = vitesse
Mod.w = rotation % vitesse
Case 2
rotation = DistanceATrigo
If vitesse > rotation : vitesse = rotation : EndIf
Pas.w = rotation/vitesse
Pas= Round(pas,1)
vit = -vitesse
Mod.w = rotation % vitesse
mod = -mod
Case 3
If DistanceTrigo > DistanceAtrigo
rotation = DistanceTrigo
If vitesse > rotation : vitesse = rotation : EndIf
Pas.w = rotation/vitesse
Pas= Round(pas,1)
vit = vitesse
Mod.w = rotation % vitesse
Else
rotation = DistanceATrigo
If vitesse > rotation : vitesse = rotation : EndIf
Pas.w = rotation/vitesse
Pas= Round(pas,1)
vit = -vitesse
Mod.w = rotation % vitesse
mod = -mod
EndIf
EndSelect
*Rotation.Rotation=@Rotationlist()
*rotation+entity
*Rotation\AngleYPas = Pas
*Rotation\AngleYMod = Mod
*Rotation\AngleYVit = vit
EndIf
EndProcedure
;PROCESS
Procedure EngineProcess()
Repeat
For k= 0 To NbrEntity
*Rotation.Rotation=@Rotationlist()
*Rotation + k
If *Rotation\AngleZPas > 1
GL_RotateEntityZ(k,*Rotation\AngleZVit)
*Rotation\AngleZPas - 1
EndIf
If *Rotation\AngleZPas = 1
GL_RotateEntityZ(k,*Rotation\AngleZmod+*Rotation\AngleZVit)
*Rotation\AngleZPas - 1
EndIf
If *Rotation\AngleXPas > 1
GL_RotateEntityX(k,*Rotation\AngleXVit)
*Rotation\AngleXPas - 1
EndIf
If *Rotation\AngleXPas = 1
GL_RotateEntityX(k,*Rotation\AngleXmod + *Rotation\AngleXvit)
*Rotation\AngleXPas - 1
EndIf
If *Rotation\AngleYPas > 1
GL_RotateEntityY(k,*Rotation\AngleYVit)
*Rotation\AngleYPas - 1
EndIf
If *Rotation\AngleYPas = 1
GL_RotateEntityY(k,*Rotation\AngleYmod + *Rotation\AngleYVit)
*Rotation\AngleYPas - 1
EndIf
Next k
Delay(10)
ForEver
EndProcedure