Sokoban3D en commun

Généralités sur la programmation 3D
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Sokoban3D en commun

Message par comtois »

Comme je n'y touche plus depuis un moment , plutôt que de laisser dormir le code sur mon disque je me disais qu'il serait aussi bien ici .
Seulement , à force d'ajouter des trucs , c'est devenu un peu brouillon ,et depuis j'ai d'autres idées pour améliorer certains passages que j'ai fait à l'arrache en attendant mieux :)

Si ça intéresse du monde, ça pourrait être l'occasion de tout reprendre à zéro mais en commun .
Je mettrais les bases du code ( les meshs , quelques textures ), le minimum pour débuter , et ensuite chacun pourrait modifier , suggérer , adapter , proposer des trucs .

ça permettrait de faire un exemple 3D , de le voir évoluer selon les idées de chacun .

Donc voila ,s'il y a des volontaires , qu'ils laissent un petit mot ici :)
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Ca m'intéresse pour apprendre car je n'y connais rien , ni en 2 ni en 3D, alors je ne serais pas d'un grand secours :oops:
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Denis tu plaisantes ? j'ai plus à apprendre de toi , que toi de moi .

Et puis tu sais c'est du bricolage ce que je fais en 3D ,j'en ai pour 5 minutes à te mettre au parfum , et tu sauras en faire autant :)

ça va être l'occasion de confronter les idées ,j'espère qu'il y en aura d'autres qui participeront .On va commencer , ça les fera peut-être venir :)

Je vais préparer quelque chose la semaine prochaine pour démarrer.
ensuite il faudra qu'on se mette d'accord sur ce que l'on veut faire exactement .
mode plein écran , ou fenêtre ? ou choix au lancement ?

les différentes options , sauvegarde , choisir son niveau , la gestion de la camera , les textures , faire un éditeur de niveau , etc...
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Voila une base pour débuter
on pourra discuter autour de ça , supprimer le superflu , mettre les fonctions 3D dans un fichier à part , et faire un include , ça simplifiera le code principal .
les expliquer si nécessaire , certaines pourront être améliorées ...etc

Code : Tout sélectionner

;-Initialisation
#ScreenWidth = 800 : #ScreenHeight = 600 : #ScreenDepth = 16
If InitEngine3D() = 0
   MessageRequester( "Erreur" , "Impossible d'initialiser la 3D , vérifiez la présence de engine3D.dll" , 0 )
   End
ElseIf InitSprite() = 0 Or InitKeyboard() = 0 
   MessageRequester( "Erreur" , "Impossible d'initialiser DirectX 7 Ou plus" , 0 )
   End
ElseIf OpenScreen( #ScreenWidth , #ScreenHeight , #ScreenDepth , "Sokoban3D" ) = 0
   MessageRequester( "Erreur" , "Impossible d'ouvrir l'écran " , 0 )
   End
EndIf

;-Declare procedures
Declare.f WrapValue( Angle.f )

;-Structures
Structure Camera
   AngleX.f
   AngleY.f
   CameraVue.l
   CameraDist.f
   CameraHaut.f
   LookAtY.f
EndStructure

Structure Parametres
   AngleX.f
   AngleY.f
   AngleZ.f
EndStructure

Dim entity.Parametres(100)
Global Camera.Camera
Camera\CameraVue = 1

;- Variables globales
Global Pas.f

;-Mesh
CreateMesh(0) ; Cube
SetMeshData(0, 0, ?CubePoints       , 16)
SetMeshData(0, 1, ?CubeTriangles    , 12)
SetMeshData(0, 2, ?CubeTextures     , 16)
SetMeshData(0, 3, ?CubeNormales     , 16)

;- Textures
CreateTexture(1,128,128)
StartDrawing(TextureOutput(1))
  Box(0,0,128,128,RGB(255,255,255))
  Box(2,2,124,124,RGB(200,0,0))
StopDrawing()

CreateTexture(2,128,128)
StartDrawing(TextureOutput(2))
  Box(0,0,128,128,RGB(255,255,255))
  Box(2,2,124,124,RGB(0,0,200))
StopDrawing()

CreateTexture(3,128,128)
StartDrawing(TextureOutput(3))
  Box(0,0,128,128,RGB(255,255,255))
  Box(2,2,124,124,RGB(0,200,0))
  For a = 0 To 128 Step 4
   For b = 0 To 128 Step 4
      Circle(a,b,2,RGB(10,150,10))
   Next b
Next a
StopDrawing()

;- Material
For a = 1 To 3
   CreateMaterial(a, TextureID( a ))
Next a

;-Entity
Restore Entitys
For a = 0 To 1
   Read materialID.l : Read Type.l
   Read Longueur.f : Read Hauteur.f : Read Largeur.f
   Read X.f : Read Y.f : Read Z.f
   Read AngleX.f
   CreateEntity(a , MeshID(0) ,MaterialID(materialID))
   ScaleEntity(a , Longueur , Hauteur , Largeur )
   EntityLocate(a,X,Y,Z)
   entity(a)\AngleX = AngleX
   RotateEntity(a,entity(a)\AngleX,0,0)
Next a

;- Camera
CreateCamera(0, 0, 0 , 100 , 100)
CameraLocate(0,0,0,20)
AmbientColor(RGB(255,255,255))

;- Procédures
Procedure.f Cosd( Angle.f )
   ;calcule le cos d'un angle en degré
   a.f = Angle * 0.0174533
   ProcedureReturn Cos( a )
EndProcedure

Procedure.f Sind( Angle.f )
   ;calcule le sin d'un angle en degré
   a.f = Angle  * 0.0174533
   ProcedureReturn Sin( a )
EndProcedure

Procedure.f WrapValue( Angle.f )
   ;Permet de toujours avoir un angle compris entre 0° et 360°
   While Angle < 0
      Angle + 360
   Wend
   While Angle - 360 >= 0
      Angle - 360
   Wend
   ProcedureReturn Angle
EndProcedure

Procedure.f NewXValue( X.f , Angle.f , NbUnite.f )
   ;r utiliser conjointement avec NewZvalue pour calculer une position de <NbUnite> dans la direction <angle>
   Valeur.f = X + Cosd( Angle ) * NbUnite
   ProcedureReturn Valeur
EndProcedure

Procedure.f NewZValue( Z.f , Angle.f , NbUnite.f )
   ;r utiliser conjointement avec NewXvalue pour calculer une position de <NbUnite> dans la direction <angle>
   Valeur.f = Z - Sind( Angle ) * NbUnite
   ProcedureReturn Valeur
EndProcedure

Procedure.f EcartAngle( angle1.f , angle2.f )
   ; simplifier tout ça
   If angle1 > 180
      ecart2.f = 360 - angle1
   Else
      ecart2.f = angle1
   EndIf
   
   If angle2 > 180
      ecart1.f = 360 - angle2
   Else
      ecart1.f = angle2
   EndIf
   
   If Abs( WrapValue( angle2 ) - WrapValue( angle1 ) ) > 180
      If angle2 < angle1
         Delta.f = ( ecart1 + ecart2 )
      Else
         Delta.f = ( ecart1 + ecart2 ) * -1
      EndIf
   Else
      Delta.f = WrapValue( angle2 ) - WrapValue( angle1 )
   EndIf
   
   ProcedureReturn Delta
   
EndProcedure

Procedure.f CurveAngle( Actuelle.f , Cible.f , P.f )
   ;Calcule un angle progressif allant de la valeur actuelle r la valeur cible
   Delta.f = EcartAngle( Actuelle , Cible )
   If P > 1000 : P = 1000 : EndIf
   Valeur.f = Actuelle + ( Delta * P / 1000 )
   ProcedureReturn WrapValue( Valeur )
EndProcedure

Procedure.f CurveValue( Actuelle.f , Cible.f , P.f )
   ;Calcule une valeur progressive allant de la valeur actuelle r la valeur cible
   Delta.f = Cible - Actuelle
   If P > 1000 : P = 1000 : EndIf
   Valeur.f = Actuelle + ( Delta * P / 1000 )
   ProcedureReturn Valeur
EndProcedure

Procedure GestionCamera()
   
   ; Touches de la Caméra
   If KeyboardReleased(#PB_Key_F1) : Camera\CameraVue = 1 : EndIf
   If KeyboardReleased(#PB_Key_F2) : Camera\CameraVue = 2 : EndIf
   If KeyboardReleased(#PB_Key_F3) : Camera\CameraVue = 3 : EndIf
   
   If KeyboardPushed(#PB_Key_PageUp)
      Camera\AngleY + 0.1
   EndIf
   
   If KeyboardPushed(#PB_Key_PageDown)
      Camera\AngleY - 0.1
   EndIf
   
   If KeyboardPushed(#PB_Key_End)
      Camera\AngleY = CurveValue(Camera\AngleY,0,20)
   EndIf
   
   If Camera\CameraVue = 1
      
      Camera\CameraDist = CurveValue(Camera\CameraDist ,85 , 20)
      Camera\CameraHaut = CurveValue(Camera\CameraHaut ,25 , 20)
      Camera\LookAtY = CurveValue(Camera\LookAtY ,0 , 20)
     
   ElseIf Camera\CameraVue = 2
      
      Camera\CameraDist = CurveValue(Camera\CameraDist ,45 , 20)
      Camera\CameraHaut = CurveValue(Camera\CameraHaut ,25 , 20)
      Camera\LookAtY = CurveValue(Camera\LookAtY , 8 , 20)
     
   ElseIf Camera\CameraVue = 3
      
      Camera\CameraDist = CurveValue(Camera\CameraDist ,15 , 20)
      Camera\CameraHaut = CurveValue(Camera\CameraHaut ,95 , 20)
      Camera\LookAtY = CurveValue(Camera\LookAtY , 0 , 20)
      
   EndIf
   
      Camera\AngleX = CurveAngle(Camera\AngleX , entity(0)\AngleX , 20 )
      PosXCamera.f = CurveValue(CameraX(0) , NewXValue(EntityX(0) , Camera\AngleX + 180 , Camera\CameraDist) , 280)
      PosYCamera.f = CurveValue(CameraY(0) , EntityY(0) + Camera\CameraHaut , 30)
      PosZCamera.f = CurveValue(CameraZ(0) , NewZValue(EntityZ(0) , Camera\AngleX + 180 , Camera\CameraDist) , 280)
      CameraLocate(0 , PosXCamera , PosYCamera , PosZCamera)
      CameraLookAt(0 , EntityX(0) , EntityY(0) + Camera\LookAtY + Camera\AngleY  , EntityZ(0))
      
EndProcedure

Procedure AffAide()
   StartDrawing(ScreenOutput())
   Locate(10,10)
   DrawText("Nombre d'images Minimum = " + StrF(Engine3DFrameRate(#PB_Engine3D_Minimum )) + " / Nombre d'images Maximum = " + StrF(Engine3DFrameRate(#PB_Engine3D_Maximum)))
   Locate(10,30)
   DrawText("Nombre d'images par seconde = " + StrF(Engine3DFrameRate(#PB_Engine3D_Current)))
   Locate(10,50)
   DrawText(StrF(EntityX(0)) + " / " + StrF(EntityY(0)) + " / " + StrF(EntityZ(0)))
   StopDrawing()
EndProcedure

;- Boucle principale

DecAttraction.f = 0.05
Attraction.f = 0
Pas.f = 0

Repeat
   
   ClearScreen(0, 0, 0)
   
   If ExamineKeyboard()
      

      If KeyboardPushed(#PB_Key_Left)
         entity(0)\AngleX = WrapValue( entity(0)\AngleX + 1 )
         RotateEntity(0,1 , 0, 0 )
      ElseIf KeyboardPushed(#PB_Key_Right)
         entity(0)\AngleX = WrapValue( entity(0)\AngleX - 1 )
         RotateEntity(0, -1 , 0, 0 )
      EndIf
      
      If KeyboardPushed(#PB_Key_Up)
         Pas = CurveValue(Pas, 2 , 120)
      ElseIf KeyboardPushed(#PB_Key_Down)
         Pas = CurveValue(Pas, -2 , 120)
      Else
         Pas = CurveValue(Pas, 0 , 200)
      EndIf
      
      
      If KeyboardReleased(#PB_Key_F4) : AfficheAide = 1 - AfficheAide : EndIf
      
   EndIf
   
   ;Bouge le perso   
   MoveEntity( 0 , Cosd( entity(0)\AngleX ) * Pas , 0, -Sind( entity(0)\AngleX ) * Pas )
  
   ; Gestion de la caméra
   GestionCamera()
   
   RenderWorld()
   If AfficheAide : AffAide(): EndIf
   FlipBuffers()
   
Until KeyboardPushed(#PB_Key_Escape)


;-Datas du Cube

DataSection
Entitys:
; le perso
Data.l 2,1 ; matérial
Data.f 6,6,6 ; Dimension longueur , hauteur , largeur
Data.f 200,7,200,0 ; positions X,Y,Z et angle
; le sol
Data.l 3,0 ; matérial
Data.f 1000,8,1000 ; Dimension longueur , hauteur , largeur
Data.f 500,0,500,0 ; positions X,Y,Z et angle

CubePoints:
Data.f -0.5,-0.5,-0.5
Data.f -0.5,-0.5,0.5
Data.f 0.5,-0.5,0.5
Data.f 0.5,-0.5,-0.5

Data.f -0.5,0.5,-0.5
Data.f -0.5,0.5,0.5
Data.f 0.5,0.5,0.5
Data.f 0.5,0.5,-0.5

Data.f -0.5,-0.5,-0.5
Data.f -0.5,-0.5,0.5
Data.f 0.5,-0.5,0.5
Data.f 0.5,-0.5,-0.5

Data.f -0.5,0.5,-0.5
Data.f -0.5,0.5,0.5
Data.f 0.5,0.5,0.5
Data.f 0.5,0.5,-0.5

CubeNormales:
Data.f -0.5,0,-0.5
Data.f -0.5,0,0.5
Data.f 0.5,0,0.5
Data.f 0.5,0,-0.5
Data.f -0.5,0,-0.5
Data.f -0.5,0,0.5
Data.f 0.5,0,0.5
Data.f 0.5,0,-0.5
Data.f 0,1,0
Data.f 0,1,0
Data.f 0,1,0
Data.f 0,1,0
Data.f 0,-1,0
Data.f 0,-1,0
Data.f 0,-1,0
Data.f 0,-1,0

CubeTriangles:
Data.w 0,4,7
Data.w 0,7,3
Data.w 1,5,4
Data.w 1,4,0
Data.w 2,6,5
Data.w 2,5,1
Data.w 3,7,6
Data.w 3,6,2
Data.w 9,8,11
Data.w 9,11,10
Data.w 12,13,14
Data.w 12,14,15

CubeTextures:
Data.f 0,1
Data.f 1,1
Data.f 0,1
Data.f 1,1

Data.f 0,0
Data.f 1,0
Data.f 0,0
Data.f 1,0

Data.f 0,0
Data.f 1,0
Data.f 1,1
Data.f 0,1

Data.f 0,0
Data.f 1,0
Data.f 1,1
Data.f 0,1

EndDataSection
filperj
Messages : 395
Inscription : jeu. 22/janv./2004 1:13

Message par filperj »

Allez, j'y vais de ma petite suggestion.
C'est le principe du plein écran multitâche cher à Marcus, mais simplifié.

Alors pour avoir une fenêtre qui rempli l'écran on modifie l'initialisation comme ça:

Code : Tout sélectionner

;-Initialisation
ScreenWidth = getsystemmetrics_(#sm_cxscreen)
ScreenHeight = getsystemmetrics_(#sm_cyscreen)
If InitEngine3D() = 0
   MessageRequester( "Erreur" , "Impossible d'initialiser la 3D , vérifiez la présence de engine3D.dll" , 0 )
   End
ElseIf InitSprite() = 0 Or InitKeyboard() = 0
   MessageRequester( "Erreur" , "Impossible d'initialiser DirectX 7 Ou plus" , 0 )
   End
ElseIf OpenWindow(0,0,0,screenwidth,screenheight,#pb_window_borderless,"Sokoban3D") = 0
   MessageRequester( "Erreur", "Impossible d'ouvrir la fenêtre")
   End
ElseIf OpenWindowedScreen( WindowID(0), 0, 0, ScreenWidth , ScreenHeight , 0, 0, 0 ) = 0
   MessageRequester( "Erreur" , "Impossible d'ouvrir l'écran " , 0 )
   End
EndIf
SetFrameRate(60)
et pour minimiser dans la barre des tâches et mettre en pause, on rajoute ça dans la boucle principale, par ex juste après le FlipBuffers() :
(là, c'est le "moins" du pavé numérique qui minimise)

Code : Tout sélectionner

Select WindowEvent()
     
     Case #pb_event_closewindow : End
     
   EndSelect
   
   If KeyboardReleased(#pb_key_subtract)
     
     ShowWindow_( WindowID(0), #SW_SHOWMINIMIZED )
     Repeat
       If WaitWindowEvent()=#wm_size And isiconic_(WindowID(0))=0
         Break
       EndIf
     ForEver
     
   EndIf
Au fait, merci au Soldat Inconnu qui est tellement plus lisible que le fichier d'aide de windose :wink:
Le chaos l'emporte toujours sur l'ordre
parcequ'il est mieux organisé.
(Ly Tin Wheedle)
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Bonne suggestion :)

Alors est-ce qu'il est possible de passer du mode plein écran comme tu fais , à un mode fenêtre ? ( on pourrait basculer d'un mode à l'autre par une touche fonction ) .ça permettrait de mettre un menu pour les options , charger ,enregistrer , visualiser une solution , etc ...

voire éventuellement , affichage 2D , ou 3D .

Et pis , y'aura ce truc là à utiliser aussi

IsScreenActive()

ça va être l'occasion de voir ce qu'on peut en faire :)
CORBASE
Messages : 96
Inscription : mar. 24/févr./2004 14:06

Message par CORBASE »

Salut la troupe !

Bah moi je veux bien participer, mais j'ai de très petites connaissance en la matière comparé à vous !

Enfin, si je peux faire quelques choses, j'essayerais !

Puis il faut que j'achete ma license, enfin je vais l'acheter sous peu, car c'est mon anniversaire le 18, donc je vais me la faire acheter :p

Bon vala c'est tout :p
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Message par Patrick88 »

je suivrai ça du coin de l'oeil, parce que déjà là je suis largué :oops:

Patrick
CORBASE
Messages : 96
Inscription : mar. 24/févr./2004 14:06

Message par CORBASE »

Bon, j'ai pris le Code, j'ai essayer de comprendre, mais J'ai rien compris !!

Mdr, il y a trop de chose !

Enfin je vais essayer de comprendre a force !
filperj
Messages : 395
Inscription : jeu. 22/janv./2004 1:13

Message par filperj »

Alors est-ce qu'il est possible de passer du mode plein écran comme tu fais , à un mode fenêtre ? ( on pourrait basculer d'un mode à l'autre par une touche fonction ) .ça permettrait de mettre un menu pour les options , charger ,enregistrer , visualiser une solution , etc ...
Ben c'est déjà un mode fenêtre : c'est une fenêtre sans bordure qui a la taille de l'écran du bureau, mais à part ça elle n'a rien de spécial.
Donc on doit pouvoir ouvrir une fenêtre enfant pour afficher le menu ou autre chose sans complication.
Et pis , y'aura ce truc là à utiliser aussi

IsScreenActive()

ça va être l'occasion de voir ce qu'on peut en faire
Ca c'est pour le plein écran pur et dur. Mais j'ai bien l'impression que quand on minimise (alt+tab) un plein écran avec de la 3D, ça plante systématiquement le moteur 3D. Quelqu'un connaît un truc?
Le chaos l'emporte toujours sur l'ordre
parcequ'il est mieux organisé.
(Ly Tin Wheedle)
CORBASE
Messages : 96
Inscription : mar. 24/févr./2004 14:06

Message par CORBASE »

Ben c'est déjà un mode fenêtre : c'est une fenêtre sans bordure qui a la taille de l'écran du bureau, mais à part ça elle n'a rien de spécial.
Bah vu que c'est Pas un mode plein ecran pur et dur, le alt-Tab ne devrais pas crash le moteur 3D. ENfin je pense
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Ca c'est pour le plein écran pur et dur. Mais j'ai bien l'impression que quand on minimise (alt+tab) un plein écran avec de la 3D, ça plante systématiquement le moteur 3D. Quelqu'un connaît un truc?
Tu utilises quelle DLL ? je serais d'avis de ne pas utiliser la dernière proposée par Danilo , elle me faisait planter des trucs qui fonctionnait très bien avec la DLL fournie dans la version 3.81.

Je viens de tester avec le alt+tab et avec les modifs que tu as proposé ( le mode fenêtre sans bordures ) et ça ne plante pas , j'ai XP home .
Donc on doit pouvoir ouvrir une fenêtre enfant pour afficher le menu ou autre chose sans complication.
je voulais éviter ça et tout faire dans une seule fenêtre , mais si tu penses que c'est mieux comme ça ... pourquoi pas , faut que ça convienne à la majorité des participants de ce post , si quelqu'un a une autre solution à proposer qu'il n'hésite pas, sinon on adopte ta proposition , et si par la suite on n'arrive pas à se mettre d'accord sur un truc , on fera un vote :)


CORBASE et Patrick88 , je me doute bien que ça nécessite quelques explications , par contre , est-ce que vous pourriez me dire sur quoi vous buttez exactement ? ou ce qui mériterait un petit développement ?

Sinon , dès que j'ai le temps je prépare un kit de démarrage , en reprenant le code de ce post , avec les modifs proposés par filperj , et en ajoutant les textures que j'utilisais , et en découpant en 4 fichiers
un fichier include.pbi ( il contiendra les constantes ,les structures ..)
un fichier Fonctions3D.pbi ( il contiendra les fonctions 3D comme son nom l'indique )
un fichier Datas.pbi ( il contiendra les datas des meshs )
un fichier Sokoban3D.pb ( ce sera le prog principal )
on pourra se concentrer là dessus

c'est une suggestion , si vous souhaitez organiser le prog autrement , c'est le moment de le dire :)
CORBASE
Messages : 96
Inscription : mar. 24/févr./2004 14:06

Message par CORBASE »

Bon, Comtois, voici un petit "PatchWork" de ce que je ne saisis pas. Et Don't Forget That : I'am a big n00b :P

Tout d'abord :

Code : Tout sélectionner

;-Declare procedures 
Declare.f WrapValue( Angle.f ) 
Cette ligne sert à quoi, je n'es pas compris ...
Ensuite :

Code : Tout sélectionner

;-Entity 
Restore Entitys 
For a = 0 To 1 
   Read materialID.l : Read Type.l 
   Read Longueur.f : Read Hauteur.f : Read Largeur.f 
   Read X.f : Read Y.f : Read Z.f 
   Read AngleX.f 
   CreateEntity(a , MeshID(0) ,MaterialID(materialID)) 
   ScaleEntity(a , Longueur , Hauteur , Largeur ) 
   EntityLocate(a,X,Y,Z) 
   entity(a)\AngleX = AngleX 
   RotateEntity(a,entity(a)\AngleX,0,0) 
Next a 
La c'est le flou total ...

et

Code : Tout sélectionner

Procedure.f CurveAngle( Actuelle.f , Cible.f , P.f ) 
   ;Calcule un angle progressif allant de la valeur actuelle r la valeur cible 
   Delta.f = EcartAngle( Actuelle , Cible ) 
   If P > 1000 : P = 1000 : EndIf 
   Valeur.f = Actuelle + ( Delta * P / 1000 ) 
   ProcedureReturn WrapValue( Valeur ) 
EndProcedure 
Je ne vois pas pas concretement l'action de cette procédure !

Bon et pour la fin, les Data, j'ai presque compris !

Sinon, je pense que j'ai pas le niveau pour vous aider .. C'est bien dommage, cela me plaisais bien comme project ...

Enfin vala, j'espère comprendre en cours de route, pour ne pas vous retarder ...

:wink:
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

="CORBASE"

Code : Tout sélectionner

;-Declare procedures 
Declare.f WrapValue( Angle.f ) 
Voila ce que dit la doc , si ce n'est toujours pas clair , n"hésite pas .

Dans certains cas une procédure peut appeler une autre procédure qui n'a pas été déclarée avant sa propre définition. Ce cas peut se produire et provoquer une erreur de compilation 'Procedure XXXX not found'. Declare permet de traiter ce cas particulier en déclarant seulement l'en-tête de la procédure. Il est essentiel que les attributs de la fonction Declare et la déclaration réelle de la procédure soient identiques.

Exemple :

Declare Maximum(Valeur1, Valeur2)

Procedure Traitement(Valeur)
Maximum(10, 2) ; A cet instant Maximum() n'est pas connu du compilateur.
EndProcedure

Procedure.l Maximum(Valeur1.l, Valeur2.l)
If Valeur1>Valeur2
Resultat.l = Valeur1
Else
Resultat = Valeur2
Endif

ProcedureReturn Resultat
EndProcedure


La procedure traitement() appelle la procedure maximum()
pour que ça fonctionne , il faudrait que la procedure maximum() soit placée avant la procedure traitement(), mais ce n'est pas toujours possible d'organiser ses procédures ainsi , et dans ce cas , tu as la possibilité de déclarer la procédure maximum() comme dans l'exemple ci dessus , et ainsi tu peux la placer après la procedure traitement() .

Code : Tout sélectionner

;-Entity 
Restore Entitys 
For a = 0 To 1 
   Read materialID.l : Read Type.l 
   Read Longueur.f : Read Hauteur.f : Read Largeur.f 
   Read X.f : Read Y.f : Read Z.f 
   Read AngleX.f 
   CreateEntity(a , MeshID(0) ,MaterialID(materialID)) 
   ScaleEntity(a , Longueur , Hauteur , Largeur ) 
   EntityLocate(a,X,Y,Z) 
   entity(a)\AngleX = AngleX 
   RotateEntity(a,entity(a)\AngleX,0,0) 
Next a 
La c'est le flou total ...
c'est pas très grave je vais le supprimer par la suite :)
ça coince aussi sur les datas ou seulement sur les instructions 3D ?

Code : Tout sélectionner

; creation d'un objet 3D ( entity ) avec une texture material 
   CreateEntity(a , MeshID(0) ,MaterialID(materialID)) 
   ; ici je redimensionne l'objet dans les 3 dimensions 
   ScaleEntity(a , Longueur , Hauteur , Largeur ) 
   ; ici c'est la position de l'objet dans le monde 3D
   EntityLocate(a,X,Y,Z) 
   ;ici il faut stocker la valeur de l'angle sur l'axe des x car pour
   ;l'instant purebasic ne permet pas de connaitre la valeur 
   ;des angles d'un objet 3D , par contre on peut récupérer
   ;sa position avec entityX() entityY() et entityZ()
   entity(a)\AngleX = AngleX 
   ;ici on oriente l'objet sur le plan XZ 
   RotateEntity(a,entity(a)\AngleX,0,0) 
Je crois que je vais faire un exemple plus simple ,avec seulement un cube pour débuter :)

et tu t"amuseras à modifier le code pour comprendre .

Code : Tout sélectionner

Procedure.f CurveAngle( Actuelle.f , Cible.f , P.f ) 
   ;Calcule un angle progressif allant de la valeur actuelle r la valeur cible 
   Delta.f = EcartAngle( Actuelle , Cible ) 
   If P > 1000 : P = 1000 : EndIf 
   Valeur.f = Actuelle + ( Delta * P / 1000 ) 
   ProcedureReturn WrapValue( Valeur ) 
EndProcedure 
Je ne vois pas pas concretement l'action de cette procédure !
Ben celle là , je suis sûr qu'il y a mieux ,mais je ne sais pas comment , ça peut faire l'objet d'une amélioration par quelqu'un :)
L'objectif de cette fonction c'est de calculer un angle progressif
Je l'utilise surtout pour les mouvements de camera , pour éviter qu'il soit trop brusque .
par exemple , la camera est à 90° et elle doit suivre le personnage ,si le personnage tourne brusquement à 120° , visuellement c'est plus agréable si la caméra se place à 120° progressivement .

Regarde dans la procedure GestionCamera()
et essaye de changer la valeur de 20 en mettant une grande valeur , puis une petite valeur , et déplace toi avec le cube, tu verras la différence.

Camera\AngleX = CurveAngle(Camera\AngleX , entity(0)\AngleX , 20 )

tu peux même essayer sans la procedure curveangle

Camera\AngleX = entity(0)\AngleX

et tu verras la différence , tu comprendras mieux à quoi ça sert.
Sinon, je pense que j'ai pas le niveau pour vous aider .. C'est bien dommage, cela me plaisais bien comme project ...

Enfin vala, j'espère comprendre en cours de route, pour ne pas vous retarder ...
N'hésite pas à poser tes questions ,c'est aussi le but de ce post , montrer une façon de faire ,voire plusieurs si d'autres apportent leurs idées :)
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Je vais regarder ça cet après-midi mais je suis un peu comme Patrick...
Je poserais les questions de ce que je ne comprend pas.
Répondre