Physique - Avion

Généralités sur la programmation 3D
Avatar de l’utilisateur
Guillot
Messages : 529
Inscription : jeu. 25/juin/2015 16:18

Physique - Avion

Message par Guillot »

dans la serie 'simulateur mini budget', l'avion

Code : Tout sélectionner

;Physics - Airplane - pf Shadoko - 2019

EnableExplicit

Structure Vector3
  x.f
  y.f
  z.f
EndStructure

Structure PB_MeshVertexV  
  p.vector3
  n.vector3
  t.vector3
  u.f
  v.f
  color.l
EndStructure

Macro vec3d(v,vx,vy,vz)
  v\x=vx
  v\y=vy
  v\z=vz
EndMacro

Macro sub3D(p,p1,p2)
  p\x=p1\x-p2\x
  p\y=p1\y-p2\y
  p\z=p1\z-p2\z
EndMacro

Macro mul3d(p1,v)
  p1\x*(v)
  p1\y*(v)
  p1\z*(v)
EndMacro

Procedure.f lng3D(*v.Vector3)
  ProcedureReturn Sqr(*V\x * *V\x + *V\y * *V\y + *V\z * *V\z)
EndProcedure

Procedure.f Pscalaire3d(*p.vector3,*q.vector3)
  ProcedureReturn *p\x * *q\x + *p\y * *q\y + *p\z * *q\z 
EndProcedure

Macro getv(p)
  p\x = GetX()
  p\y = GetY()
  p\z = GetZ()
EndMacro

Procedure localtoworld(oid.l ,*p.vector3)
  ConvertLocalToWorldPosition(oid,*p\x,*p\y,*p\z)
  getv(*p)
EndProcedure

Procedure.f POM(v.f)
  ProcedureReturn (Random(v*1000)-v*500)/500
EndProcedure

Procedure perlinarray2d(Array pa.f(2),rnd,periode,amplitude.f=1)
  Protected i,ii,dx=ArraySize(pa(),1),ddx=dx/periode,
            j,jj,dy=ArraySize(pa(),2),ddy=dy/periode
  Protected.f x,y,y0,y1,wx,wy
  
  RandomSeed(rnd)
  Dim t.f(ddx+1,ddy+1)
  For i=0 To ddx:For j=0 To ddy:t(i,j)=pom(amplitude):Next:Next
  For i=0 To ddx+1:t(i,ddy+1)=t(i,0):Next
  For j=0 To ddy+1:t(ddx+1,j)=t(0,j):Next
  
  For jj=0 To ddy
    For ii=0 To ddx
      For i=0 To periode-1
        x=i/periode
        wx=x*x*(3-2*x)
        For j=0 To periode-1
          y0=t(ii+1,jj  )*wx+t(ii,jj  )*(1-wx)
          y1=t(ii+1,jj+1)*wx+t(ii,jj+1)*(1-wx)
          y=j/periode
          wy=y*y*(3-2*y)
          pa(ii*periode+i,jj*periode+j)=y1*wy+y0*(1-wy)
        Next
      Next
    Next
  Next
EndProcedure

Procedure matiere(num,dx,dy,c1,c2, brillance=$888888,alpha=0,scale.f=1)
  CreateTexture(num,dx,dy)
  StartDrawing(TextureOutput(num))
  If alpha:DrawingMode(#PB_2DDrawing_AllChannels):EndIf
  Box(0,0,dx,dy,c2)
  Box(2,2,dx-4,dy-4,c1) 
  StopDrawing()
  CreateMaterial(num, TextureID(num))
  MaterialFilteringMode(num,#PB_Material_Anisotropic,4)
  ScaleMaterial(num,scale,scale)
  If brillance:SetMaterialColor(num, #PB_Material_SpecularColor, brillance):MaterialShininess(num, 40):EndIf
  If alpha:MaterialBlendingMode(num,#PB_Material_AlphaBlend):EndIf
EndProcedure

Procedure AddMesh(mesho,Mesh,mat, NewX.f=0 , NewY.f=0, NewZ.f=0, ScaleX.f=1, ScaleY.f=1, ScaleZ.f=1, RotateX.f=0, RotateY.f=0, RotateZ.f=0)
  Protected Dim MeshDataV.PB_MeshVertex(0)
  Protected Dim MeshDataF.PB_MeshFace(0)
  Protected i,meshc
  
  meshc=CopyMesh(mesh,-1)
  TransformMesh(Meshc, NewX,NewY,NewZ, ScaleX,ScaleY,ScaleZ, RotateX,RotateY,RotateZ)
  GetMeshData(Meshc,0, MeshDataV(), #PB_Mesh_Vertex |#PB_Mesh_Color | #PB_Mesh_UVCoordinate| #PB_Mesh_Normal, 0, MeshVertexCount(Meshc, 0)-1)
  GetMeshData(Meshc,0, MeshDataF(), #PB_Mesh_Face, 0, MeshIndexCount(Meshc, 0)-1)
  FreeMesh(meshc) 
  
  AddSubMesh()
  For i=0 To ArraySize(MeshDataV())
    With MeshDatav(i)
      MeshVertex(\x,\y,\z,\u,\v,$ffffff,\NormalX,\NormalY,\NormalZ)
    EndWith
  Next     
  For i=0 To ArraySize(MeshDataF()) Step 3
    MeshFace(MeshDataF(i)\Index, MeshDataF(i+1)\Index,MeshDataF(i+2)\Index)
  Next
  If mat>=0:SetMeshMaterial(mesho, MaterialID(mat), SubMeshCount(mesho)-1):EndIf
EndProcedure

;##########################################################################################################################################################
Global ex,ey,h.f

Procedure mesh_terrain(mesh,n) 
  Protected.f h, vx, vy
  Protected i,j,dt=4,n2=n/2
  Dim pa.f(n-1,n-1)
  
  perlinarray2d(pa(),0,16,16*4)
  
  Dim t.PB_MeshVertexV(n,n)
  RandomSeed(0)
  For j=0 To n
    For i=0 To n
      With t(i,j)  
        \p\x=(i-n2)*10
        \p\z=(j-n2)*10
        \p\y=pa(i & (n-1),j & (n-1)):If \p\y<0:\p\y=0:EndIf
        \u=i
        \v=j
        \color=$ffffff
      EndWith 
    Next
  Next
  CreateDataMesh(mesh,t())
  NormalizeMesh(mesh);UpdateMeshBoundingBox(mesh);BuildMeshShadowVolume(mesh)
EndProcedure

Procedure Init()
  Protected i
  InitEngine3D():InitSprite():InitKeyboard():InitMouse()
  
  OpenWindow(0, 0, 0, 800,600, "",#PB_Window_Maximize|#PB_Window_BorderLess)
  ex=WindowWidth (0,#PB_Window_InnerCoordinate)
  ey=WindowHeight(0,#PB_Window_InnerCoordinate)
  OpenWindowedScreen(WindowID(0), 0, 0, ex, ey, 0, 0, 0)
  LoadFont(0,"arial",11)
  Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Textures", #PB_3DArchive_FileSystem):Parse3DScripts()
  
  EnableWorldPhysics(#True)
  EnableWorldCollisions(#True)
  WorldGravity(-10)
  
  CreateCamera(0, 0, 0, 100, 100):MoveCamera(0,0,10,-20)
  CameraBackColor(0,$ff8888) 
  
  CreateLight(0,$888888, 500,1000,0):SetLightColor(0, #PB_Light_SpecularColor, $ffffff)
  AmbientColor($444444)  
  
  ; -------------------- terrain
  matiere(0,256,256,$ff448888,$ff88cccc,0)
  mesh_terrain(100,256)
  CreateEntity(100,MeshID(100),MaterialID(0)):CreateEntityBody(100,#PB_Entity_StaticBody,1,0,1)
  EntityRenderMode(100,0)
  matiere(1,256,256,$aaaaaa,$ffffff,0):ScaleMaterial(1,0.1,0.1/6)
  CreateCube(101,1):TransformMesh(101,0,0,0,20,0.4,240,0,0,0):UpdateMeshBoundingBox(101)
  CreateEntity(101,MeshID(101),MaterialID(1)):CreateEntityBody(101,#PB_Entity_StaticBody,1,0,0.5)
  
  ; -------------------- plane
  CreateMesh(0)
  matiere(10,256,256,$88444444,$88444444,$ffffff,1)
  CreateSphere(1,0.3):AddMesh(0,1,10,0,0.3,-0.3, 1,1,1.9)
  matiere(11,256,256,$ff0000ff,$0000ff,$ffffff,0,4)
  CreateCapsule(1,0.4,0.6):AddMesh(0,1,11,0,0,0.5,1,1,1,-90,0,0)
  CreateCone(1,0.4,3,16,1):AddMesh(0,1,11,0,0,-1.3,1,1,1,-90,0,0)
  CreateCapsule(1, 0.3,0):AddMesh(0,1,11,0,0.2,-2.5,0.1,1.5,1,0,0,0)
  CreateCapsule(1, 0.3,0):AddMesh(0,1,11,0,0,-2.5,3,0.1,1,0,0,0)
  CreateCapsule(1, 0.5,5):AddMesh(0,1,11,0,0,0,1,1,0.2,90,0,90)  
  matiere(12,256,256,$444444,$000000,0)
  CreateCylinder(1,0.2,0.1):AddMesh(0,1,12,0.6,-0.6,0.5,1,1,1,0,0,90):AddMesh(0,1,12,-0.6,-0.6,0.5,1,1,1,0,0,90)
  FinishMesh(1):NormalizeMesh(0);UpdateMeshBoundingBox(0);BuildMeshShadowVolume(0)
  CreateEntity(0, MeshID(0), #PB_Material_None,0,0.8+0.2,0):CreateEntityBody(0, #PB_Entity_ConvexHullBody ,100, 0.0,0.2);EntityRenderMode(0, 0)
  SetEntityAttribute(0,#PB_Entity_LinearSleeping,0)
  
  ; helice
  matiere(13,256,256,$444444,$444444)
  CreateCapsule(2,0.1,0.5):TransformMesh(2,0,0,0,0.2,2,1,0,90,0):NormalizeMesh(2):UpdateMeshBoundingBox(2);:BuildMeshShadowVolume(2)
  CreateEntity(2, MeshID(2), MaterialID(13),0,0,1.3) 
  AttachEntityObject(0,"",EntityID(2))
  
  ; smoke
  LoadTexture(20, "smoke2.png")
  CreateMaterial(20, TextureID(20))
  DisableMaterialLighting(20, 1)
  MaterialBlendingMode   (20, #PB_Material_AlphaBlend)
  SetMaterialAttribute(20,#PB_Material_TAM,#PB_Material_ClampTAM)
  CreateParticleEmitter(0, 0.25,0,0,0,0,0,-2)
  ParticleMaterial    (0, MaterialID(20))
  ParticleSize        (0, 0.5,0.5)
  ParticleEmissionRate(0, 25)
  ParticleTimeToLive  (0, 1,1)
  ParticleScaleRate(0,2)
  ParticleAngle(0,-180,180,-90,90)
  ParticleColorFader(0,0,0,0,-1)
  DisableParticleEmitter(0,1)
  AttachEntityObject(0,"",ParticleEmitterID(0))
  
  RenderWorld(10000)
  WorldShadows(#PB_Shadow_Additive)
  ;WorldDebug(#PB_World_DebugEntity)
EndProcedure

Procedure stabilise(entity,f.f)
  Protected.f x,y,z
  x=GetEntityAttribute(entity,#PB_Entity_AngularVelocityX)
  y=GetEntityAttribute(entity,#PB_Entity_AngularVelocityY)
  z=GetEntityAttribute(entity,#PB_Entity_AngularVelocityZ)
  ApplyEntityTorque(entity,-x*f,-y*f,-z*f,#PB_World )
EndProcedure

Procedure menu()
  Protected p=4
  Macro DT(t1,t2="")
    DrawText(8,p,t1)
    DrawText(160,p,t2)
    p+20
  EndMacro
  CreateSprite(0,240,188,#PB_Sprite_AlphaBlending)
  StartDrawing(SpriteOutput(0))
  DrawingMode(#PB_2DDrawing_AllChannels)
  DrawingFont(FontID(0))
  Box(0,0,OutputWidth(),OutputHeight(),$44000000)
  DrawingMode(#PB_2DDrawing_AllChannels|#PB_2DDrawing_Outlined)
  Box(0,0,OutputWidth(),OutputHeight(),$44ffffff)
  BackColor($44000000)
  FrontColor($ffffffff)
  dt("[Arrow keys] / Mouse", "Yoke / Stick")
  dt("[Pad 2-1] / LMB-RMB","Rudder")
  dt("[Pad 0-1] / Wheel","Engine")
  dt("[F1]","Camera")
  dt("[F2]","Smoke")
  dt("[Esc]","Quit")
  dt("        Engine %")
  dt("        Altitude")
  dt("        Velocity")
  StopDrawing()
EndProcedure

Procedure affiche3d()
  Protected.f      cx=0.05,       cz=2.5,   czp=100,      alt=0.8+0.2
  Protected.f rotp,decx,decy,decz,poussee,fpoussee,fportance,v,vd,vp
  Protected.vector3 apos,pos,vit,dir,per,ftrainee,p,p0
  Protected i,ii,j,c,l,dis=0,vdis=1<<dis,smoke,shadows
  
  Macro KBdep(k1,k2):(Bool(KeyboardPushed(k1))-Bool(KeyboardPushed(k2))) :EndMacro
  
  menu()
  MouseLocate(ex/2,ey/2)
  vec3d(pos,EntityX(0),EntityY(0),EntityZ(0))
  Repeat 
    WindowEvent()
    ExamineMouse()
    ExamineKeyboard()
    If KeyboardReleased(#PB_Key_F1):dis=(dis+1)%3:vdis=1<<dis:EndIf
    If KeyboardReleased(#PB_Key_F2):smoke=1-smoke:vdis=4:DisableParticleEmitter(0,1-smoke):EndIf 
    
    vec3d(dir,-EntityDirectionX(0),-EntityDirectionY(0),-EntityDirectionZ(0))
    vec3d(p,0,-1,0)
    vec3d(p0,0,0,0)
    localtoworld(EntityID(0),p)
    localtoworld(EntityID(0),p0)
    sub3d(per,p,p0)
    apos=pos:vec3d(pos,EntityX(0),EntityY(0),EntityZ(0))
    sub3d(vit,pos,apos)
    mul3d(vit,60)
    v=lng3d(vit)
    vd=Pscalaire3d(vit,dir)
    vp=Pscalaire3d(vit,per)
    
    ; commandes
    decx-KBdep(#PB_Key_Left,#PB_Key_Right)*0.4+MouseDeltaX()*0.02:decx*0.8
    decz+KBdep(#PB_Key_Down,#PB_Key_Up   )*0.4+MouseDeltaY()*0.01:decz*0.8
    decy+KBdep(#PB_Key_Pad2,#PB_Key_Pad3 )*0.4+(MouseButton(1)-MouseButton(2))*0.4:decy*0.8
    poussee+KBdep(#PB_Key_Pad1,#PB_Key_Pad0)*1+MouseWheel()*10:If poussee<0:poussee=0:ElseIf poussee>100:poussee=100:EndIf
    
    ; portance    
    fportance=vd*vd*cz + vp*czp
    ApplyEntityForce(0, 0,fportance,0,decx*1,1,-0.15,#PB_Local )
    
    ; poussée
    fpoussee=poussee*10
    ApplyEntityForce(0, 0,0,fpoussee,0,0,1,#PB_Local)
    
    ; trainée
    ftrainee=vit:mul3d(ftrainee,-v*v*cx)
    vec3d(p,decy,decz,-2)
    vec3d(p0,0,0,0)
    localtoworld(EntityID(0),p)
    localtoworld(EntityID(0),p0)
    sub3d(p,p,p0)
    ApplyEntityForce(0,ftrainee\x,ftrainee\y,ftrainee\z,p\x,p\y,p\z,#PB_World )
    
    stabilise(0,800)
    
    rotp=poussee:RotateEntity(2,0,0,rotp,#PB_Relative)
    
    CameraFollow(0, EntityID(0), -180,EntityY(0)+vdis, 6*vdis, 0.02, 0.5)
    
    RenderWorld(16)
    StartDrawing(SpriteOutput(0)):DrawingFont(FontID(0)):DrawText(160,124,Str(poussee)+"  "):DrawText(160,144,StrF(pos\y,1)+"  "):DrawText(160,164,StrF(v,1)+"  "):StopDrawing()
    DisplayTransparentSprite(0,8,8)
    FlipBuffers()  
  Until KeyboardPushed(#PB_Key_Escape)
EndProcedure

init()
affiche3d()
Dernière modification par Guillot le mer. 01/mai/2019 8:09, modifié 3 fois.
Avatar de l’utilisateur
SPH
Messages : 4723
Inscription : mer. 09/nov./2005 9:53

Re: Physique - Avion

Message par SPH »

Erreur ligne 324 :|

pb 5.70 lts 32 :idea:
http://HexaScrabble.com/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Physique - Avion

Message par Ollivier »

@SPH

Erreur ligne 1 : Erreur non spécifiée !!
Avatar de l’utilisateur
Guillot
Messages : 529
Inscription : jeu. 25/juin/2015 16:18

Re: Physique - Avion

Message par Guillot »

chez moi, ça marche en x64 et x86

ça sent le caractere foireux

je vais rééditer le code

@ SPH : essaye en commentant la ligne 325 startdrawing...
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Physique - Avion

Message par Micoute »

Superbe travail, merci professeur Shadoko pour le partage de cette magnifique œuvre.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
SPH
Messages : 4723
Inscription : mer. 09/nov./2005 9:53

Re: Physique - Avion

Message par SPH »

Erreur ligne 324 :

Code : Tout sélectionner

RenderWorld(16)
Si je commente cette ligne, j'ai une scene de rectangles qui clignote :!:
http://HexaScrabble.com/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Physique - Avion

Message par Micoute »

C'est curieux, pour une fois que ça fonctionne très bien chez moi, apparemment on n'a pas le même sous-système, moi c'est OpenGL.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
SPH
Messages : 4723
Inscription : mer. 09/nov./2005 9:53

Re: Physique - Avion

Message par SPH »

Micoute a écrit :C'est curieux, pour une fois que ça fonctionne très bien chez moi, apparemment on n'a pas le même sous-système, moi c'est OpenGL.
Si je ne m'abuse, on a un sous systeme uniquement si on compile le code, non :?:
Moi, j'ai lancé le code depuis l'IDE 8)
http://HexaScrabble.com/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Physique - Avion

Message par Micoute »

Bonjour SPH,

l'IDE ou Environnement de Développement Intégré, crée toujours un exécutable qui se nomme PureBasic_Compilateur0.exe, ou plus s'il y a d'autres programmes, qu'il exécute selon le sous-système de ton système.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
SPH
Messages : 4723
Inscription : mer. 09/nov./2005 9:53

Re: Physique - Avion

Message par SPH »

Micoute a écrit :Bonjour SPH,

l'IDE ou Environnement de Développement Intégré, crée toujours un exécutable qui se nomme PureBasic_Compilateur0.exe, ou plus s'il y a d'autres programmes, qu'il exécute selon le sous-système de ton système.
Ce qui veux dire qu'il faut aller dans COMPILATEUR/OPTION DU COMPIL renseigner le sous system meme si on n'utilise que l'ide avec un .PB ? (c'est nouveau pour moi tout ca)

P.S. : a propos de sous system, je suis surpris que l'on doive l'ecrire au clavier. Une liste deroulante pre remplis (ou des boutons radio) me semblerais plus logique :idea:
http://HexaScrabble.com/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Physique - Avion

Message par Micoute »

Tout à fait d'accord, donc je plussoie.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
Guillot
Messages : 529
Inscription : jeu. 25/juin/2015 16:18

Re: Physique - Avion

Message par Guillot »

d'accord avec SPH

au niveau des plantages, avec la 3d y'a 2 causes fréquentes; les ombres et les sprites:

1) les ombres:
ligne 224
- essayer en remplaçant PB_Shadow_Additive par PB_Shadow_Modulative (j'y crois pas trop...)
- les désactiver (commenter la ligne)

2) les sprites:
commenter les lignes
224 : menu()

325 : StartDrawing...
326 : DisplayTransparentSprite...
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Physique - Avion

Message par falsam »

Testé avec PB 5.70 LTS (x64) Aucun souci. Bravo et merci pour de nous faire partager tes créations.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Mesa
Messages : 1097
Inscription : mer. 14/sept./2011 16:59

Re: Physique - Avion

Message par Mesa »

Oui, bravo !

Je vais montrer ce simulateur à mon école de pilotage !

Mais avant, j'aimerais ajouter des ailerons, entre autre, et les animer en temps réel en appuyant sur une touche clavier, mais je n'y arrive pas.

Je bataille avec les hingejoint mais sans succès, et ce n'est peut-être pas la solution.

Quelqu'un peut me mettre sur la voie, svp ?

Merci par avance.

Mesa.
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Physique - Avion

Message par Kwai chang caine »

Toujours pas compris comment tu arrives à créer des super beaux et étonnants objets seulement avec des lignes de codes 8O
Ca me fait planer...merci de ce nouveau partage 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Répondre