Page 5 sur 6

Re: Idée -> Créer un F1 Manager

Publié : ven. 01/janv./2016 9:45
par Marc56
Shadow a écrit :Bon, on va essayer de commencer :)
Bien : « Les plus grandes aventures ont toujours commencées par un pas. »
Shadow a écrit :Pour commencer, comment ont fait en PB pour dire à un objet de suivre un chemin.
Le chemin à suivre est constitué d'une suite de couple de coordonnées x, y qu'il suffit de stocker dans une structure, puis on met tous les couples dans un tableau.
Après c'est comme pour tracer une courbe en math (x, y) sauf qu'on efface le point précédent avant d'afficher le suivant.
Simple logique.
Shadow a écrit :Seulement il y a un Hic là dedans car suivant où il se situe, il faudra que je lui dise de ralentir ou d’accélérer.
Changer l'intervalle de temps entre l'affichage de chaque point.
Shadow a écrit :Rien que ça déjà c'est hors de ma portée.
Il suffit de commencer point par point.
1. Placer un point dans un canvas
2. Déplacer un sprite sur une image
3. Déplacer des points
Shadow a écrit :De plus faudra que je puisse faire circuler plusieurs objets (Ici voiture) donc chacun devra avoir son chemin ou le même ?
Une structure pour les voitures
Une structure pour le chemin

La science infuse ça n'existe pas, le talent c'est 99% de transpiration et 1% d'inspiration :roll:
Programmer c'est uniquement de la logique (et regarder comment ont fait les autres sur des projets similaires)

Re: Idée -> Créer un F1 Manager

Publié : ven. 01/janv./2016 11:43
par Shadow
Ok, je vais voir ça merci.

Re: Idée -> Créer un F1 Manager

Publié : ven. 01/janv./2016 18:24
par Micheao
Shadow
regarde ce code c'est un jeu où un serpent se deplace ( crée pas Falsam)

http://www.purebasic.fr/french/viewtopi ... it=serpent

Re: Idée -> Créer un F1 Manager

Publié : ven. 01/janv./2016 19:22
par case
pour un F1 manager pas besoin de faire suivre une route réelle a moins de vouloir ajouter un élément visuel pour le joueur

pour moi il te suffirais d'avoir une table pour le circuit avec l longueur des différent tronçons ainsi que leur angle

par exemple une ligne droite pourait d'une longeur de 100m 100,0
un virage a 90° d'une longeur de 20 metres 20,90 ou 20,-90 pour le sens du virage

ensuite les voitures peuvent avoir plusieur caracteristiques comme acceleration vitesse max, adherence (suivant le train de pneus et les suspentions installées etc)

enfin les pilotes des caracteristiques comme pilotage, sens du danger
et des competences comme nerfs d'acier, vue, reflexes

du coup pour gerer ta course il te suffis pour chaque pilote de faire des tests de competences et de caracteristiques avec des bous par rapport a leurs competences ou des malus...en utilisant comme dificulté les troncons successifs et les caracteristiques de la voiture l'etat du revetement, la meteo etc...

ainsi apres avoir fait tout les tests de chaque circuit tu peux definir l'ordre d'arrivée...

et afficher ensuite les stats de chaque ecurie...

je le verrais comme ca.

Re: Idée -> Créer un F1 Manager

Publié : ven. 01/janv./2016 19:27
par Shadow
Oui, c'est en partie comme ça aussi que je vois les choses.
Mais avec un visuel de base c'est bien aussi.

Re: Idée -> Créer un F1 Manager

Publié : sam. 02/janv./2016 12:34
par Ar-S
@spock, c'est carrément par là qu'il faut qu'il commence.

Re: Idée -> Créer un F1 Manager

Publié : sam. 02/janv./2016 16:25
par falsam
Un bout de code qui permet de placer des points de passages et faire circuler un sprite automatiquement.

Une procédure ( ViewCrossingPoints() ) permet d'afficher les points de passage afin de faciliter la mise en place de ces points de passages. Il suffit par la suite de commenter cette procédure.

Code : Tout sélectionner

EnableExplicit

;Structure d'un sprite pour le joueur 
Structure NewSprite
  id.i        
  x.d
  y.d
  Speed.d
  NexPoint.i  
EndStructure

;Structure d'un point de passage (On peut ajouter par exemple une nouvelle vitesse )
Structure NewPoint
  id.i
  x.i
  y.i
EndStructure
Global NewList CrossingPoints.NewPoint()

Global Event, Angle.d, LastAngle.f
Global Background
Global LadyBug.NewSprite

Declare AddCrossingPoint(x.i, y.i) 
Declare ViewCrossingPoints()       
Declare.f angleDiff(currentDir.f, wantDir.f, maxTurn.f)

;Initialisation diverses
InitNetwork() ;Pour le téléchargement des images

InitSprite()
InitKeyboard()

UseJPEGImageDecoder()
UsePNGImageDecoder()

;Téléchargement des images 
If ReceiveHTTPFile("http://www.falsam.com/download/images/sprites/i2.png", "i2.png") : EndIf
If ReceiveHTTPFile("http://www.falsam.com/download/images/sprites/blur1.jpg", "blur1.jpg") : EndIf
If ReceiveHTTPFile("http://www.falsam.com/download/images/sprites/pin.png", "pin.png") : EndIf

;Creation du screen
OpenWindow(0, 0, 0, 800, 600, "Point de passage")
OpenWindowedScreen(WindowID(0), 0, 0, 800, 600)

;Création des sprite
Background = LoadSprite(#PB_Any, "blur1.jpg")
ZoomSprite(Background, 800, 600)

;Création de la cocinelle : Initialisation de sa position initiale et de sa vitesse
LadyBug\id = LoadSprite(#PB_Any, "i2.png", #PB_Sprite_AlphaBlending)
LadyBug\x = 50
LadyBug\y = 60
LadyBug\Speed = 7

;On place quelques points de passage
AddCrossingPoint(50, 50)
AddCrossingPoint(250, 60)
AddCrossingPoint(400, 150)
AddCrossingPoint(700, 60)
AddCrossingPoint(750, 300)
AddCrossingPoint(650, 400)
AddCrossingPoint(650, 500)
AddCrossingPoint(500, 550)
AddCrossingPoint(300, 450)
AddCrossingPoint(200, 350)
AddCrossingPoint(150, 250)

;Boucle evenementielle
Repeat
  Repeat
    Event = WindowEvent() 
    Select event    
      Case #PB_Event_CloseWindow
        End
    EndSelect  
  Until event=0
  
  FlipBuffers()
  ExamineKeyboard()
  
  ;Affichage du background 
  DisplaySprite(Background, 0, 0)
   
  ;Affichage des points de passages
  ;Cette fonctionnalité n'est pas obligatoire
  ViewCrossingPoints()
  
  ;Selection du point de passage suivant
  SelectElement(CrossingPoints(), LadyBug\NexPoint)
  
  ;Ce point est t'il atteint ?
  If Abs(CrossingPoints()\x - LadyBug\x) < 10 And Abs(CrossingPoints()\y - LadyBug\y) < 10 
    If LadyBug\NexPoint < ListSize(CrossingPoints()) - 1
      LadyBug\NexPoint + 1
    Else 
      LadyBug\NexPoint = 0
    EndIf
  EndIf
    
  ;Calcul de l'angle en degre (0 à 360)
  Angle = ATan2(CrossingPoints()\x - LadyBug\x, CrossingPoints()\y - LadyBug\y) * 180 / #PI + 180
  
  Angle = angleDiff(LastAngle, Angle, 10)
  LastAngle = Angle
  
  ;Rotation de la cocinelle avec l'angle calculé
  ;La cocinelle initiale étant affiché à 90°, on retire 90 au résultat obtenu
  RotateSprite(LadyBug\id, Angle - 90, #PB_Absolute)
  
  ;Calcul de la nouvelle position de la cocinelle
  If Abs(CrossingPoints()\x - LadyBug\x) >= 1
    LadyBug\x - (LadyBug\Speed * Cos(Radian(Angle)))
  EndIf
  If Abs(CrossingPoints()\y - LadyBug\y) >= 1
    LadyBug\y - (LadyBug\Speed * Sin(Radian(Angle)))
  EndIf
  
  ;Affichage de la cocinelle
  DisplayTransparentSprite(LadyBug\id, LadyBug\x, LadyBug\y)
  
Until KeyboardPushed(#PB_Key_Escape)
  

Procedure AddCrossingPoint(x.i, y.i)
  AddElement(CrossingPoints())
  With CrossingPoints()
    \id = LoadSprite(#PB_Any, "pin.png", #PB_Sprite_AlphaBlending)
    \x = x
    \y = y
  EndWith
EndProcedure

Procedure ViewCrossingPoints()
  ForEach CrossingPoints()
    With CrossingPoints()
      DisplayTransparentSprite(\id, \x, \y)
    EndWith
  Next
EndProcedure

Procedure.f angleDiff(currentDir.f, wantDir.f, maxTurn.f)
  ;from http://stackoverflow.com/questions/20109394/rotate-angle-to-target-angle-via-shortest-side
  Protected directionDiff.f
  
  ;wantDir - votre direction de la cible
  ;maxTurn - le nombre maximum de degrés pour allumer
  ;currentDir - votre direction actuelle
  
  If wantDir >= (currentDir + 180)
    currentDir + 360
  ElseIf wantDir < (currentDir - 180)
    wantDir + 360
  EndIf
  
  directionDiff = wantDir - currentDir
  
  If directionDiff < -maxTurn
    directionDiff = -maxTurn
  ElseIf directionDiff > maxTurn
    directiondiff = maxTurn
  EndIf
  
  ProcedureReturn Mod(directionDiff + currentDir, 360)  ;retourner la direction résultante
EndProcedure

Re: Idée -> Créer un F1 Manager

Publié : sam. 02/janv./2016 17:00
par Micheao
Falsam il manque :cursordrag.png

Re: Idée -> Créer un F1 Manager

Publié : sam. 02/janv./2016 17:02
par falsam
Micheao a écrit :Falsam il manque :cursordrag.png
Merci Micheao. Le code est corrigé.

Re: Idée -> Créer un F1 Manager

Publié : sam. 02/janv./2016 17:04
par falsam
La meme chose sur un model de circuit mais sans l'affichage des points de passages que j'ai commenté

Code : Tout sélectionner

EnableExplicit

;Structure d'un sprite pour le joueur 
Structure NewSprite
  id.i        
  x.d
  y.d
  Speed.d
  NexPoint.i  
EndStructure

;Structure d'un point de passage (On peut ajouter par exemple une nouvelle vitesse )
Structure NewPoint
  id.i
  x.i
  y.i
EndStructure
Global NewList CrossingPoints.NewPoint()

Global Event, Angle.d, LastAngle.f
Global Background
Global LadyBug.NewSprite

Declare AddCrossingPoint(x.i, y.i) 
Declare ViewCrossingPoints()       
Declare.f angleDiff(currentDir.f, wantDir.f, maxTurn.f)

;Initialisation diverses
InitNetwork() ;Pour le téléchargement des images

InitSprite()
InitKeyboard()

UseJPEGImageDecoder()
UsePNGImageDecoder()

;Téléchargement des images 
If ReceiveHTTPFile("http://www.falsam.com/download/images/sprites/i2.png", "i2.png") : EndIf
If ReceiveHTTPFile("http://www.falsam.com/download/images/sprites/formula.png", "formula.png") : EndIf
If ReceiveHTTPFile("http://www.falsam.com/download/images/sprites/pin.png", "pin.png") : EndIf

;Creation du screen
OpenWindow(0, 0, 0, 1024, 768, "Point de passage")
OpenWindowedScreen(WindowID(0), 0, 0, 1024, 768)

;Création des sprite
Background = LoadSprite(#PB_Any, "formula.png")

;Création de la cocinelle : Initialisation de sa position initiale et de sa vitesse
LadyBug\id = LoadSprite(#PB_Any, "i2.png", #PB_Sprite_AlphaBlending)
LadyBug\x = 340
LadyBug\y = 300
LadyBug\Speed = 7

;On place quelques points de passage
AddCrossingPoint(340, 340)
AddCrossingPoint(849, 613)
AddCrossingPoint(970, 404)
AddCrossingPoint(946, 152)
AddCrossingPoint(796, 120)
AddCrossingPoint(698, 197)
AddCrossingPoint(763, 359)
AddCrossingPoint(670, 642)
AddCrossingPoint(330, 620)
AddCrossingPoint(185, 411)
AddCrossingPoint(90, 312)
AddCrossingPoint(116, 208)

;Boucle evenementielle
Repeat
  Repeat
    Event = WindowEvent() 
    Select event    
      Case #PB_Event_CloseWindow
        End
    EndSelect  
  Until event=0
  
  FlipBuffers()
  ExamineKeyboard()
  
  ;Affichage du background 
  DisplaySprite(Background, 0, 0)
   
  ;Affichage des points de passages
  ;Cette fonctionnalité n'est pas obligatoire
  ;ViewCrossingPoints()
  
  ;Selection du point de passage suivant
  SelectElement(CrossingPoints(), LadyBug\NexPoint)
  
  ;Ce point est t'il atteint ?
  If Abs(CrossingPoints()\x - LadyBug\x) < 10 And Abs(CrossingPoints()\y - LadyBug\y) < 10 
    If LadyBug\NexPoint < ListSize(CrossingPoints()) - 1
      LadyBug\NexPoint + 1
    Else 
      LadyBug\NexPoint = 0
    EndIf
  EndIf
    
  ;Calcul de l'angle en degre (0 à 360)
  Angle = ATan2(CrossingPoints()\x - LadyBug\x, CrossingPoints()\y - LadyBug\y) * 180 / #PI + 180
  
  Angle = angleDiff(LastAngle, Angle, 10)
  LastAngle = Angle
  
  ;Rotation de la cocinelle avec l'angle calculé
  ;La cocinelle initiale étant affiché à 90°, on retire 90 au résultat obtenu
  RotateSprite(LadyBug\id, Angle - 90, #PB_Absolute)
  
  ;Calcul de la nouvelle position de la cocinelle
  If Abs(CrossingPoints()\x - LadyBug\x) >= 1
    LadyBug\x - (LadyBug\Speed * Cos(Radian(Angle)))
  EndIf
  If Abs(CrossingPoints()\y - LadyBug\y) >= 1
    LadyBug\y - (LadyBug\Speed * Sin(Radian(Angle)))
  EndIf
  
  ;Affichage de la cocinelle
  DisplayTransparentSprite(LadyBug\id, LadyBug\x, LadyBug\y)
  
Until KeyboardPushed(#PB_Key_Escape)
  

Procedure AddCrossingPoint(x.i, y.i)
  AddElement(CrossingPoints())
  With CrossingPoints()
    \id = LoadSprite(#PB_Any, "pin.png", #PB_Sprite_AlphaBlending)
    \x = x
    \y = y
  EndWith
EndProcedure

Procedure ViewCrossingPoints()
  ForEach CrossingPoints()
    With CrossingPoints()
      DisplayTransparentSprite(\id, \x, \y)
    EndWith
  Next
EndProcedure

Procedure.f angleDiff(currentDir.f, wantDir.f, maxTurn.f)
  ;from http://stackoverflow.com/questions/20109394/rotate-angle-to-target-angle-via-shortest-side
  Protected directionDiff.f
  
  ;wantDir - votre direction de la cible
  ;maxTurn - le nombre maximum de degrés pour allumer
  ;currentDir - votre direction actuelle
  
  If wantDir >= (currentDir + 180)
    currentDir + 360
  ElseIf wantDir < (currentDir - 180)
    wantDir + 360
  EndIf
  
  directionDiff = wantDir - currentDir
  
  If directionDiff < -maxTurn
    directionDiff = -maxTurn
  ElseIf directionDiff > maxTurn
    directiondiff = maxTurn
  EndIf
  
  ProcedureReturn Mod(directionDiff + currentDir, 360)  ;retourner la direction résultante
EndProcedure

Re: Idée -> Créer un F1 Manager

Publié : sam. 02/janv./2016 18:47
par Micoute
Superbe travail falsam, comme à ton habitude,

Le mien fait pâle figure à côté du tien

Code : Tout sélectionner

;F1 Grand Prix V.3 (5.41 LTS x86 Micoute)
EnableExplicit
Enumeration
  #Voiture
  #Voiture3D_IA
EndEnumeration

Enumeration Images
  #Circuit
EndEnumeration  

#LargeurEcr = 800
#HauteurEcr = 600
UsePNGImageDecoder()

InitSprite() : InitKeyboard() : InitMouse()
OpenScreen(#LargeurEcr, #HauteurEcr, 32, "")

;-Structures
Structure Vecteur2
  x.f
  y.f
EndStructure

Structure Entite
  Position.Vecteur2
  x.f
  y.f
  Angle.f
EndStructure


;-Declarations des fonctions
Declare.f curveangle(newangle.f,oldangle.f,increments.f)
Declare.f ReturnDegAngle(x1.f,y1.f,x2.f,y2.f)
Declare track_SmoothPoint(*A.Entite,*B.Entite, turnspeed.f=1.0)
Declare .f DistanceEntre2Points(ax.f, ay.f, bx.f, by.f)
#turnspeed = 4

; ************************************************************************************

Global checkpoint = 1
Global Quit
Global NbCheck
Global Fichier$
Global NumFichier = 1

If NumFichier = 1
  Restore Melbourne
ElseIf NumFichier = 2  
  Restore Catalogne
ElseIf NumFichier = 3
  Restore Adelaide
EndIf

Read.i NbCheck
; Tableau pour stocker les différents checkpoint à atteindre
Global Dim Target.Entite(NbCheck), i
For i = 1 To NbCheck
  Read.i Target(i)\x
  Read.i Target(i)\y
Next i

; Voiture.
; Ses coordonnées pour la position de départ
Global Voiture.Entite
Voiture\x = Target(1)\x
Voiture\y = Target(1)\y
Voiture\Angle = 0

; Super voiture de sport rouge dont on ne citera pas la marque.
CreateSprite(#Voiture3D_IA, 16, 16)
StartDrawing(SpriteOutput(#Voiture3D_IA))
Box(3, 0, 16, 10, RGB(255, 0, 0))
Box(12, 4, 4, 2, RGB(255, 255, 255))
StopDrawing()

If NumFichier = 1
  Fichier$ = "D:\Programmation\Prg Perso\P\PROJETS\F1 Grand Prix\Circuit Albert Park Melbourne Australie.png"
ElseIf NumFichier = 2  
  Fichier$ =  "D:\Programmation\Prg Perso\P\PROJETS\F1 Grand Prix\Circuit Catalogne Espagne.png"
ElseIf NumFichier = 3  
  Fichier$ = "D:\Programmation\Prg Perso\P\PROJETS\F1 Grand Prix\Circuit Adelaide Australie.png"
EndIf  

LoadImage(#Circuit, Fichier$,0)
; Ci-dessous on utilise le programme dans le mode fenêtré.

checkpoint = 1
Repeat
  ExamineKeyboard()
  ExamineMouse()
  Define Mx = MouseX()
  Define My = MouseY()
  
  
  StartDrawing(ScreenOutput())
  DrawImage(ImageID(#Circuit), 0, 0, #LargeurEcr, #HauteurEcr)
  
  DrawText((#LargeurEcr-TextWidth(GetFilePart(Fichier$, #PB_FileSystem_NoExtension)))/2, 10, GetFilePart(Fichier$, #PB_FileSystem_NoExtension), 0, Point(0,0))
  
  ; Affichage de tous les points du circuit à atteindre.
  ;For i = 1 To NbCheck
  ;  Circle(Target(i)\x, Target(i)\y, 2, RGB(0, 255, 255))
  ;Next i
  
  ;En route les petits bolides !!!
  Select checkpoint
    Case 1 To NbCheck
      If DistanceEntre2Points(Voiture\x, Voiture\y, Target(checkpoint)\x, Target(checkpoint)\y) > 5
        track_SmoothPoint(@Voiture, @Target(checkpoint), #turnspeed)
        ;Afficher le prochain checkpoint
        ;Circle(Target(checkpoint)\x, Target(checkpoint)\y, 2, RGB(255, 255, 255))
      Else
        checkpoint + 1
      EndIf
    Default
      checkpoint = 1
  EndSelect  
  
  ;DrawText(Voiture\x - 70, Voiture\y + 10, "{"+ Str(Target(checkpoint)\x) +" | "+ Str(Int(Voiture\x)) +", "+ Str(Target(checkpoint)\y) +" | "+ Str(Int(Voiture\y)) +"}" )
  
  StopDrawing()
  
  ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  ;+ La voiture se dirige vers le chemin du checkpoint à la vitesse 1.5
  ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  Voiture\x + 1.5 *Cos(Voiture\Angle*#PI/180)
  Voiture\y + 1.5 *Sin(Voiture\Angle*#PI/180)
  
  DisplayTransparentSprite(#Voiture3D_IA, Voiture\x - 8, Voiture\y - 8)
  RotateSprite(#Voiture3D_IA, Voiture\Angle, 0)
  If KeyboardPushed(#PB_Key_Escape)<>#Null : Quit=1 : EndIf
  FlipBuffers()
Until Quit=1
End



Procedure.f curveangle(newangle.f,oldangle.f,increments.f)
  If increments > 1
    If (oldangle + 360) - newangle < newangle - oldangle
      oldangle = 360 + oldangle 
    EndIf
    If (newangle + 360) - oldangle < oldangle - newangle
      newangle = 360 + newangle
    EndIf
    oldangle = oldangle - (oldangle - newangle) / increments
  EndIf
  
  If increments <= 1
    ProcedureReturn newangle
  EndIf
  
  ProcedureReturn oldangle
EndProcedure


Procedure.f ReturnDegAngle(x1.f,y1.f,x2.f,y2.f) ; DEGRES
  Protected A.f, b.f, c.f, Angle.f
  A.f = x1-x2
  b.f = y1-y2
  c.f = -Sqr(A*A+b*b)
  Angle.f = ACos(A / c) * 180 / #PI
  If y1 < y2 : Angle = 360 - Angle : EndIf
  ProcedureReturn Abs(Angle - 360)
EndProcedure


Procedure track_SmoothPoint(*A.Entite,*B.Entite, turnspeed.f=1.0)
  Protected AngDif.f, temp_yaw.f
  
  AngDif = ReturnDegAngle(*A\x,*A\y,*B\x,*B\y)
  temp_yaw.f = curveangle(AngDif, *A\Angle, turnspeed)
  *A\Angle = temp_yaw
EndProcedure

Procedure.f DistanceEntre2Points(ax.f, ay.f, bx.f, by.f)
  ProcedureReturn Sqr(Pow((bx - ax), 2) + Pow((by - ay), 2))
EndProcedure

DataSection
  Melbourne:
  Data.i 35
  Data.i 480, 461, 339, 458, 318, 424, 296, 420, 225, 420, 185, 417, 113, 398, 100, 389, 124, 349, 072, 296, 
         083, 223, 098, 189, 107, 167, 110, 145, 142, 144, 200, 105, 236, 117, 320, 177, 313, 205, 348, 262, 
         393, 302, 427, 312, 506, 310, 547, 276, 657, 268, 764, 323, 767, 343, 741, 407, 729, 418, 716, 418, 
         716, 419, 652, 403, 641, 411, 644, 439, 634, 458
  Catalogne:
  Data.i 29
  Data.i 385, 475, 125, 476, 109, 451, 102, 376,  88, 349,  62, 338,  26, 301,  29, 210,  51, 157, 250, 146, 
         277, 175, 269, 243, 137, 253, 133, 273, 218, 370, 294, 374, 311, 356, 317, 295, 396, 140, 649, 374, 
         680, 354, 681, 283, 601, 207, 594, 165, 628, 147, 740, 187, 749, 424, 732, 461, 688, 474
  Adelaide:
  Data.i 26
  Data.i 671, 217, 135, 578, 101, 585,  68, 574,  12, 480,  15, 450,  37, 422,  58, 417, 147, 415, 214, 418,
         266, 405, 393, 321, 424, 317, 464, 317, 542, 267, 549, 251, 547, 237, 527, 198, 525, 166, 533, 139,
         553, 111, 697,  15, 729,  13, 767,  35, 787,  80, 777, 141

Re: Idée -> Créer un F1 Manager

Publié : sam. 02/janv./2016 18:51
par falsam
@Micoute: Je ne peux pas tester ton code car il manque les images.

Re: Idée -> Créer un F1 Manager

Publié : sam. 02/janv./2016 19:33
par Micoute
Eh oui, je regrette, mais je ne sais toujours pas comment on fait pour les joindre, bien qu'on m'explique à chaque fois !

Re: Idée -> Créer un F1 Manager

Publié : sam. 02/janv./2016 19:35
par falsam
Micoute a écrit :Eh oui, je regrette, mais je ne sais toujours pas comment on fait pour les joindre, bien qu'on m'explique à chaque fois !
Pas de compte dropbox ou autres ?

Re: Idée -> Créer un F1 Manager

Publié : sam. 02/janv./2016 19:36
par Micoute
Hélas, non je ne sais pas comment ça fonctionne !