[JEU] Menu, écran, boutons

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

[JEU] Menu, écran, boutons

Message par blendman »

salut les enfants.

Bon, voilà, je continue mes essais pour le jeu 3arks.
J'ai regardé l'exemple du Sokoban (http://www.purebasic.fr/french/viewtopi ... =2&t=10516). j'ai donc compris comment chargé différents niveaux.

Mais j'aurai aimé avoir quelques informations supplémentaires, si cela était possible :).

Dans cet exemple, lorsque le niveau est terminé, pour changer de niveau monsieur le développeur utilise :
- goto jeu (jeu étant un label)
- il incrémente une variable et relance la boucle avec cette nouvelle variable.

Je me demandai quelle était la méthode pour concevoir ceci :
- un premier écran (ou menu), comportant des boutons : nouveau jeu/charger jeu/crédits/quitter (par exemple)
- lorsque je clique sur le bouton "nouveau jeu", on lance le jeu, en enregistrant par exemple un fichier concernant les paramètres du joueur
- lorsque je clique sur le bouton "charger jeu", on charge le jeu que l'on a sauvegardé

En fait, ce que je recherche comme information, c'est plutôt la technique permettant d'avoir plusieurs écrans (intro, écran de choix, changement de map, etc..)

Visiblement une des techniques pour changer de maps est de faire un goto vers un label, mais comment fait-on pour concevoir différents écrans de jeux ? on crée plusieurs .pb avec à chaque fois des boucles principales et des goto vers ces fichiers pb ?

Si vous avez des idées sur la marche à suivre, cela m'intéresse.

Un grand merci d'avance à vous :).
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: [JEU] Menu, écran, boutons

Message par Cool Dji »

Salut,

J'utilise une technique assez simple, ye a surement d'autres.

Dans ma boucle principale, j'ai une variable (BootSystem) que j'ajuste selon l'écran.
1=MENU
2=GAME
3=EDITEUR

Sinon, tu peux jeter un oeil sur ça : ça se passe vers la ligne 612

http://xdji.free.fr/Telechargement/MadFire.zip


Code : Tout sélectionner

;-
;------           T H E   L O O P
;-
Repeat
    
   
    
    FlipBuffers() 
    If IsScreenActive() ; Check if is active or not (ALT+TAB symptom :)
  
  ExamineMouse()
    MouseDeltax = MouseX()
    MouseDeltay = MouseY()
    Mousebutton=0
    If MouseButton( #PB_MouseButton_Left) : Mousebutton=1 : EndIf

  
;-----  1) Gestion du clavier
    
    
    ExamineKeyboard()
    EscapeKey=0
    F1Key=0
    F2Key=0
    F3Key=0
    F4Key=0
    F5Key=0

    posplayerup=0
    posplayerdown=0
    posplayerright=0
    posplayerleft=0
    pushfire=0
    pushA=0
    pushB=0
    moinsKey=0
    plusKey=0
    
    If KeyboardReleased(#PB_Key_Escape) : EscapeKey =1 : EndIf

    If KeyboardPushed(#PB_Key_Up) : posplayerup=1 : EndIf
    If KeyboardPushed(#PB_Key_Down) : posplayerdown=1 : EndIf
    If KeyboardPushed(#PB_Key_Left) : posplayerleft=1 : EndIf
    If KeyboardPushed(#PB_Key_Right) : posplayerright=1 : EndIf
    If KeyboardPushed(#PB_Key_Space) : pushfire=1 : EndIf
    If KeyboardPushed(#PB_Key_A) :     pushA=1 : EndIf
    If KeyboardPushed(#PB_Key_B) :     pushB=1 : EndIf
    If KeyboardReleased(#PB_Key_F1) : F1Key=1 : EndIf
    If KeyboardReleased(#PB_Key_F2) : F2Key=1 : EndIf
    If KeyboardReleased(#PB_Key_F3) : F3Key=1 : EndIf
    If KeyboardReleased(#PB_Key_F4) : F4Key=1 : EndIf 
    If KeyboardReleased(#PB_Key_F5) : F5Key=1 : EndIf 
    If KeyboardReleased(#PB_Key_Subtract) : moinsKey=1 : EndIf 
    If KeyboardReleased(#PB_Key_Add) : plusKey=1 : EndIf 
  
  
;-----  2) Gestion du Joystick
    
    If NbJoysticks>0
      ExamineJoystick(0) 
  
      If JoystickAxisX(0)=-1  : posplayerleft=1 : EndIf
      If JoystickAxisX(0)=1   : posplayerright=1 : EndIf
      If JoystickAxisY(0)=-1  : posplayerup=1 : EndIf
      If JoystickAxisY(0)=1   : posplayerdown=1 : EndIf

      If JoystickButton(0,1) :  : pushfire=1 : EndIf
      If JoystickButton(0,2) :  : pushfire=1 : EndIf
      If JoystickButton(0,3) :  : pushfire=1 : EndIf
      If JoystickButton(0,4) :  : pushfire=1 : EndIf
      
      
    EndIf
    
;-----  3) va à Menu, à Game ou à Editeur
        
  
    If Bootsystem=1
     Menu()
    EndIf
  
    If Bootsystem=2
     Game()
    EndIf

    If Bootsystem=3
     Editeur()
    EndIf

    
EndIf ; IsScreenActive
Delay(1)
   
Until (EscapeKey=1) And (Bootsystem=1)
  
  
   
  
End   

;-Fin de la boucle principale
Only PureBasic makes it possible
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: [JEU] Menu, écran, boutons

Message par blendman »

Cool Dji a écrit :Salut,

J'utilise une technique assez simple, ye a surement d'autres.

Dans ma boucle principale, j'ai une variable (BootSystem) que j'ajuste selon l'écran.
1=MENU
2=GAME
3=EDITEUR
ok, je pensais utiliser une technique semblable aussi.
je l'avais déjà testé ton jeu, il est très sympa ;). C'est toi qui as réalisé les graphismes ? Parce qu'ils sont fort sympathiques aussi.

Sinon, tu peux jeter un oeil sur ça : ça se passe vers la ligne 612
je vais regarder ça, merci ;).
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: [JEU] Menu, écran, boutons

Message par Cool Dji »

Les graphismes sont à l'origine fait par les Bitmap Brothers (des demi-dieux dans le monde du jeu vidéo du millénaire précédent).

Je sais que tu as déjà testé MadFire, mais à l'époque tu n'avais pas encore de version commerciale de PB pouvant compiler.
La source est structurée de manière à rendre visible les procédures, variables...
De plus ya des exemples concret de lecture de fichiers :
Par exemple, les fichiers .mpx (dans le dossier level) contiennent les décors (un pour le décor de fond, l'autre pour le décor de premier plan).
Normalement, tu dois retrouver dans le code, les routines qui écrivent sur le disque ces fichiers (dans la partie Editeur)

Je pense que le code de MadFire contient une grande partie de ce que tu cherches même si les algo ou les techniques utilisées ne sont pas les plus optimisés.
Après, je sais que c'est très difficile de mettre le nez dans un code très long. Des petits codes sont beaucoup plus instructifs qu'un programme de 5000 lignes.
Only PureBasic makes it possible
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: [JEU] Menu, écran, boutons

Message par blendman »

Cool Dji a écrit :Les graphismes sont à l'origine fait par les Bitmap Brothers (des demi-dieux dans le monde du jeu vidéo du millénaire précédent).
effectivement, j'ai regardé des liens sur google :).
Et bien c'est sympa ce qu'ils ont fait.
Je sais que tu as déjà testé MadFire, mais à l'époque tu n'avais pas encore de version commerciale de PB pouvant compiler.
Exact :).Dis donc, tu suis ma vie de près on dirait :D lol

La source est structurée de manière à rendre visible les procédures, variables...
Je l'ai regardé et c'est très clair pour moi :).

De plus ya des exemples concret de lecture de fichiers :
Par exemple, les fichiers .mpx (dans le dossier level) contiennent les décors (un pour le décor de fond, l'autre pour le décor de premier plan).
Normalement, tu dois retrouver dans le code, les routines qui écrivent sur le disque ces fichiers (dans la partie Editeur)
je vais regarder ça avec une très très grande attention (encore une fois) ;).
Je pense que le code de MadFire contient une grande partie de ce que tu cherches même si les algo ou les techniques utilisées ne sont pas les plus optimisés.
carrément, je pense que c'est un code très précieux. Un grand merci à toi de le partager si gentiment !!
Après, je sais que c'est très difficile de mettre le nez dans un code très long. Des petits codes sont beaucoup plus instructifs qu'un programme de 5000 lignes.
Moi, ça ne me dérange pas.
En plus, s'il le faut, je peux le découper en plusieurs fichiers pour m'y retrouver ;).

Sinon, tu comptes faire d'autres jeux ou tu en as fait d'autres ?

Encore merci en tout cas :).
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: [JEU] Menu, écran, boutons

Message par Cool Dji »

Héhé,

Là, je suis passé à la 3D. C'était un défi personnel que je suis en passe de réaliser. :D
J'ai fait une première ébauche avec labyrinthe mais la technique utilisée est trop limitée.

En ce moment, je réalise un Map Editeur de décor 3D avec une automatisation de la construction des décors.
Je dois concilier structuration pour optimiser l'affichage, la gestion des collisions, la souplesse dans la diversité des différentes briques à utiliser pour construire les décors...
Pour l'instant, je n'ai pas encore d'interface graphique, je vais tester des outils existants pour trouver le bon compromis...

J'ai le projet de réaliser des jeux d'enquêtes scientifico-policière pour enfants. Mais globalement, cette insertion dans la 3D pourra me servir à d'autres projets...

En tout les cas, j'espère que tu pourras avancer comme tu veux :D
Only PureBasic makes it possible
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: [JEU] Menu, écran, boutons

Message par blendman »

Cool Dji a écrit :Là, je suis passé à la 3D. C'était un défi personnel que je suis en passe de réaliser. :D
J'ai fait une première ébauche avec labyrinthe mais la technique utilisée est trop limitée.

En ce moment, je réalise un Map Editeur de décor 3D avec une automatisation de la construction des décors.
Je dois concilier structuration pour optimiser l'affichage, la gestion des collisions, la souplesse dans la diversité des différentes briques à utiliser pour construire les décors...
Pour l'instant, je n'ai pas encore d'interface graphique, je vais tester des outils existants pour trouver le bon compromis...

J'ai le projet de réaliser des jeux d'enquêtes scientifico-policière pour enfants. Mais globalement, cette insertion dans la 3D pourra me servir à d'autres projets...
ok. ça peut être sympa ces enquête pour enfants :)
En tout les cas, j'espère que tu pourras avancer comme tu veux :D
je fais quelques essais, mais j'ai déjà un bug :p

voici le code (je suis parti d'un exemple de Dobro) :

Code : Tout sélectionner

;{
; code tiré d'un exemple de Dobro
; modifié par blendman pour tester les menus et les collisions

; pb : 4.51
; 03/2011
;}

;{ ************************enumeration ***********************

EnableExplicit

Enumeration
#window
#Police
#sprite 
#sprite1
EndEnumeration

Enumeration
#btn
#btnrol
EndEnumeration

;}


;{ ************************ variables ************************

Global vitesse= 3

;}


;{ ************************ Structures ************************

Structure s_block
  position.Point
  vitesse.i  
EndStructure

Global block.s_block
block\position\x = 15
block\position\y = 15



Structure s_bouton
  position.Point
  clic.i ;s'il est cliqué
  name.s  ; le nom du bouton > fera référence au menu
  type.i  ;le type du bouton (par exemple 1) pour les menus, 2) pour changer un paramètre, etc..
  spriteId.i ; le numéro du sprite
  texte.s ; le texte sur le bouton
  btn_width.i
  btn_height.i
EndStructure


Structure s_menu
  MenuType.i
  MenuText.s
  
  Array bouton.s_bouton(0) 
  
  EndStructure
  ;}
  
Define FontID.i, EcranX.i, EcranY.i, block_x.i, block_y.i, Event.i, i.i
Define *menu.s_menu

;{ ************************ declare ***************************

Declare evenementClavier()
Declare menuInit(*menu.s_menu)
Declare affichage(*menu.s_menu)
Declare menu_Event(*menu.s_menu)

;}


;{ ************************ inititialisation *****************

InitKeyboard () 
InitSprite()
InitSprite3D()

UsePNGImageDecoder()

;}


;{ ************************ open window *********************


FontID = LoadFont( #Police , "arial" , 18, #PB_Font_Bold )
EcranX = GetSystemMetrics_( #SM_CXSCREEN ): ;=largeur de l'ecran
EcranY = GetSystemMetrics_( #SM_CYSCREEN ): ;=hauteur de l'ecran
OpenWindow(#window, 0, 0,800, 600, "Menu et bouton" , #PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered )

OpenWindowedScreen( WindowID (#window),0,0, 800,600, 1, 0,0)

;}

;{ ************************ sprite et loading ***************


block_x = 350
block_y = 250

; LoadSprite(#sprite,"col.png",#PB_Sprite_AlphaBlending|#PB_Sprite_Texture)
; CreateSprite3D(#sprite,#sprite)
; 
; LoadSprite(#sprite1,"blockCollision.png",#PB_Sprite_AlphaBlending|#PB_Sprite_Texture)
; CreateSprite3D(#sprite1,#sprite1)

;on charge les boutons
LoadSprite(#btn,"btn.png",#PB_Sprite_AlphaBlending|#PB_Sprite_Texture)
CreateSprite3D(#btn,#btn)

LoadSprite(#btnrol,"btn_rol.png",#PB_Sprite_AlphaBlending|#PB_Sprite_Texture)
CreateSprite3D(#btnrol,#btnrol)

  
  ;}
  
  Define menu.s_menu
  menuInit(@menu)

;{ ************************ boucle principale ***************

Repeat
FlipBuffers ()
ClearScreen ( RGB (125,125,125)) 
Event= WindowEvent ()

ExamineKeyboard ()
evenementClavier()
menu_Event(@menu)

; If SpriteCollision(#sprite,block_x,block_y,#sprite1,block\position\x, block\position\y)
;    block\vitesse =-3
; Else
;    block\vitesse = 3
;  EndIf


affichage(@menu)



Until Event= #PB_Event_CloseWindow Or KeyboardPushed ( #PB_Key_Escape ) ; press touche droit
;}


Procedure evenementClavier()
    
  If KeyboardPushed ( #PB_Key_Up )  
block\position\y - block\vitesse
EndIf

If KeyboardPushed ( #PB_Key_Down )  
block\position\y + block\vitesse
EndIf

If KeyboardPushed ( #PB_Key_Left )  
block\position\x - block\vitesse
EndIf

If KeyboardPushed ( #PB_Key_Right ) 
block\position\x +block\vitesse
EndIf
  
EndProcedure

Procedure menuInit(*menu.s_menu)
  
  
  ReDim *menu\bouton(2)
  
  Define i.i
  
  For i =0 To 2
  
  With *menu\bouton(i)
    \spriteId = #btn      
    \btn_width = SpriteWidth(#btn)
    \btn_height = SpriteHeight(#btn)
    \position\x = 250
    \position\y = 200 + 100*i 
   EndWith
   
  Next i
   
  
  
EndProcedure

Procedure affichage(*menu.s_menu)
  Define i.i
  
  Start3D()
; DisplaySprite3D(#sprite1, block_x,block_y) 
; DisplaySprite3D(#sprite, block\position\x, block\position\y) 

For i =0 To 2
  With *menu\bouton(i)
    DisplaySprite3D(\spriteId, \position\x, \position\y) 
  EndWith
  
Next i
Stop3D()
  
  
EndProcedure



Procedure menu_Event(*menu.s_menu)
  Define i.i, MouseX.i, MouseY.i
  
  For i =0 To 2
  With *menu\bouton(i)
    If MouseX > \position\x And MouseX < \position\x +\btn_width And MouseY > \position\y  And MouseY < \position\y  + \btn_height
      \spriteId = #btnrol
    Else 
      \spriteId = #btn
    EndIf
  EndWith
  Next i
  
  EndProcedure
et les images :
http://blendman.free.fr/dev/pb/menu/btn.png
http://blendman.free.fr/dev/pb/menu/btn_rol.png

EDIT : j'ai réussi à corriger mon erreur, maintenant, je dois ajouter le fait que le bouton change si on passe la souris dessus, puis qu'on change de menu quand on a cliqué :).
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: [JEU] Menu, écran, boutons

Message par Cool Dji »

ok,

C'est étonnant que ça marche déjà pas le changement de sprite quand tu passes sur un bouton avec la souris.
Tu fais le test dans "menu_Event" et "\spriteId" se met bien à jour en fonction, non ?
Only PureBasic makes it possible
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: [JEU] Menu, écran, boutons

Message par blendman »

Cool Dji a écrit :C'est étonnant que ça marche déjà pas le changement de sprite quand tu passes sur un bouton avec la souris.
Tu fais le test dans "menu_Event" et "\spriteId" se met bien à jour en fonction, non ?
c'est bon, j'ai trouvé et j'ai ajouté d'autres options, pour avoir un joli exemple de menu avec bouton (ce n'est pas encore terminé).

j'avais oublié de mettre la procédure dans la boucle principale, donc, forcément ça ne marchait pas :)

voici le nouveau code :
EDIT :

j'ai ajouté le changement de "room (ou d'écran de jeu), et ça fonctionne sauf si je passe certaines procédures à l'intérieur d'autres procédures.

D'abord le code :

Code : Tout sélectionner

;{*************************** Infos **************************
; 
; code tiré d'un exemple de Dobro
; modifié par blendman pour tester les menus et les collisions
; Merci à Cool Dji
; code release mouse : netmaestro
;
; pb : 4.51
; 03/2011
;}

;{ ************************ enumeration ***********************

;EnableExplicit

Enumeration
#window
#Police
#sprite 
#sprite1
#curseur
EndEnumeration

Enumeration
#btn
#btnrol
EndEnumeration
#ScreenH = 600
#ScreenW = 800

;}


;{ ************************ variables ************************

Global inscreen = 1
Global EcrandeMenu = 1

ShowCursor_(1)

;}


;{ ************************ Structures ************************

Structure s_block
  position.Point
  vitesse.i  
EndStructure

Global block.s_block
block\position\x = 15
block\position\y = 15
block\vitesse = 3

Global block_x = 350
Global block_y = 250



Structure s_bouton
  position.Point
  clic.i ;s'il est cliqué
  name.s  ; le nom du bouton > fera référence au menu
  type.i  ;le type du bouton (par exemple 1) pour les menus, 2) pour changer un paramètre, etc..
  spriteId.i ; le numéro du sprite
  texte.s ; le texte sur le bouton
  btn_width.i
  btn_height.i
EndStructure


Structure s_menu
  MenuType.i
  MenuText.s
  
  Array bouton.s_bouton(0) 
  
  EndStructure
  ;}
  
  
 ;{*************************** Define **************************
 
  Define FontID.i, EcranX.i, EcranY.i, Event.i, i.i
  Define *menu.s_menu
  Define menu.s_menu
  
  ;}
  

;{ ************************ declare ***************************

Declare evenementClavier()
Declare menuInit(*menu.s_menu)
Declare affichage(*menu.s_menu)
Declare menu_Event(*menu.s_menu)
Declare gestion_souris()
Declare block_collision()

;pour les menus (uen room est un nouvel écran) :
Declare  Room_Menu()
Declare  Room_NewGame()
Declare  Room_LoadGame()
;}


;{ ************************ inititialisation *****************

InitKeyboard () 
InitSprite()
InitSprite3D()
InitMouse()

UsePNGImageDecoder()

;}


;{ ************************ open window *********************


FontID = LoadFont( #Police , "arial" , 18, #PB_Font_Bold )
EcranX = GetSystemMetrics_( #SM_CXSCREEN ): ;=largeur de l'ecran
EcranY = GetSystemMetrics_( #SM_CYSCREEN ): ;=hauteur de l'ecran
OpenWindow(#window, 0, 0,#ScreenW, #ScreenH, "Menu et bouton" , #PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered )

OpenWindowedScreen( WindowID (#window),0,0, 800,600, 1, 0,0)

;}

;{ ************************ sprite et loading ***************

LoadSprite(#sprite,"col.png",#PB_Sprite_AlphaBlending|#PB_Sprite_Texture)
CreateSprite3D(#sprite,#sprite)

LoadSprite(#sprite1,"blockCollision.png",#PB_Sprite_AlphaBlending|#PB_Sprite_Texture)
CreateSprite3D(#sprite1,#sprite1)

;on charge les boutons
LoadSprite(#btn,"btn.png",#PB_Sprite_AlphaBlending|#PB_Sprite_Texture)
CreateSprite3D(#btn,#btn)

LoadSprite(#btnrol,"btn_rol.png",#PB_Sprite_AlphaBlending|#PB_Sprite_Texture)
CreateSprite3D(#btnrol,#btnrol)

  
  ;}
  
  

;{ ************************ boucle principale ***************
menuInit(@menu)

Repeat
FlipBuffers ()
ClearScreen ( RGB (125,125,125)) 
Event= WindowEvent ()

ExamineKeyboard ()
ExamineMouse()
gestion_souris()

If EcrandeMenu =1
  ;Room_Menu()
  menu_Event(@menu)
  affichage(@menu)
ElseIf EcrandeMenu =2
  Room_NewGame()
  affichage(@menu)
  evenementClavier()
ElseIf EcrandeMenu =3
  Room_LoadGame()
  affichage(@menu)
  evenementClavier()
EndIf

  








Until Event= #PB_Event_CloseWindow Or KeyboardPushed ( #PB_Key_Escape )  Or EcrandeMenu =4
;}



Procedure menuInit(*menu.s_menu)

  ReDim *menu\bouton(2)
  
  Define i.i
  For i =0 To 2
  With *menu\bouton(i)
    \spriteId = #btn      
    \btn_width = SpriteWidth(#btn)
    \btn_height = SpriteHeight(#btn)
    \position\x = 250
    \position\y = 200 + 100*i 
   EndWith   
 Next i
 ;le texte pour les bouton
   *menu\bouton(0)\texte = "Nouvelle Partie"
   *menu\bouton(1)\texte = "Charger une partie"
   *menu\bouton(2)\texte = "Quitter"
  
EndProcedure


Procedure affichage(*menu.s_menu)
  Define i.i
  
  Start3D()
 
 If  EcrandeMenu = 2 Or EcrandeMenu = 3
   DisplaySprite3D(#sprite1, block_x,block_y) 
   DisplaySprite3D(#sprite, block\position\x, block\position\y) 
 Else
For i =0 To 2
  With *menu\bouton(i)
    DisplaySprite3D(\spriteId, \position\x, \position\y)
    StartDrawing(ScreenOutput())
    DrawingMode(#PB_2DDrawing_Transparent)
    DrawText(\position\x + \btn_width/2-50, \position\y + \btn_height/2-10, \texte)
    StopDrawing()
  EndWith
Next i
EndIf

Stop3D()


  
EndProcedure


Procedure menu_Event(*menu.s_menu)
  

  Define i.i, MouseX.i, MouseY.i
  
  For i =0 To 2
  With *menu\bouton(i)
    If MouseX() > \position\x And MouseX() < \position\x +\btn_width And MouseY() > \position\y  And MouseY() < \position\y  + \btn_height
      \spriteId = #btnrol
      If MouseButton(#PB_MouseButton_Left) = 1
        If \texte ="Nouvelle Partie"
          EcrandeMenu =2
        ElseIf \texte ="Charger une partie"
          EcrandeMenu = 3
        ElseIf \texte ="Quitter"
          EcrandeMenu = 4
        EndIf
      EndIf
      
    Else 
      \spriteId = #btn
    EndIf
  EndWith
Next i



  
EndProcedure


Procedure evenementClavier()
    
  If KeyboardPushed ( #PB_Key_Up )  
block\position\y - block\vitesse
EndIf

If KeyboardPushed ( #PB_Key_Down )  
block\position\y + block\vitesse
EndIf

If KeyboardPushed ( #PB_Key_Left )  
block\position\x - block\vitesse
EndIf

If KeyboardPushed ( #PB_Key_Right ) 
block\position\x +block\vitesse
EndIf
  
EndProcedure


Procedure gestion_souris()
  
  mx = WindowMouseX(#window):my = WindowMouseY(#window)

  If inscreen = 1
        If mx> #ScreenW-2 Or my> #ScreenH-2 Or mx<1 Or my<1
          inscreen = 0
          ReleaseMouse(1)             
        EndIf
           
  ElseIf mx <#ScreenW-1 And my < #ScreenH-1 And mx > 0 And my > 0 
      ReleaseMouse(0)
      MouseLocate(mx,my)
      inscreen = 1
  EndIf
   
    ;DisplaySprite(#curseur,MouseX(),MouseY() ); affichage du curseur de la souris, si on a changé le curseur 
EndProcedure


Procedure block_collision()
  
 ; If SpriteCollision(#sprite,block_x,block_y,#sprite1,block\position\x, block\position\y)
;    block\vitesse =-3
; Else
;    block\vitesse = 3
;  EndIf 
   
EndProcedure


;-****************** LES ROOMS (les différents écrans) ************************$

Procedure Room_Menu()
menu_Event(@menu)
affichage(@menu)
EndProcedure

Procedure Room_LoadGame()
evenementClavier() 
affichage(@menu)
EndProcedure

Procedure Room_NewGame()
evenementClavier() 
affichage(@menu) 
EndProcedure
Si dans ma boucle principale, je mets :

Code : Tout sélectionner

If EcrandeMenu =1
  Room_Menu()
ElseIf EcrandeMenu =2
  Room_NewGame()
ElseIf EcrandeMenu =3
  Room_LoadGame()
EndIf
au lieu de :

Code : Tout sélectionner

If EcrandeMenu =1
  ;Room_Menu()
  menu_Event(@menu)
  affichage(@menu)
ElseIf EcrandeMenu =2
  Room_NewGame()
  affichage(@menu)
  evenementClavier()
ElseIf EcrandeMenu =3
  Room_LoadGame()
  affichage(@menu)
  evenementClavier()
EndIf
et bien ça ne marche, et je ne sais pas trop pourquoi, cette fois-ci :p.

Si vous avez une idée.
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: [JEU] Menu, écran, boutons

Message par Cool Dji »

Chez moi, le texte n'est visible que sur le 1er bouton. Pourtant si tu n'affiches pas le bouton dans ta routine d'affichage, les textes apparaissent bien...

; DisplaySprite3D(\spriteId, \position\x, \position\y)

Je pense que ce bug vient de l'imbrication des StartDrawing dans des start3D de ta routine affichage.
Normalement, il faut déjà afficher tous tes StartDrawing puis tous tes start3D dans ta boucle principale

Code : Tout sélectionner

Repeat
    StartDrawing(ScreenOutput())
    StopDrawing()
 
   Start3D()
   Stop3D()
Until sortie
Only PureBasic makes it possible
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: [JEU] Menu, écran, boutons

Message par blendman »

Cool Dji a écrit :Chez moi, le texte n'est visible que sur le 1er bouton. Pourtant si tu n'affiches pas le bouton dans ta routine d'affichage, les textes apparaissent bien...

; DisplaySprite3D(\spriteId, \position\x, \position\y)

Je pense que ce bug vient de l'imbrication des StartDrawing dans des start3D de ta routine affichage.
Normalement, il faut déjà afficher tous tes StartDrawing puis tous tes start3D dans ta boucle principale

Code : Tout sélectionner

Repeat
    StartDrawing(ScreenOutput())
    StopDrawing()
 
   Start3D()
   Stop3D()
Until sortie
ok, j'ai changé ça.
Malheureusement, je n'ai toujours pas trouvé comment utilisé ma procédure avec une autre procédure ayant un pointeur :p.

c'est que ça devient compliqué lol
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: [JEU] Menu, écran, boutons

Message par Cool Dji »

Malheureusement, je n'ai toujours pas trouvé comment utilisé ma procédure avec une autre procédure ayant un pointeur :p.
Comprends pas ce que tu veux dire 8O :D
Only PureBasic makes it possible
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: [JEU] Menu, écran, boutons

Message par blendman »

Cool Dji a écrit :
Malheureusement, je n'ai toujours pas trouvé comment utilisé ma procédure avec une autre procédure ayant un pointeur :p.
Comprends pas ce que tu veux dire 8O :D
et bien que comme ça :

Code : Tout sélectionner

If EcrandeMenu =1
  Room_Menu()
ElseIf EcrandeMenu =2
  Room_NewGame()
ElseIf EcrandeMenu =3
  Room_LoadGame()
EndIf 
ça fonctionne :p

EDIT : c'est bon, j'ai réussi ;)

le code :

Code : Tout sélectionner

;{*************************** Infos **************************
; 
; code tiré d'un exemple de Dobro
; modifié par blendman pour tester les menus et les collisions
; Merci à Cool Dji
; code release mouse : netmaestro
;
; pb : 4.51
; 03/2011
;}

;{ ************************ enumeration ***********************

;EnableExplicit

Enumeration
#window
#Police
#sprite 
#sprite1
#curseur
EndEnumeration

Enumeration
#btn
#btnrol
EndEnumeration
#ScreenH = 600
#ScreenW = 800

;}


;{ ************************ variables ************************

Global vitesse= 3
Global inscreen = 1
Global EcrandeMenu = 1

ShowCursor_(1)

;}


;{ ************************ Structures ************************

Structure s_block
  position.Point
  vitesse.i  
EndStructure

Global block.s_block
block\position\x = 15
block\position\y = 15
block\vitesse = 3

Global block_x = 350
Global block_y = 250



Structure s_bouton
  position.Point
  clic.i ;s'il est cliqué
  name.s  ; le nom du bouton > fera référence au menu
  type.i  ;le type du bouton (par exemple 1) pour les menus, 2) pour changer un paramètre, etc..
  spriteId.i ; le numéro du sprite
  texte.s ; le texte sur le bouton
  btn_width.i
  btn_height.i
EndStructure


Structure s_menu
  MenuType.i
  MenuText.s
  
  Array bouton.s_bouton(0) 
  
  EndStructure
  ;}
  
  
 ;{*************************** Define **************************
 
  Define FontID.i, EcranX.i, EcranY.i, Event.i, i.i
  Define *menu.s_menu
  Define menu.s_menu
  
  ;}
  

;{ ************************ declare ***************************

Declare evenementClavier()
Declare menuInit(*menu.s_menu)
Declare affichage(*menu.s_menu)
Declare menu_Event(*menu.s_menu)
Declare gestion_souris()
Declare block_collision()

;pour les menus (uen room est un nouvel écran) :
Declare  Room_Menu(*menu.s_menu)
Declare  Room_NewGame()
Declare  Room_LoadGame()
;}


;{ ************************ inititialisation *****************

InitKeyboard () 
InitSprite()
InitSprite3D()
InitMouse()

UsePNGImageDecoder()

;}


;{ ************************ open window *********************


FontID = LoadFont( #Police , "arial" , 18, #PB_Font_Bold )
EcranX = GetSystemMetrics_( #SM_CXSCREEN ): ;=largeur de l'ecran
EcranY = GetSystemMetrics_( #SM_CYSCREEN ): ;=hauteur de l'ecran
OpenWindow(#window, 0, 0,#ScreenW, #ScreenH, "Menu et bouton" , #PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered )

OpenWindowedScreen( WindowID (#window),0,0, 800,600, 1, 0,0)

;}

;{ ************************ sprite et loading ***************

LoadSprite(#sprite,"col.png",#PB_Sprite_AlphaBlending|#PB_Sprite_Texture)
CreateSprite3D(#sprite,#sprite)

LoadSprite(#sprite1,"blockCollision.png",#PB_Sprite_AlphaBlending|#PB_Sprite_Texture)
CreateSprite3D(#sprite1,#sprite1)

;on charge les boutons
LoadSprite(#btn,"btn.png",#PB_Sprite_AlphaBlending|#PB_Sprite_Texture)
CreateSprite3D(#btn,#btn)

LoadSprite(#btnrol,"btn_rol.png",#PB_Sprite_AlphaBlending|#PB_Sprite_Texture)
CreateSprite3D(#btnrol,#btnrol)

  
  ;}
  
  

;{ ************************ boucle principale ***************
menuInit(@menu)

Repeat
FlipBuffers ()
ClearScreen ( RGB (125,125,125)) 
Event= WindowEvent ()

ExamineKeyboard ()
ExamineMouse()
gestion_souris()

If EcrandeMenu =1
  Room_Menu(@menu)
   ;menu_Event(@menu)
   ;affichage(@menu)
ElseIf EcrandeMenu =2
  Room_NewGame()
  affichage(@menu)
ElseIf EcrandeMenu =3
  Room_LoadGame()
  affichage(@menu)
EndIf

  








Until Event= #PB_Event_CloseWindow Or KeyboardPushed ( #PB_Key_Escape )  Or EcrandeMenu =4
;}



Procedure menuInit(*menu.s_menu)

  ReDim *menu\bouton(2)
  
  Define i.i
  For i =0 To 2
  With *menu\bouton(i)
    \spriteId = #btn      
    \btn_width = SpriteWidth(#btn)
    \btn_height = SpriteHeight(#btn)
    \position\x = 250
    \position\y = 200 + 100*i 
   EndWith   
 Next i
 ;le texte pour les bouton
   *menu\bouton(0)\texte = "Nouvelle Partie"
   *menu\bouton(1)\texte = "Charger une partie"
   *menu\bouton(2)\texte = "Quitter"
  
EndProcedure



Procedure menu_Event(*menu.s_menu)
  
Shared i
  ;Define i.i, 
  
  For i =0 To 2
  With *menu\bouton(i)
    If MouseX() > \position\x And MouseX() < \position\x +\btn_width And MouseY() > \position\y  And MouseY() < \position\y  + \btn_height
      \spriteId = #btnrol
      If MouseButton(#PB_MouseButton_Left) = 1
        If \texte ="Nouvelle Partie"
          EcrandeMenu =2
        ElseIf \texte ="Charger une partie"
          EcrandeMenu = 3
        ElseIf \texte ="Quitter"
          EcrandeMenu = 4
        EndIf
      EndIf
      
    Else 
      \spriteId = #btn
    EndIf
  EndWith
Next i

;ProcedureReturn

  
EndProcedure


Procedure affichage(*menu.s_menu)
  ;Define i.i
  Shared i
  
  
Start3D()
 If  EcrandeMenu = 2 Or EcrandeMenu = 3
   DisplaySprite3D(#sprite1, block_x,block_y) 
   DisplaySprite3D(#sprite, block\position\x, block\position\y) 
 Else
For i =0 To 2
  With *menu\bouton(i)
    DisplaySprite3D(\spriteId, \position\x, \position\y)
  EndWith
Next i

Stop3D()

For i =0 To 2
  With *menu\bouton(i)
    StartDrawing(ScreenOutput())
    DrawingMode(#PB_2DDrawing_Transparent)
    DrawText(\position\x + \btn_width/2-50, \position\y + \btn_height/2-10, \texte)
   StopDrawing()
  EndWith
  Next i
EndIf
ProcedureReturn
  
EndProcedure


Procedure evenementClavier()
    
  If KeyboardPushed ( #PB_Key_Up )  
block\position\y - block\vitesse
EndIf

If KeyboardPushed ( #PB_Key_Down )  
block\position\y + block\vitesse
EndIf

If KeyboardPushed ( #PB_Key_Left )  
block\position\x - block\vitesse
EndIf

If KeyboardPushed ( #PB_Key_Right ) 
block\position\x +block\vitesse
EndIf
  
EndProcedure


Procedure gestion_souris()
  
  mx = WindowMouseX(#window):my = WindowMouseY(#window)

  If inscreen = 1
        If mx> #ScreenW-2 Or my> #ScreenH-2 Or mx<1 Or my<1
          inscreen = 0
          ReleaseMouse(1)             
        EndIf
           
  ElseIf mx <#ScreenW-1 And my < #ScreenH-1 And mx > 0 And my > 0 
      ReleaseMouse(0)
      MouseLocate(mx,my)
      inscreen = 1
  EndIf
   
    ;DisplaySprite(#curseur,MouseX(),MouseY() ); affichage du curseur de la souris, si on a changé le curseur 
EndProcedure


Procedure block_collision()
  
  
 ; If SpriteCollision(#sprite,block_x,block_y,#sprite1,block\position\x, block\position\y)
;    block\vitesse =-3
; Else
;    block\vitesse = 3
;  EndIf 
  
  
EndProcedure




;-****************** LES ROOMS (les différents écrans) ************************$



Procedure Room_Menu(*menu.s_menu)

menu_Event(*menu)
affichage(*menu)
  

EndProcedure



Procedure Room_LoadGame()
 evenementClavier() 
 ;affichage(*menu) 
EndProcedure



Procedure Room_NewGame()
  evenementClavier()
  ;affichage(*menu)
  
EndProcedure
et voilà, il reste plus qu'à, libérer la mémoire pour les écrans inactifs :p
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: [JEU] Menu, écran, boutons

Message par Cool Dji »

Ah oui, ok, j'avais pas vu ta question posée précédemment...sur le pointeur dans la procédure.

Je sais pas :mrgreen:
Only PureBasic makes it possible
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: [JEU] Menu, écran, boutons

Message par blendman »

Cool Dji a écrit :Ah oui, ok, j'avais pas vu ta question posée précédemment...sur le pointeur dans la procédure.

Je sais pas :mrgreen:
c'est bon, j'ai réussi à comprendre et à corriger :mrgreen:

merci
Répondre