Re: Ouvrir un screen plus grand que la fenetre
Publié : ven. 10/mai/2019 21:01
J'ajouterai après-demain de quoi scroller sans API en évitant d'utiliser les threads.
Forums PureBasic - Français
https://www.purebasic.fr/french/
Code : Tout sélectionner
; Codé par Dobro
;Pb 5.70
;- Window Constants
;
Declare Open_Window_0()
Enumeration
#Window_0 ; numero de la fenetre
#sprite ; numero du sprite
#Button_0 ; numero du bouton
#Gadget_scroll
#Container
EndEnumeration
Structure sprite
num.l ; numero du sprite
x.l ; la coordonée x du sprites
Y.l ; la coordonée y du sprites
sensx.l ; le sens du deplacement x du sprite
sensy.l ; le sens du deplacement y du sprite
coul.l ; la couleur du sprite
EndStructure
nombre_de_Sprite=200
Dim sprite.sprite(nombre_de_Sprite)
For i=1 To nombre_de_Sprite
sprite(i)\x=Random(1920) +32; on donne une coordonée de depart au sprite
sprite(i)\Y=Random(1080)+32
de=Random(1)
If de=1
sprite(i)\sensx=10 ; on donne un sens de deplacement par defaut au sprite
sprite(i)\sensy=10 ; ce chiffre correspond a la vitesse de deplacement du sprite
Else
sprite(i)\sensx=-10 ; on donne un sens de deplacement par defaut au sprite
sprite(i)\sensy=10 ; ce chiffre correspond a la vitesse de deplacement du sprite
EndIf
sprite(i)\coul = RGB(Random(200)+50,Random(200)+50,Random(200)+50) ; attribut une couleur
Next i
;
InitSprite()
Open_Window_0() ; appel de la procedure qui ouvre la fenetre
; ****** creation des sprites *********
For i=1 To nombre_de_Sprite
CreateSprite(i,16,16) ; creation d'une cellule vide (un sprite)
StartDrawing( SpriteOutput(i)) ; on va dessiner dans notre sprite un carre coloré
Box(1,1,16,16,sprite(i)\coul) ; voila le dessin du carre vert dans notre sprite
StopDrawing()
Next i
;**************************************
CreateSprite(300,32,32) ; creation d'une cellule vide (un sprite)
StartDrawing( SpriteOutput(300)) ; on va dessiner dans notre sprite un carre coloré
circle(1,1,16,rgb(0,255,0)) ; voila le dessin du carre vert dans notre sprite
StopDrawing()
For i=1 To nombre_de_Sprite
; **************Affichage du sprite ***********
DisplaySprite(i,sprite(i)\x,sprite(i)\Y)
Next i
DisplaySprite(300,1920-32,1080-32)
FlipBuffers()
Repeat ; boucle principale , qui gere les affichages dans l'ecran graphique et les evenement de la fenetre
select WaitWindowEvent(2)
Case #PB_Event_CloseWindow
End
Case #PB_Event_Gadget
Select EventGadget()
Case #Gadget_scroll
; debug GetGadgetAttribute(#Gadget_scroll, #PB_ScrollArea_X)
; debug GetGadgetAttribute(#Gadget_scroll, #PB_ScrollArea_Y)
Case #Button_0
Debug "appuis sur le bouton ok"
End
EndSelect
EndSelect
; Resize sans API
Largeur = WindowWidth(#Window_0, #PB_Window_InnerCoordinate)
Hauteur = WindowHeight(#Window_0, #PB_Window_InnerCoordinate)
If mem_largeur<>Largeur or mem_Hauteur<>Hauteur
ResizeGadget(#Button_0,#Pb_ignore,Hauteur-88,#Pb_ignore,#Pb_ignore)
ResizeGadget(#Gadget_scroll,#Pb_ignore,#Pb_ignore,largeur-224,Hauteur-168)
mem_largeur=Largeur
mem_Hauteur=Hauteur
Endif
Until Event = #PB_Event_CloseWindow ; End of the event loop
End
;
Procedure Open_Window_0()
If OpenWindow(#Window_0, 363, 117, 1024, 768, "test", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar ) ; on ouvre une fenetre
ButtonGadget(#Button_0, 10, 680, 100, 30, "ok") ; voila le bouton
ScrollAreaGadget(#Gadget_scroll, 50, 50, 800, 600,1920,1080,1,#PB_ScrollArea_Flat) ; dans un scroll AREA
ContainerGadget(#Container,10,10,1920,1080,#PB_Container_Double) ; on met un container
OpenWindowedScreen(gadgetID(#Container), 1, 1, 1920, 1080, 0, 1, 1) ; et on creer un ecran graphique dedans
CloseGadgetList()
EndIf
EndProcedure
Code : Tout sélectionner
; Codé par Dobro
;Pb 5.70
;- Window Constants
;
EnableExplicit
Declare Open_Window_0()
Enumeration
#Window_0 ; numero de la fenetre
#Button_0 ; numero du bouton
#Gadget_scroll
#Container
EndEnumeration
Structure sprite
num.l ; numero du sprite
x.l ; la coordonée x du sprites
Y.l ; la coordonée y du sprites
coul.l ; la couleur du sprite
EndStructure
Global nombre_de_Sprite=200, i, largeur, hauteur
Global Dim sprite.sprite(nombre_de_Sprite)
InitSprite()
Open_Window_0() ; appel de la procedure qui ouvre la fenetre
; ****** creation des sprites *********
For i=1 To nombre_de_Sprite
With sprite(i)
\x = Random(1920)
\y = Random(1080)
\coul = RGB(Random(200)+50,Random(200)+50,Random(200)+50)
CreateSprite(i, 16, 16) ; creation d'une cellule vide (un sprite)
StartDrawing(SpriteOutput(i)) ; on va dessiner dans notre sprite un carre coloré
Box(0, 0, 16, 16, \coul) ; voila le dessin du carre vert dans notre sprite
StopDrawing()
DisplaySprite(i, \x, \y)
EndWith
Next i
FlipBuffers()
Repeat ; boucle principale , qui gere les affichages dans l'ecran graphique et les evenement de la fenetre
Select WaitWindowEvent(2)
Case #PB_Event_Gadget
Select EventGadget()
Case #Gadget_scroll
; debug GetGadgetAttribute(#Gadget_scroll, #PB_ScrollArea_X)
; debug GetGadgetAttribute(#Gadget_scroll, #PB_ScrollArea_Y)
Case #Button_0
Debug "appuis sur le bouton ok"
End
EndSelect
Case #PB_Event_SizeWindow
; Resize sans API
Largeur = WindowWidth(#Window_0, #PB_Window_InnerCoordinate)
Hauteur = WindowHeight(#Window_0, #PB_Window_InnerCoordinate)
ResizeGadget(#Button_0,#PB_Ignore,Hauteur-88,#PB_Ignore,#PB_Ignore)
ResizeGadget(#Gadget_scroll,#PB_Ignore,#PB_Ignore,largeur-224,Hauteur-168)
Case #PB_Event_CloseWindow
End
EndSelect
ForEver ; End of the event loop
Procedure Open_Window_0()
If OpenWindow(#Window_0, 363, 117, 1024, 768, "test", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar ) ; on ouvre une fenetre
ButtonGadget(#Button_0, 10, 680, 100, 30, "ok") ; voila le bouton
ScrollAreaGadget(#Gadget_scroll, 50, 50, 800, 600,1920,1080,1,#PB_ScrollArea_Flat) ; dans un scroll AREA
ContainerGadget(#Container,10,10,1920,1080,#PB_Container_Double) ; on met un container
OpenWindowedScreen(GadgetID(#Container), 1, 1, 1920, 1080, 0, 1, 1) ; et on creer un ecran graphique dedans
CloseGadgetList() ;Ferme le container
CloseGadgetList() ;Ferme le scrollGadget
EndIf
EndProcedure
il est pas bordelique !!falsam a écrit :Intéressant ton code Zorro ! Bordelique (le ton est juste moqueur hein ?) mais intéressant. Je jette un œil et je commente .....
Boude pas ton code est trés bien et je ne connaissais pas cette astuceZorro a écrit :pfff , allez , je retourne dans mon Blender
Attends, c'est pas fini...Falsam a écrit :Boude pas ton code est trés bien et je ne connaissais pas cette astuce
Code : Tout sélectionner
;***********************************************
;Titre :Fenetre_ecran_scroll2
;Auteur : Dobro
;Date :13/05/2019
;Heure :21:29:33
;Version Purebasic : PureBasic 5.70 LTS (Windows - x64)
;Version de l'editeur :EPB V2.68
; Libairies necessaire : Aucune
;***********************************************
;- Window Constants
;
Declare open_window_0()
Enumeration
#win ; numero de la fenetre
#sprite ; numero du sprite
#Button_0 ; numero du bouton
#Gadget_scroll
#Container
#sprite_curseur
#timer
EndEnumeration
Structure sprite
num.l ; numero du sprite
x.l ; la coordonée x du sprites
Y.l ; la coordonée y du sprites
sensx.l ; le sens du deplacement x du sprite
sensy.l ; le sens du deplacement y du sprite
coul.l ; la couleur du sprite
EndStructure
Global nombre_de_Sprite=1000
Global Dim sprite.sprite(nombre_de_Sprite)
Global offset_x , offset_y ; determine la decalage entre pointeur souris et curseur Graphique
For i=20 To nombre_de_Sprite
sprite(i)\x=Random(1920) +32; on donne une coordonée de depart au sprite
sprite(i)\Y=Random(1080)+32
de=Random(1)
If de=1
sprite(i)\sensx=1 ; on donne un sens de deplacement par defaut au sprite
sprite(i)\sensy=1 ; ce chiffre correspond a la vitesse de deplacement du sprite
Else
sprite(i)\sensx=-1 ; on donne un sens de deplacement par defaut au sprite
sprite(i)\sensy=1 ; ce chiffre correspond a la vitesse de deplacement du sprite
EndIf
sprite(i)\coul = RGB(Random(200)+50,Random(200)+50,Random(200)+50) ; attribut une couleur
Next i
;
InitSprite():initmouse()
Open_Window_0() ; appel de la procedure qui ouvre la fenetre
CreateSprite(#sprite_curseur,16,16)
StartDrawing(SpriteOutput(#sprite_curseur))
Box(0,0,16,16,$0000FF)
StopDrawing()
; ****** creation des sprites *********
For i=20 To nombre_de_Sprite
CreateSprite(i,16,16) ; creation d'une cellule vide (un sprite)
StartDrawing( SpriteOutput(i)) ; on va dessiner dans notre sprite un carre coloré
Box(1,1,16,16,sprite(i)\coul) ; voila le dessin du carre vert dans notre sprite
StopDrawing()
Next i
;**************************************
CreateSprite(300,32,32) ; creation d'une cellule vide (un sprite)
StartDrawing( SpriteOutput(300)) ; on va dessiner dans notre sprite un carre coloré
circle(1,1,16,rgb(0,255,0)) ; voila le dessin du carre vert dans notre sprite
StopDrawing()
;
;
Repeat ; boucle principale , qui gere les affichages dans l'ecran graphique et les evenement de la fenetre
ExamineMouse()
select WaitWindowEvent(50)
; ************************* Les Gadgets *******************************************************
Case #PB_Event_CloseWindow
End
Case #PB_Event_SizeWindow
Largeur = WindowWidth(#win, #PB_Window_InnerCoordinate)
Hauteur = WindowHeight(#win, #PB_Window_InnerCoordinate)
ResizeGadget(#Button_0,#Pb_ignore,Hauteur-88,#Pb_ignore,#Pb_ignore)
ResizeGadget(#Gadget_scroll,#Pb_ignore,#Pb_ignore,largeur-224,Hauteur-168)
Case #PB_Event_Timer
If EventTimer() = #timer
; ******************** Sprite en mouvement **************************
For i=20 to nombre_de_Sprite
sprite(i)\x=sprite(i)\x+sprite(i)\sensx
sprite(i)\y=sprite(i)\y+sprite(i)\sensy
if sprite(i)\x<=0 or sprite(i)\x>=1920
sprite(i)\sensx=-sprite(i)\sensx
Endif
if sprite(i)\y<=0 or sprite(i)\y>=1080
sprite(i)\sensy=-sprite(i)\sensy
Endif
DisplaySprite(i,sprite(i)\x,sprite(i)\Y) ; Affiche les Sprites
compteur=compteur+1
if compteur=10
compteur=1
;WindowEvent(); SI actif, on a le scroll fluide mais plus la reactivité du bouton !
Endif
Next i
; ce sprite indique la coordonée 1920x1080 pour repere(quart de rond Vert)
DisplaySprite(300,1920-32,1080-32)
FlipBuffers()
ClearScreen(0)
Endif
Case #PB_Event_Gadget
Select EventGadget()
Case #Button_0
Debug "appuis sur le bouton ok"
;End
EndSelect
EndSelect
;- *****************************************************************************************************
;- *************************** Gestion de la souris et de son Sprite *********************************************************
if WindowMouseX(#win)<gadgetWidth(#Gadget_scroll) and WindowMouseY(#win)<GadgetHeight(#Gadget_scroll) ; on est dans l'ecran ???
If WindowMouseX(#win)>GadgetX(#Gadget_scroll) and WindowMouseY(#win)>GadgetY(#Gadget_scroll) ; on est dans l'ecran !
; showcursor_(0) ; Dans l'ecran on affiche le Sprite et efface le curseur souris Windows (api window)
StartDrawing(WindowOutput(#win))
FrontColor(RGB(255,255,255))
DrawingMode(1)
DrawText(80,80,"Position de la souris = " + Str(WindowMouseX(#win)) + " / " + Str(WindowMouseY(#win)))
StopDrawing()
offset_x =GetGadgetAttribute(#Gadget_scroll, #PB_ScrollArea_X)
offset_Y=GetGadgetAttribute(#Gadget_scroll, #PB_ScrollArea_Y)
DisplaySprite(#sprite_curseur,WindowMouseX(#win)-70+offset_x ,WindowMouseY(#win)-70+offset_y) ; oui , alors on affiche le Sprite
Else ; non ! , donc on a quitté l'ecran (enfin.. on n'est plus dessus , car en mode fenetré on ne quitte jamais vraiment l'ecran.. puisqu'il est enfant d'une fenetre !!
; contrairement au mode Full Screen()
;showcursor_(1) ; hors de l'ecran on affice le curseur Souris window mais pas le sprite (api window)
Endif
EndIf
;- ***********************************************************************************************************************
Until Event = #PB_Event_CloseWindow ; End of the event loop
End
;
;- ******************** Zone des Procedures ********************************
Procedure Open_Window_0()
If OpenWindow(#win, 363, 117, 1024, 768, "test", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar ) ; on ouvre une fenetre
ButtonGadget(#Button_0, 10, 680, 100, 30, "ok") ; voila le bouton
AddWindowTimer(#win, #timer, 30)
ScrollAreaGadget(#Gadget_scroll, 50, 50, 800, 600,1920,1080,1,#PB_ScrollArea_Flat) ; dans un scroll AREA
ContainerGadget(#Container,10,10,1920,1080,#PB_Container_Double) ; on met un container
OpenWindowedScreen(gadgetID(#Container), 1, 1, 1920, 1080, 0, 1, 1) ; et on creer un ecran graphique dedans
CloseGadgetList()
CloseGadgetList()
EndIf
EndProcedure
; Epb
Il y a deux trucs qui me froissent là-dedans :Zorro a écrit :if WindowMouseX(#win)<gadgetWidth(#Gadget_scroll) and WindowMouseY(#win)<GadgetHeight(#Gadget_scroll) ; on est dans l'ecran ???
If WindowMouseX(#win)>GadgetX(#Gadget_scroll) and WindowMouseY(#win)>GadgetY(#Gadget_scroll) ; on est dans l'ecran !
;