Question sur les gadgets

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Joubarbe
Messages : 93
Inscription : sam. 01/juil./2006 16:40

Question sur les gadgets

Message par Joubarbe »

Bonjour,

J'avais commencé un mini-jeu avec des graphismes 2D mais je me rends vite compte que ce que je veux est avant tout développer le jeu en lui-même. Donc je me suis mis au "développement application" avec gadget et tout le traloupi ! Toutefois je rencontre divers problèmes, sur le code ci dessous par exemple, je me demande encore pourquoi quand je clique sur le bouton "quitter" ça ne quitte pas... A vous de voir :

Code : Tout sélectionner

;Chargement des medias
LoadFont(0,"Imperial",10,#PB_Font_Bold)

;Déclaration des constantes
Enumeration
;Fenêtres
  #fenetre_principale
  #fenetre_confirmationquit
;Gadgets
#gadget_frame0
#gadget_bouton_nouvelle_partie
#gadget_bouton_charger_partie
#gadget_bouton_options
#gadget_bouton_credits
#gadget_bouton_quitter
#gadget_bouton_quitterOui
#gadget_bouton_quitterNon
#gadget_text_title
EndEnumeration

;Déclaration des variables

;Déclaration des procédures

;Ouverture de la fenêtre principale et création des gadgets
If OpenWindow(#fenetre_principale, 100,100,1024,768,"Galactic Fantasy",#PB_Window_SystemMenu|#PB_Window_SizeGadget)
  If CreateGadgetList(WindowID(#fenetre_principale))
    Frame3DGadget(#gadget_frame0,150,15,850,740,"Frame0",#PB_Frame3D_Flat)
    ButtonGadget(#gadget_bouton_nouvelle_partie,15,150,100,20,"Nouvelle partie")
    ButtonGadget(#gadget_bouton_charger_partie,15,200,100,20,"Charger partie")
    ButtonGadget(#gadget_bouton_options,15,250,100,20,"Options")
    ButtonGadget(#gadget_bouton_credits,15,300,100,20,"Credits")
    ButtonGadget(#gadget_bouton_quitter,15,350,100,20,"Quitter")
    TextGadget(#gadget_text_title,15,15,120,30,"")
  EndIf
EndIf


;======================================
;INTERFACE
;======================================

;Titre en haut à gauche
SetGadgetFont(#gadget_text_title,FontID(0))
SetGadgetColor(#gadget_text_title,#PB_Gadget_FrontColor,RGB(59,77,123)) 
SetGadgetText(#gadget_text_title,"Galactic Fantasy")


;======================================
;BOUCLE PRINCIPALE
;======================================

Repeat
  
  Event = WaitWindowEvent()
  ;Conséquences pour chacun des boutons
  If Event = #PB_Event_Gadget
    Select EventGadget()
      Case #gadget_bouton_nouvelle_partie
        
      Case #gadget_bouton_charger_partie
        
      Case #gadget_bouton_options
        
      Case #gadget_bouton_credits
        
      Case #gadget_bouton_quitter
        OpenWindow(#fenetre_confirmationquit,1,1,300,80,"Êtes vous sûr ?",#PB_Window_WindowCentered,#fenetre_principale)
        CreateGadgetList(WindowID(#fenetre_confirmationquit))
        ButtonGadget(#gadget_bouton_quitterOui,65,30,40,20,"Oui")
        ButtonGadget(#gadget_bouton_quitterNon,210,30,40,20,"Non")
        Select EventGadget()
          Case #gadget_bouton_quitterNon
            CloseWindow(#fenetre_confirmationquit)
        EndSelect
    EndSelect
  EndIf


Until Event = #gadget_bouton_quitterOui


End
Merci
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message par Droopy »

Cela fonctionne en rajoutant une gestion des évènements pour la fenêtre de fermeture

Code : Tout sélectionner

;Chargement des medias 
LoadFont(0,"Imperial",10,#PB_Font_Bold) 

;Déclaration des constantes 
Enumeration 
  ;Fenêtres 
  #fenetre_principale 
  #fenetre_confirmationquit 
  ;Gadgets 
  #gadget_frame0 
  #gadget_bouton_nouvelle_partie 
  #gadget_bouton_charger_partie 
  #gadget_bouton_options 
  #gadget_bouton_credits 
  #gadget_bouton_quitter 
  #gadget_bouton_quitterOui 
  #gadget_bouton_quitterNon 
  #gadget_text_title 
EndEnumeration 

;Déclaration des variables 

;Déclaration des procédures 

;Ouverture de la fenêtre principale et création des gadgets 
If OpenWindow(#fenetre_principale, 100,100,1024,768,"Galactic Fantasy",#PB_Window_SystemMenu|#PB_Window_SizeGadget) 
  If CreateGadgetList(WindowID(#fenetre_principale)) 
    Frame3DGadget(#gadget_frame0,150,15,850,740,"Frame0",#PB_Frame3D_Flat) 
    ButtonGadget(#gadget_bouton_nouvelle_partie,15,150,100,20,"Nouvelle partie") 
    ButtonGadget(#gadget_bouton_charger_partie,15,200,100,20,"Charger partie") 
    ButtonGadget(#gadget_bouton_options,15,250,100,20,"Options") 
    ButtonGadget(#gadget_bouton_credits,15,300,100,20,"Credits") 
    ButtonGadget(#gadget_bouton_quitter,15,350,100,20,"Quitter") 
    TextGadget(#gadget_text_title,15,15,120,30,"") 
  EndIf 
EndIf 


;====================================== 
;INTERFACE 
;====================================== 

;Titre en haut à gauche 
SetGadgetFont(#gadget_text_title,FontID(0)) 
SetGadgetColor(#gadget_text_title,#PB_Gadget_FrontColor,RGB(59,77,123)) 
SetGadgetText(#gadget_text_title,"Galactic Fantasy") 


;====================================== 
;BOUCLE PRINCIPALE 
;====================================== 

Repeat 
  
  Event = WaitWindowEvent() 
  ;Conséquences pour chacun des boutons 
  If Event = #PB_Event_Gadget 
    Select EventGadget() 
      Case #gadget_bouton_nouvelle_partie 
        
      Case #gadget_bouton_charger_partie 
        
      Case #gadget_bouton_options 
        
      Case #gadget_bouton_credits 
        
      Case #gadget_bouton_quitter 
        OpenWindow(#fenetre_confirmationquit,1,1,300,80,"Êtes vous sûr ?",#PB_Window_WindowCentered,#fenetre_principale) 
        CreateGadgetList(WindowID(#fenetre_confirmationquit)) 
        ButtonGadget(#gadget_bouton_quitterOui,65,30,40,20,"Oui") 
        ButtonGadget(#gadget_bouton_quitterNon,210,30,40,20,"Non") 
        Repeat
          Event=WaitWindowEvent()
            Select EventGadget() 
              Case #gadget_bouton_quitterOui
                End
              Case #gadget_bouton_quitterNon
                CloseWindow(#fenetre_confirmationquit) 
                Break
            EndSelect
          ForEver 
    EndSelect 
  EndIf 
  
ForEver
Joubarbe
Messages : 93
Inscription : sam. 01/juil./2006 16:40

Message par Joubarbe »

Merci pour ton aide :)

Petite question en passant : je me rends compte que la ligne

Code : Tout sélectionner

If Event = #PB_Event_Gadget
ne modifie rien dans mon programme, je peux l'enlever sans soucis. Pourtant j'ai lu ça dans un tutoriel sans vraiment comprendre. A quoi sert cette ligne, est-elle essentielle en d'autres occasions ?
Merci
Joubarbe
Messages : 93
Inscription : sam. 01/juil./2006 16:40

Message par Joubarbe »

Une autre question qui doit, je pense toujours concerner les gadgets. Je souhaite faire 12 comboboxs avec 12 choix à l'intérieur.

J'ai bien fait ça copié collé 12 fois :

Code : Tout sélectionner

    AddGadgetItem(#Combo_adv11,0,"Peuple 1")
    AddGadgetItem(#Combo_adv11,0,"Peuple 2")
    AddGadgetItem(#Combo_adv11,0,"Peuple 3")
    AddGadgetItem(#Combo_adv11,0,"Peuple 4")
    AddGadgetItem(#Combo_adv11,0,"Peuple 5")
    AddGadgetItem(#Combo_adv11,0,"Peuple 6")
    AddGadgetItem(#Combo_adv11,0,"Peuple 7")
    AddGadgetItem(#Combo_adv11,0,"Peuple 8")
    AddGadgetItem(#Combo_adv11,0,"Peuple 9")
    AddGadgetItem(#Combo_adv11,0,"Peuple 10")
    AddGadgetItem(#Combo_adv11,0,"Peuple 11")
    AddGadgetItem(#Combo_adv11,0,"Peuple 12")
Mais je doute que ce soit la meilleure chose à faire :)

Avant ces quelques 150 lignes :

Code : Tout sélectionner

    ComboBoxGadget(#Combo_adv0, 750, 145, 180, 200)
    ComboBoxGadget(#Combo_adv1, 750, 175, 180, 200)
    ComboBoxGadget(#Combo_adv2, 750, 205, 180, 200)
    ComboBoxGadget(#Combo_adv3, 750, 235, 180, 200)
    ComboBoxGadget(#Combo_adv4, 750, 265, 180, 200)
    ComboBoxGadget(#Combo_adv5, 750, 295, 180, 200)
    ComboBoxGadget(#Combo_adv6, 750, 325, 180, 200)
    ComboBoxGadget(#Combo_adv7, 750, 355, 180, 200)
    ComboBoxGadget(#Combo_adv8, 750, 385, 180, 200)
    ComboBoxGadget(#Combo_adv9, 750, 415, 180, 200)
    ComboBoxGadget(#Combo_adv10, 750, 445, 180, 200)
    ComboBoxGadget(#Combo_adv11, 750, 475, 180, 200)
Peut-être que cela n'est pas bon non plus... Merci encore pour votre aide.
Anonyme

Message par Anonyme »

C'est vrai en trois lignes de code c'est fesable pour rajouté autant d'élément que tu veut.

Code : Tout sélectionner

For i = 1 to 500
AddGadgetItem(#Combo_adv11,0,"Peuple "+str(i) )
next i

Code : Tout sélectionner

If Event = #PB_Event_Gadget 
cela veut dire qu'il y a eu un événement sur un gadget, donc ensuite il faut traité l'évenement. c'est vrai que je ne l'utilise jamais non plus .
Anonyme

Message par Anonyme »

Ha oui, j'oubliais, si tu as différents gadget, pour évité de te taper 3xNb_combo en lignes, tu peut faire simplement avec 2 lignes suplémentaires :

Code : Tout sélectionner

For C = #Combo_0 to #Combo_10
 For i = 1 to 500 
  AddGadgetItem(C,"Peuple "+str(i) ) 
 next i 
Next C
Assure toi bien aussi , que les constantes qui commence à #Combo_0 et qui fini a #Combo_10 on des valeur contiguë, le top c'est de faire une enumeration comme ceci :

Code : Tout sélectionner

Enumeration
#Combo_0
#Combo_1
#Combo_2
#Combo_3
#Combo_4
...
Joubarbe
Messages : 93
Inscription : sam. 01/juil./2006 16:40

Message par Joubarbe »

Ah oui merci ! Je ne me souvenais plus que l'énumération attribuait des valeurs croissantes. Par contre, je suis en train de me rendre compte que l'on ne peut rien dessiner en "mode window" ?

J'aimerais un jeu où l'interface graphique serait vraiment accessoire, juste quelques petits points qui se déplacent en fonction des mouvements du joueur, des petits carrés, des petits ronds, pas de sprites... C'est possible ça ?

EDIT : Hmm, je ne comprends pas :

Code : Tout sélectionner

    For C = #Combo_adv0 To #Combo_adv11
      For p = 1 To 12
      For i = 1 To 12
        AddGadgetItem(C,p, "Peuple" + Str(i))
      Next i 
    Next p
  Next C
    
Ne fonctionne pas :(
Dernière modification par Joubarbe le sam. 22/juil./2006 23:03, modifié 1 fois.
Anonyme

Message par Anonyme »

Startdrawing(WindowOutput(#ID)) ? :wink:
Joubarbe
Messages : 93
Inscription : sam. 01/juil./2006 16:40

Message par Joubarbe »

Je profite encore de ce post car j'ai encore un problème concernant les gadgets. J'ai remarqué que l'ouverture des fenêtres (ou des gadgetlists je ne sais pas) foire une fois sur dix. Le programme ouvre bien une fenêtre mais elle freeze et obligé de la finir au ctrl alt suppr. Peut-être aurez vous une idée... :

Code : Tout sélectionner

;=======================================

Procedure GF_GameScreen()

;Chargement des médias


;Définitions des constantes
;Fenêtres
Enumeration
  #fenetre_gamescreen
EndEnumeration
;Gadgets
Enumeration
  ;menus
  #menu_main
  #menu_item_save
  #menu_item_backtomenu
  #menu_item_quit
  ;frames
  #frame_main
  ;boutons
  #bouton_statistiques
EndEnumeration

;Définitions des variables


;Fichiers inclus


;Déclaration des procédures




;===========================
;INTERFACE
;===========================

;Dessin de l'interface (une grande frame 850*740 à droite, un bouton écran à gauche et une frame information en bas)
If OpenWindow(#fenetre_gamescreen,1,1,1024,768,"Galactic Fantasy",#PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_SizeGadget)
  
  If CreateMenu(#menu_main,#fenetre_gamescreen)
  MenuTitle("Fichier")
  MenuItem(#menu_item_save,"Sauvegarder la partie")
  MenuItem(#menu_item_backtomenu,"Revenir au menu principal")
  MenuBar()
  MenuItem(#menu_item_quit,"Quitter la partie")
  EndIf
  
  If CreateGadgetList(WindowID(#fenetre_gamescreen))
  Frame3DGadget(#frame_main,150,15,850,740,"",#PB_Frame3D_Flat)
  ButtonGadget(#bouton_statistiques,15,15,40,30,"Statistiques")
  EndIf
  
EndIf

;Mise en place de l'interaction avec l'interface
Event = WaitWindowEvent()
Repeat
  If Event = #PB_Event_Gadget
    Select EventGadget()
      Case #menu_item_quit
        End
      Case #bouton_statistiques
    EndSelect
  EndIf
ForEver


EndProcedure
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Message par Jacobus »

Quelques rectifications apportées à ton code...

- 1/ CreateMenu(#menu_main,WindowID(#fenetre_gamescreen))
- 2/ la boucle Event (gadgets <> menus)
- 3/ Hors procedure c'est mieux, garde les procedure pour les routines.

Code : Tout sélectionner

;======================================= 
;Chargement des médias 


;Définitions des constantes 
;Fenêtres 
Enumeration 
  #fenetre_gamescreen 
EndEnumeration 
;Gadgets et menus
Enumeration
  ;menus 
  #menu_main 
  #menu_item_save 
  #menu_item_backtomenu 
  #menu_item_quit 
  ;frames 
  #frame_main 
  ;boutons 
  #bouton_statistiques 
EndEnumeration 

;Définitions des variables 


;Fichiers inclus 


;Déclaration des procédures 

;Procedure GF_GameScreen() 
;=========================== 
;INTERFACE 
;=========================== 

;Dessin de l'interface (une grande frame 850*740 à droite, un bouton écran à gauche et une frame information en bas) 
If OpenWindow(#fenetre_gamescreen,1,1,1024,768,"Galactic Fantasy",#PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_SizeGadget) 
  
  If CreateMenu(#menu_main,WindowID(#fenetre_gamescreen)) 
    MenuTitle("Fichier") 
    MenuItem(#menu_item_save,"Sauvegarder la partie") 
    MenuItem(#menu_item_backtomenu,"Revenir au menu principal") 
    MenuBar() 
    MenuItem(#menu_item_quit,"Quitter la partie") 
  EndIf 
  
  If CreateGadgetList(WindowID(#fenetre_gamescreen)) 
  Frame3DGadget(#frame_main,150,15,850,740,"",#PB_Frame3D_Flat) 
  ButtonGadget(#bouton_statistiques,15,15,40,30,"Statistiques") 
  EndIf 
  
EndIf 

;Mise en place de l'interaction avec l'interface 
;Tu dois gérer les gadgets et les menus différemment.
;Considère (façon de parler) qu'il doit y avoir une boucle pour les menus et une pour les gadgets
Repeat 
  Event = WaitWindowEvent()  
  Select Event
  ;- -----EVENT GADGETS
     Case #PB_Event_Gadget 
       Select EventGadget()
       
        Case #bouton_statistiques
       
       EndSelect 
  EndSelect        
  ;- -----EVENT MENUS
  Select Event
     Case #PB_Event_Menu
       Select EventMenu()
       
        Case #menu_item_quit 
           Event = #PB_Event_CloseWindow
      
       EndSelect 
  EndSelect  
Until Event = #PB_Event_CloseWindow
End   


;EndProcedure 
Compare les deux et tu devrais rapidement piger comment ça marche.
:wink: @+
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Joubarbe
Messages : 93
Inscription : sam. 01/juil./2006 16:40

Message par Joubarbe »

Alors j'ai fait tout comme il faut, mais ça ne marche toujours pas ; évolution tout de même, je vois le menu s'afficher, le bouton "statistiques", lui, non.

Je fais des procédures car c'est le seul moyen que j'ai trouvé pour appeler un fichier .pb externe. Mais je vais utiliser un gosub, ce sera peut être mieux.
Joubarbe
Messages : 93
Inscription : sam. 01/juil./2006 16:40

Message par Joubarbe »

Bon, cela fait plusieurs jours, je suis navré d'insister mais ce code ne fonctionne toujours pas (la fenêtre freeze), dites moi au moins si ça marche chez vous s'il vous plaît :oops:

Code : Tout sélectionner


Procedure GF_GameScreen()

;Chargement des médias


;Définitions des constantes
;Fenêtres
Enumeration
  #fenetre_gamescreen
EndEnumeration
;Gadgets
Enumeration
  ;menus
  #menu_main
  #menu_item_save
  #menu_item_backtomenu
  #menu_item_quit
  ;frames
  #frame_main
  ;boutons
  #bouton_statistiques
EndEnumeration

;Définitions des variables


;Fichiers inclus


;Déclaration des procédures




;===========================
;INTERFACE
;===========================

;Dessin de l'interface (une grande frame 850*740 à droite, un bouton écran à gauche et une frame information en bas)
If OpenWindow(#fenetre_gamescreen,1,1,1024,768,"Galactic Fantasy",#PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_SizeGadget)
  
  If CreateMenu(#menu_main,WindowID(#fenetre_gamescreen))
  MenuTitle("Fichier")
  MenuItem(#menu_item_save,"Sauvegarder la partie")
  MenuItem(#menu_item_backtomenu,"Revenir au menu principal")
  MenuBar()
  MenuItem(#menu_item_quit,"Quitter la partie")
  EndIf
  
  If CreateGadgetList(WindowID(#fenetre_gamescreen))
  Frame3DGadget(#frame_main,150,15,850,740,"",#PB_Frame3D_Flat)
  ButtonGadget(#bouton_statistiques,15,15,40,30,"Statistiques")
  EndIf
  
EndIf

;Mise en place de l'interaction avec l'interface
Event = WaitWindowEvent()
Repeat
  ;Gadgets
  Select Event
    Case #PB_Event_Gadget
      Select EventGadget()
        
        Case #bouton_statistiques
          Print("yo")
            
        EndSelect
    EndSelect
  ;Menus
    Select Event
      Case #PB_Event_Menu
        Select EventMenu()
          
          Case #menu_item_quit
            Event = #PB_Event_CloseWindow
            
        EndSelect
    EndSelect
        
  Until Event = #PB_Event_CloseWindow

  End
 
EndProcedure
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

Code : Tout sélectionner

Procedure GF_GameScreen() 
  
  ;Chargement des médias 
  
  
  ;Définitions des constantes 
  ;Fenêtres 
  Enumeration 
    #fenetre_gamescreen 
  EndEnumeration 
  ;Gadgets 
  Enumeration 
    ;menus 
    #menu_main 
    #menu_item_save 
    #menu_item_backtomenu 
    #menu_item_quit 
    ;frames 
    #frame_main 
    ;boutons 
    #bouton_statistiques 
  EndEnumeration 
  
  ;Définitions des variables 
  
  
  ;Fichiers inclus 
  
  
  ;Déclaration des procédures 
  
  
  
  
  ;=========================== 
  ;INTERFACE 
  ;=========================== 
  
  ;Dessin de l'interface (une grande frame 850*740 à droite, un bouton écran à gauche et une frame information en bas) 
  If OpenWindow(#fenetre_gamescreen,1,1,1024,768,"Galactic Fantasy",#PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_SizeGadget) 
    
    If CreateMenu(#menu_main,WindowID(#fenetre_gamescreen)) 
      MenuTitle("Fichier") 
      MenuItem(#menu_item_save,"Sauvegarder la partie") 
      MenuItem(#menu_item_backtomenu,"Revenir au menu principal") 
      MenuBar() 
      MenuItem(#menu_item_quit,"Quitter la partie") 
    EndIf 
    
    If CreateGadgetList(WindowID(#fenetre_gamescreen)) 
      Frame3DGadget(#frame_main,150,15,850,740,"",#PB_Frame3D_Flat) 
      ButtonGadget(#bouton_statistiques,15,15,40,30,"Statistiques") 
    EndIf 
    
  EndIf 
  
  ;Mise en place de l'interaction avec l'interface 
  Repeat 
    Event = WaitWindowEvent() 
    ;Gadgets 
    Select Event 
      Case #PB_Event_Gadget 
        Select EventGadget() 
          Case #bouton_statistiques 
            Print("yo") 
        EndSelect 
      Case #PB_Event_Menu 
        Select EventMenu() 
          Case #menu_item_quit 
            Event = #PB_Event_CloseWindow 
        EndSelect 
    EndSelect 
  Until Event = #PB_Event_CloseWindow 
  
  End 
  
EndProcedure

GF_GameScreen() 
Image
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

1/ Print("yo")

La console DOIT d'abord être initialisée avec OpenConsole()

2/ Event = WaitWindowEvent()

DOIT être dans la boucle Repeat/Until ou Repeat/Forever

3/ Ta boucle devrait toujours ressembler à çà :

Code : Tout sélectionner

  Repeat 
    Select WaitWindowEvent()
      Case #PB_Event_Gadget 
        Select EventGadget() 
        EndSelect 
      Case #PB_Event_Menu 
        Select EventMenu() 
        EndSelect 
      Case #PB_Event_CloseWindow 
        Break
    EndSelect 
  ForEver
4/ Les exemples fournit avec purebasic devraient pourtant t'aiguiller :?:


voilà, c'est pas si difficile :wink:
Image
Joubarbe
Messages : 93
Inscription : sam. 01/juil./2006 16:40

Message par Joubarbe »

Excuse moi monsieur je suis idddiiiiiioooottt :(

Non, plus sérieusement je m'attendais à un bug ou un problème plus sérieux. Je trouvais bien plus rationnel de déclarer la variable Event hors boucle puisqu' à quoi sert de déclarer en boucle une même variable ?
Répondre