Encore une fenetre mais.....

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
kelly
Messages : 176
Inscription : jeu. 09/sept./2004 16:15

Encore une fenetre mais.....

Message par kelly »

J'ai eu un apercu de ce qu'etait une fenetre graphique mais j'ai tout de suite remarqué quelque chose qui manquait : le pointeur de la souris.

Car voila ce que je veux faire : de vrai faux bouton delirants (style triangulaires ou autre) et que je pourrais cliquer et provoquant une vrai action comme sait le faire un bouton.

Alors, je cherche a savoir comment faire apparaitre le pointeur de la souris au dessus d'une fenetre graphique (c'est tout bete je parie) pour pouvoir l'utiliser en fonction de ses coordonnées.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

pour le bouton tu utilise un sprite , pour le pointeur de souris aussi !

les derniers sprites affichés passent au dessus des autres ! :D

un peut comme ça !!

l'exemple qui suit me servais pour tester une collision , mais im te montrera comment utiliser les sprites en meme temps ! :D

ps: clique sur le bouton de droite de la souris pour quitter !

Code : Tout sélectionner

; prg realisé par Dobro

#dobro=1
#Police=1
#sprite=1


Enumeration
        #sprite_cible
        #sprite_souris
        #sprite_text
        #sprite_cible3D
        #sprite_souris3D
EndEnumeration







Structure sprite
        x.w
        y.w  
EndStructure
Dim sprite.sprite(1)

Structure balle
        x.w
        y.w  
EndStructure
Dim balle.balle(1)



Dim ecran(640,400)
For x = 0 To 640 ; un écran de couleurs aléatoires
        For y = 0 To 400
                r=Random(255)
                g=Random(255)
                b=Random(255)
                c=RGB(r,g,b)
                ecran(x,y)= c
        Next y
Next x
; ***********************************
Resultat = InitSprite()
InitSprite3D()
FontID = LoadFont(#Police, "arial", 18, #PB_Font_Bold )
EcranX = GetSystemMetrics_(#SM_CXSCREEN):;=largeur de l'ecran
EcranY = GetSystemMetrics_(#SM_CYSCREEN):;=hauteur de l'ecran
        WindowID = OpenWindow(1, 0, 0, 800, 600,  #PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered , "hello") 
        
        WindowID = WindowID(1) 
        Result = OpenWindowedScreen(WindowID,0,0, 800, 600, 1, 0,0)
        
        
        CreateSprite( #sprite_cible, 64, 64,#PB_Sprite_Texture)  ; sprite exemple
        StartDrawing(SpriteOutput( #sprite_cible) ) ; on dessine dedans
        Box(0, 0, 64, 64, RGB($FF,$0,$80))
        StopDrawing() 
        CreateSprite3D(#sprite_cible3D,#sprite_cible)
        
        
        CreateSprite( #sprite_souris, 32, 32,#PB_Sprite_Texture)  ; sprite souris
        StartDrawing(SpriteOutput( #sprite_souris) ) ; on dessine dedans
        ;Box(0, 0, 64, 64,RGB($13,$F8,$7))
        Circle(16, 16, 16, RGB($13,$F8,$7)) 
        StopDrawing() 
        CreateSprite3D(#sprite_souris3D,#sprite_souris)
        
        CreateSprite(#sprite_text, 150,14)  ; le text
        StartDrawing(SpriteOutput(#sprite_text) ) ; on dessine dedans
        DrawText(bord$)
        StopDrawing() 
        
        
        balle(1)\x=WindowWidth()/2
        
        Resultat = InitMouse()  
        
        Repeat
                ExamineMouse() 
                Event=WindowEvent() 
                
                
                sprite(1)\x=WindowWidth()/2
                sprite(1)\y=WindowHeight()/2
                
               ;- ACTIVER CECI POUR VOIR LE BLEM !!
                ; ZoomSprite3D(#sprite_cible3D,200, 200) ; ACTIVER CECI POUR VOIRE LE PROBLEMME !!
                
                
                
                Start3D()
                DisplaySprite3D(#sprite_cible3D, sprite(1)\x, sprite(1)\y, 127)
                DisplaySprite3D(#sprite_souris3D, MouseX(),   MouseY(), 127) 
                Stop3D()
                
                
                DisplaySprite( #sprite_text,  10,  10)  
                If SpritePixelCollision(#sprite_cible, sprite(1)\x, sprite(1)\y, #sprite_souris, MouseX(),   MouseY())<>0 
                        bord$="touché !! "
                Else
                            bord$=" "
                EndIf
                
                        
                
                
                
                
                
                
                
                StartDrawing(SpriteOutput(#sprite_text) ) ; on dessine dedans
                DrawingMode(0)
                DrawText(bord$)
                DrawText("                              ")
                StopDrawing() 
                
                If MouseButton(2)
                        End 
                EndIf
                
                
                
                FlipBuffers():; affiche l'ecran
                ClearScreen(0, 0, 0) :;efface l'ecran
                
        Until Event=#PB_Event_CloseWindow 
        
        
        
        
        
        
        
        

kelly
Messages : 176
Inscription : jeu. 09/sept./2004 16:15

Message par kelly »

Ha ouai, ca marche mais, pour un utilisateur windows, il aimerait avoir le pointeur de windows. Mon souhait est donc d'avoir le vrai pointeur windows pouvant agir dans une fenetre.
Cela est il possible ?
kelly
Messages : 176
Inscription : jeu. 09/sept./2004 16:15

Message par kelly »

Ha bé tiens, exactement comme ca au niveau utilisation du pointeur de windows :

Code : Tout sélectionner

; Auteur : Le Soldat Inconnu 
; Version de PB : 3.90 
; 
; Explication du programme : 
; Donner à une fenêtre une forme spécifique. Par exemple faire une fenêtre ronde ou triangulaire. 


Enumeration 
  #Quitter 
  #Forme1 
  #Forme2 
  #Forme3 
  #Forme4 
  #Forme5 
EndEnumeration 



Procedure Forme() 
  If GetGadgetState(#Forme1) ; si on a choisi la forme 1 
    
    Region = CreateRoundRectRgn_(0, 0, WindowWidth(), WindowHeight(), 40, 60) ; Création de la région pour faire une fenêtre avec les angles arrondis 
    ; CreateRoundRectRgn_(X1, Y1, X2, Y2, R1, R2) 
    ; X1, Y1 : coordonné du point haut gauche de la region 
    ; X1, Y1 : coordonné du point haut gauche de la region 
    ; R1, R2 : rayon de l'ellipse qui va servir à arrondir les angles de la region 
    SetWindowRgn_(WindowID(), Region, #True) ; On applique la région 
    DeleteObject_(Region) ; On supprime la région 
    
  ElseIf GetGadgetState(#Forme2) ; si on a choisi la forme 2 
    
    Region = CreateEllipticRgn_(0, 0, WindowWidth(), WindowHeight()) ; Création de la région pour faire une fenêtre elliptique 
    ; CreateEllipticRgn_(X1, Y1, X2, Y2) 
    ; X1, Y1 : coordonné du point haut gauche de la region 
    ; X1, Y1 : coordonné du point haut gauche de la region 
    SetWindowRgn_(WindowID(), Region, #True) ; On applique la région 
    DeleteObject_(Region) ; On supprime la région 
    
  ElseIf GetGadgetState(#Forme3) ; si on a choisi la forme 3 
    
    Region = CreatePolygonRgn_(?Triangle, 4, #Alternate) ; Création de la région pour faire une fenêtre elliptique 
    ; CreateRoundRectRgn_(Array, NbPoints, Type) 
    ; Array : Adresse de la liste ou de la Data 
    ; NbPoints : Nombre de points du polygone + 1 (car on fait une boucle donc on a 2 fois le premier point) 
    ; Type : Voir msdn 
    SetWindowRgn_(WindowID(), Region, #True) ; On applique la région 
    DeleteObject_(Region) ; On supprime la région 
    
  ElseIf GetGadgetState(#Forme4) ; si on a choisi la forme 4 
    
    Region1 = CreateRectRgn_(0, 0, WindowWidth(), WindowHeight()) ; Création d'une région en rectangle 
    Region2 = CreateRectRgn_(10, 10, WindowWidth() - 10, 50) ; Création d'une région en rectangle 
    ; CreateRectRgn_(X1, Y1, X2, Y2) 
    ; X1, Y1 : coordonné du point haut gauche de la region 
    ; X1, Y1 : coordonné du point haut gauche de la region 
    CombineRgn_(Region1, Region1, Region2, #RGN_DIFF) ; On combine les 2 régions 
    ; Les modes suivants sont disponibles : 
    ; #RGN_AND : Intersection 
    ; #RGN_OR : Union 
    ; #RGN_DIFF : Différences 
    ; #RGN_XOR : Union moins les intersections 
    SetWindowRgn_(WindowID(), Region1, #True) ; On applique la région finale 
    DeleteObject_(Region1) ; On supprime les régions 
    DeleteObject_(Region2) 
    
  ElseIf GetGadgetState(#Forme5) ; si on a choisi la forme 5 
    
    Region1 = CreatePolygonRgn_(?Triangle, 4, #Alternate) 
    Region2 = CreateEllipticRgn_(0, 0, WindowWidth(), WindowHeight()) 
    CombineRgn_(Region1, Region1, Region2, #RGN_OR) ; On combine les 2 régions 
    SetWindowRgn_(WindowID(), Region1, #True) ; On applique la région finale 
    DeleteObject_(Region1) ; On supprime les régions 
    DeleteObject_(Region2) 
    
  EndIf 
EndProcedure 




; Création de la fenêtre et dela GadgetList 
If OpenWindow(0, 0, 0, 400, 400, #PB_Window_Borderless | #PB_Window_ScreenCentered, "Test") = 0 Or CreateGadgetList(WindowID(0)) = 0 
  End 
EndIf 

; Création des boutons et de l'option d'affichage 
ButtonGadget(#Quitter, 100, 100, 200, 20, "Quitter") 
OptionGadget(#Forme1, 100, 125, 200, 15, "Angles arrondis") 
OptionGadget(#Forme2, 100, 140, 200, 15, "Ronde") 
OptionGadget(#Forme3, 100, 155, 200, 15, "Triangle") 
OptionGadget(#Forme4, 100, 170, 200, 15, "Trouée") 
OptionGadget(#Forme5, 100, 185, 200, 15, "Triangle + Rond") 


Repeat 
  Event = WaitWindowEvent() 
  
  If Event = #PB_EventGadget 
    Select EventGadgetID() ; boutons, zone de texte, ... 
      Case #Quitter 
        Event = #PB_EventCloseWindow ; On quitte 
      Default 
        Forme() ; sinon, on change la forme de la fenêtre 
    EndSelect 
  EndIf 
  
Until Event = #PB_EventCloseWindow 

End 



DataSection 
  Triangle : 
    Data.l 200, 400, 0, 0, 400, 0, 200, 400 ; Coordonnées des points du triangle en x, y (il faut faire une boucle donc on revient au premier point du triangle 
EndDataSection
Mais, cette fenetre est elle graphique ??
kelly
Messages : 176
Inscription : jeu. 09/sept./2004 16:15

Message par kelly »

OULA, je viens de trouver mon bonheur je crois car dans l'exemple que je viens de coller, je reussi a faire des graphismes !!!!!!!
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

@ kelly :

tu deconne ou quoi ? 8O

ici: http://purebasic.hmt-forum.com/viewtopic.php?t=3278

je t'ai donné il n'y a pas longtemps , l'exemple du soldat inconnu
Modifié pour etre en fenetre Graphique avec un sprite qui se ballade dedans !

ça sert a quoi que je me decarcasse moi ? 8O :D
kelly
Messages : 176
Inscription : jeu. 09/sept./2004 16:15

Message par kelly »

ha ouai tiens !
mais bon ca s'explique car je suis nulle. Pour moi, un sprite, c'est pas un plot, d'où ma confusion

='( sauras tu un jour me pardonner ?
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

:lol:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

ha ouai tiens !
mais bon ca s'explique car je suis nulle. Pour moi, un sprite, c'est pas un plot, d'où ma confusion
c'est vrais !!
un sprite n'est pas un plot !!
mais il fonctionnent tout deux sur l'ecran graphique ! :D

un plot "allume" un pixel sur une surface graphique en purebasic ce peut etre
soit un ecran , soit un sprite, soit une image !!

alors q'un sprite est une cellule (un conteneur ) vide !!
il faut dessiner dedans (avec plot par exemple) ou box, circle , ect...
pour que l'on puisse le voir ! :D

ensuite ce conteneur (cellule) de dessin bref le sprite! , purebasic te
propose de le placer ou tu veux sur l'ecran graphique !
un sprite peut etre tout petit , ou etre de la taille de l'ecran graphique !
tu peut les superposer l'un sur l'autres
toutes les parties noire du sprite qui est dessus seront transparentes !
donc tu verra les sprites en dessous !!
tout les sprites peuvent avoir des parties noires transparentes !

et puis tu a la transparence tout court ! :D
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

pour l'histoire de souris, releasemouse ca marche pas ?

Dri
kelly
Messages : 176
Inscription : jeu. 09/sept./2004 16:15

Message par kelly »

je ne sais pas Dr.Dri, mais je prefere bosser sur une openwindows.
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

bah peut etre qu'en regardant ds l'aide ou qu'en essayant la fonction tu auras la réponse... je peux pas t'aider plus (ou du moins essayer)

Dri
Répondre