Openscreen et gestion du temps.
Openscreen et gestion du temps.
Hello,
Voilà un problème récurent que j'aimerai régler.
Quel est le moyen en OpenScreen (et pas openwindowscreen) de gérer une timeline (ligne de temps) d'évènements à la manière d'un timer en mode fenêtré.
J'ai commencé avec le même code en fenêtré + openwindowscreen mais ça lag plus et je me retrouve toujours avec le bug de lag de souris haut dpi.
J'aimerai si possible ne pas créer de fenetre invisible pour gruger.
Tous les jeux du marché proposent un mode fenêtré sans bord et n'ont pas ce soucis de souris, ça devient pénible.
Voilà un problème récurent que j'aimerai régler.
Quel est le moyen en OpenScreen (et pas openwindowscreen) de gérer une timeline (ligne de temps) d'évènements à la manière d'un timer en mode fenêtré.
J'ai commencé avec le même code en fenêtré + openwindowscreen mais ça lag plus et je me retrouve toujours avec le bug de lag de souris haut dpi.
J'aimerai si possible ne pas créer de fenetre invisible pour gruger.
Tous les jeux du marché proposent un mode fenêtré sans bord et n'ont pas ce soucis de souris, ça devient pénible.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Re: Openscreen et gestion du temps.
Pour empecher la souris de bugguer, il faut utiliser un autre system; celui ci (code a nettoyer) :
Code : Tout sélectionner
UseJPEGImageDecoder()
UseOGGSoundDecoder()
Global win, LMB, RMB, MMB, OldMouseX, OldMouseY
Procedure CrisotResetMouseDelta()
OldMouseX=WindowMouseX(win)
OldMouseY=WindowMouseY(win)
EndProcedure
Procedure CrisotMouseDeltaX()
DeltaMouseX=WindowMouseX(win)-OldMouseX
OldMouseX=WindowMouseX(win)
ProcedureReturn DeltaMouseX
EndProcedure
Procedure CrisotMouseDeltaY()
DeltaMouseY=WindowMouseY(win)-OldMouseY
OldMouseY=WindowMouseY(win)
ProcedureReturn DeltaMouseY
EndProcedure
Procedure CrisotMouseButton()
Repeat
Event = WindowEvent()
Select Event
Case #WM_LBUTTONDOWN ; API Windows
LMB=#True
Case #PB_Event_LeftClick ; bricolage - #WM_LBUTTONUP plante
LMB=#False
Case #WM_RBUTTONDOWN ; API Windows
RMB=#True
Case #PB_Event_RightClick ; bricolage - #WM_RBUTTONUP plante
RMB=#False
Case #WM_MBUTTONDOWN ; API Windows
MMB=#True
Case #WM_MBUTTONUP ; API Windows
MMB=#False
EndSelect
Until Event=0
EndProcedure
Procedure CrisotLeftMouseButton()
CrisotMouseButton()
ProcedureReturn LMB
EndProcedure
Procedure CrisotRightMouseButton()
CrisotMouseButton()
ProcedureReturn RMB
EndProcedure
Procedure CrisotMiddleMouseButton()
CrisotMouseButton()
ProcedureReturn MMB
EndProcedure
If InitSprite() And InitKeyboard() And InitSound() ;And InitMouse()
Else
MessageRequester("Erreur", "InitSprite() And InitMouse() And InitKeyboard() And InitSound() : impossible")
End
EndIf
If LoadFont(1, "Arial", 8)
Else : MessageRequester("Erreur", "LoadFont(1, ''Arial'', 8) : impossible")
End
EndIf
;Andalus$="Andalus"
Andalus$="Times New Roman"
If LoadFont(2, Andalus$, 50)
Else : MessageRequester("Erreur", "LoadFont(2, Andalus$, 50) : impossible")
End
EndIf
; CRISOT
;If ExamineDesktops()
; scr_w = DesktopWidth(0)
; scr_h = DesktopHeight(0)
; OpenScreen(scr_w,scr_h,32,""); OpenWindowedScreen(WindowID(window),0,0,sWidth,sHeight,1,0,0,#PB_Screen_SmartSynchronization)
;Else
;MessageRequester("Erreur", "OpenScreen impossible")
;End
;EndIf
; CRISOT - Remplace avantageusement l'OpenScreen()
win=OpenWindow(#PB_Any, 0, 0, 0, 0, "HexaScrabble2", #PB_Window_Maximize | #PB_Window_BorderLess )
;win=OpenWindow(#PB_Any, 0, 0, 800,600, "HexaScrabble2")
scr_w=WindowWidth(win) : scr_h=WindowHeight(win)
OpenWindowedScreen (WindowID(win),0 , 0, scr_w, scr_h,0, 0, 0, #PB_Screen_SmartSynchronization)
ShowCursor_(0) ; CRISOT - On cache le curseur.
;FlipBuffers();-;FlipBuffers()
; Repeat
; ; ExamineMouse() ; CRISOT
; ExamineKeyboard()
; Until CrisotLeftMouseButton() Or KeyboardPushed(#PB_Key_Space)
; If LoadModule(1,chemin$+"zik\0.mod");- zik
; ModuleVolume(1, 80)
; PlayModule(1)
; EndIf
;ExamineMouse() ; CRISOT
;mx=MouseX() ; CRISOT
;my=MouseY() ; CRISOT
;Mb_Left=MouseButton(#PB_MouseButton_Left) ; CRISOT
mx=WindowMouseX(win) ; CRISOT
my=WindowMouseY(win) ; CRISOT
Mb_Left=CrisotLeftMouseButton() ; CRISOT
ClearScreen(0)
LoadFont(1, "Arial", 8)
StartDrawing(ScreenOutput())
DrawingMode( #PB_2DDrawing_Default) ;#PB_2DDrawing_Transparent)
DrawingFont(FontID(1))
BackColor(0)
StopDrawing()
;ExamineMouse() ; CRISOT
;mx=MouseX() ; CRISOT
;my=MouseY() ; CRISOT
;Mb_Left=MouseButton(#PB_MouseButton_Left) ; CRISOT
mx=WindowMouseX(win) ; CRISOT
my=WindowMouseY(win) ; CRISOT
Mb_Left=CrisotLeftMouseButton() ; CRISOT
FlipBuffers();-;FlipBuffers()
ExamineKeyboard()
Repeat
;ExamineMouse() ; CRISOT
;Mb_Left=MouseButton(#PB_MouseButton_Left) ; CRISOT
Mb_Left=CrisotLeftMouseButton() ; CRISOT
Until Mb_Left<>0
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
!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
Re: Openscreen et gestion du temps.
Merci, j'ai déjà un code (plus court) pour le bug souris mais c'est de la bidouille avec un Thread. (il faut vraiment que Fantaisie Software offre une solution native à ce problème).
La vraie question à mon soucis de timing est toujours là en openscreen().
La vraie question à mon soucis de timing est toujours là en openscreen().
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Re: Openscreen et gestion du temps.
Peut tu donner un petit code et dire ce que tu veux que ca fasse (je maitrise le temps dans les openscreen, je ne vois pas ou est le probleme)
Dernière modification par SPH le sam. 17/févr./2018 19:46, modifié 1 fois.
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
!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
Re: Openscreen et gestion du temps.
Exemple
- J'ai mon Openscreen avec des starfields qui défilent
- Au bout de 5 sec je fais traverser un asteroid
- J'ai mon Openscreen avec des starfields qui défilent
- Au bout de 5 sec je fais traverser un asteroid
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Re: Openscreen et gestion du temps.
Une comete qui passe apres 3 secondes de stars scrolling :
Code : Tout sélectionner
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
MessageRequester("Erreur", "Impossible d'initialiser l'écran.")
End
EndIf
;Ouverture de l'écran
If OpenScreen(1024,768,32,"Exemple OpenScreen") = 0
MessageRequester("Erreur", "Impossible d'ouvrir l'écran.")
End
EndIf
Dim stars_x(100)
Dim stars_y(100)
For i=0 To 100
stars_x(i)=Random(1023)
stars_y(i)=Random(767)
Next
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Boucle principale
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
timer=ElapsedMilliseconds()
Repeat
;Effacer complètement l'écran et afficher un fond gris
ClearScreen(0)
;On lit les évènements clavier et souris
ExamineKeyboard()
StartDrawing(ScreenOutput())
For i=0 To 100
stars_x(i)+5
If stars_x(i)>1023
stars_x(i)-1023
EndIf
Plot(stars_x(i),stars_y(i),RGB(200,200,200))
Next
If comete=0 And ElapsedMilliseconds()-timer>3000
comete=1
EndIf
If comete=1
comete_x+3
comete_y+1
Circle(comete_x,comete_y,30,RGB(255,100,100))
If comete_x>1040
comete=2
EndIf
EndIf
StopDrawing()
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape) ;On quitte l'application en appuyant sur la touche Echap (ESC)
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
!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
Re: Openscreen et gestion du temps.
Merci c'est bien ce que je craignais, ellapsemil indispensable.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Re: Openscreen et gestion du temps.
Ha heuuuu, oui, je crois qu'on ne peux pas y couper...
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
!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
Re: Openscreen et gestion du temps.
Du coup j'ai fait une petite macro sympa pour simplifier l'écriture
Dans ton exemple ça donne
Code : Tout sélectionner
Macro Active(_flag,_NbrSec)
If _flag=0 And ElapsedMilliseconds()-timer> (_NbrSec*1000)
_flag=#True
EndIf
EndMacro
Code : Tout sélectionner
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
MessageRequester("Erreur", "Impossible d'initialiser l'écran.")
End
EndIf
Macro Active(_flag,_NbrSec)
If _flag=0 And ElapsedMilliseconds()-start> (_NbrSec*1000)
_flag=#True
EndIf
EndMacro
;Ouverture de l'écran
If OpenScreen(1024,768,32,"Exemple OpenScreen") = 0
MessageRequester("Erreur", "Impossible d'ouvrir l'écran.")
End
EndIf
Dim stars_x(100)
Dim stars_y(100)
For i=0 To 100
stars_x(i)=Random(1023)
stars_y(i)=Random(767)
Next
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Boucle principale
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
timer=ElapsedMilliseconds()
Repeat
;Effacer complètement l'écran et afficher un fond gris
ClearScreen(0)
;On lit les évènements clavier et souris
ExamineKeyboard()
StartDrawing(ScreenOutput())
For i=0 To 100
stars_x(i)+5
If stars_x(i)>1023
stars_x(i)-1023
EndIf
Plot(stars_x(i),stars_y(i),RGB(200,200,200))
Next
; Macro de gestion du temps
Active (comete,4) ; Lance la comete dans 4 sec
If comete=1
comete_x+3
comete_y+1
Circle(comete_x,comete_y,30,RGB(255,100,100))
If comete_x>1040
comete=2
EndIf
EndIf
StopDrawing()
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape) ;On quitte l'application en appuyant sur la touche Echap (ESC)
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Re: Openscreen et gestion du temps.
Petite astuce pour les étoiles, les faire réapparaître sur le côté gauche de l'écran, AVANT la position 0, pour éviter de les voir apparaître dans l'écran...
Code : Tout sélectionner
If stars_x(i)>1023
stars_x(i)-1023 - spritewidth(stars_x(i))
EndIf
Re: Openscreen et gestion du temps.
Oui c'est vrai j'aurai pu le mettre dans l'exemple que j'ai copié collé ^^
Dans ma proce j'utilise - Random(25) histoire de varier un poil l’écart des étoiles
Dans ma proce j'utilise - Random(25) histoire de varier un poil l’écart des étoiles
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Re: Openscreen et gestion du temps.
Oui, sinon, je n'ai pas bien compris le problème de départ... Il y a plusieurs façons de gérer le temps en mode plein écran. On peut compter le nombre de frames, sachant que quand il n'y a pas de ralentissement, chaque frame vaut 1/60ème de seconde. Ce n'est pas fiable pour des événements en temps long, parce qu'il y aura forcément sous Windows des "frame drop". Par contre, c'est très fiable pour être sûr de faire partir un élément et de réagir après un certain déplacement correspondant à un certain nombre d'images. Il y a aussi les timers, mais il faut prévoir cette forme d'interruption du "program flow", avec éventuellement sauvegarde/restauration du contexte. Les outils sont là, c'est à chacun de bien les utiliser...
Re: Openscreen et gestion du temps.
Les timers nécessitent forcement une fenêtre non ? Sinon je n'ai pas trop compris ce que j'ai mis en gras dans ta phraseIl y a aussi les timers, mais il faut prévoir cette forme d'interruption du "program flow", avec éventuellement sauvegarde/restauration du contexte.
Sinon volià le 1er rendu. Le lag et la qualité viennent de la capture et de l'encodage moisi ^^
https://youtu.be/Qev05UyQ5WQ
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Re: Openscreen et gestion du temps.
Ben ça va, c'est un bon début ! Par contre il faut mettre les étoiles en arrière-plan (premier truc dessiné).
Les timers nécessitent une fenêtre oui c'est exact, mais je pensais aux threads et le mot timer est sorti...
Dans la logique d'un jeu, il y a les sorties (ex affichage, son, réseau), celles qui ne peuvent souffrir aucun délai et dont l'actualisation est régulière (comme l'affichage), ou événementielle (réseau) ; il y a les entrées et d'autres événements (par ex les interactions avec l'utilisateur et le réseau, mais aussi certaines formes de logique de jeu) qui doivent être traitées avec une priorité à définir.
Dans les jeux à l'ancienne, on découpe le temps d'une frame en temps impartis à telle ou telle tâche (la plus grosse partie du temps étant consacré à l'affichage), en s'assurant qu'aucune n'est bloquante, et on passe de l'une à l'autre dans l'ordre et puis on recommence.
Dans les jeux récents, certaines tâches sont threadées ou mises dans des files d'attente ; il faut alors s'assurer que les tâches fonctionnant en parallèle ne vont pas empiéter les unes sur les autres. Par exemple, commencer à afficher un sprite alors qu'on n'a pas fini de le charger. C'est beaucoup plus compliqué à gérer. Autre exemple avec Ogre, on a un moteur capable de gérer plein de choses tout seul ; bref, son flux et le flux du programme principal sont détachés : pour les faire interagir, on utilise une sorte de communication par messages, ce n'est plus aussi "impératif". De plus en plus nos programmes fonctionnent ainsi.
Les timers nécessitent une fenêtre oui c'est exact, mais je pensais aux threads et le mot timer est sorti...
Dans la logique d'un jeu, il y a les sorties (ex affichage, son, réseau), celles qui ne peuvent souffrir aucun délai et dont l'actualisation est régulière (comme l'affichage), ou événementielle (réseau) ; il y a les entrées et d'autres événements (par ex les interactions avec l'utilisateur et le réseau, mais aussi certaines formes de logique de jeu) qui doivent être traitées avec une priorité à définir.
Dans les jeux à l'ancienne, on découpe le temps d'une frame en temps impartis à telle ou telle tâche (la plus grosse partie du temps étant consacré à l'affichage), en s'assurant qu'aucune n'est bloquante, et on passe de l'une à l'autre dans l'ordre et puis on recommence.
Dans les jeux récents, certaines tâches sont threadées ou mises dans des files d'attente ; il faut alors s'assurer que les tâches fonctionnant en parallèle ne vont pas empiéter les unes sur les autres. Par exemple, commencer à afficher un sprite alors qu'on n'a pas fini de le charger. C'est beaucoup plus compliqué à gérer. Autre exemple avec Ogre, on a un moteur capable de gérer plein de choses tout seul ; bref, son flux et le flux du programme principal sont détachés : pour les faire interagir, on utilise une sorte de communication par messages, ce n'est plus aussi "impératif". De plus en plus nos programmes fonctionnent ainsi.
Re: Openscreen et gestion du temps.
Merci pour ces précisions.
Je pense threader les évènements sonores... à voir si c'est bloquant (faut d'abord que je me digitalise^^).
ShowStar() : ShowMoon() : ShowShip() : ShowAstero()
Je pense threader les évènements sonores... à voir si c'est bloquant (faut d'abord que je me digitalise^^).
Petit oublie de ma part effectivement.Par contre il faut mettre les étoiles en arrière-plan (premier truc dessiné).
ShowStar() : ShowMoon() : ShowShip() : ShowAstero()
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels