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.