Salut.
si non est ce que le début est bien programmer comme il faut ? ou me suis-je induit en erreur ?
et quand pensez vous ?
Voici ton code mais avec une seule et unique structure Etoile.
Pas la peine d'en avoir 3 puisque la structure est rigoureusement identique.
Il faut que tu vois Etoile comme ton TYPAGE personnalisé, comme le typage .i, .l, .f etc...
Donc tu créés ta structure Etoile.
Et ensuite tu créés tes variables (1 seule, 10, ou plus) avec ce typage.
Donc :
Stars.Etoile
Stars2.Etoile
Stars3.Etoile
Si les Stars avaient été des nombres tu aurais mis :
Stars.i
Stars2.i
Stars3.i
Voici le code modifié :
Code : Tout sélectionner
InitSprite()
InitKeyboard()
InitMouse()
InitSound()
UseOGGSoundDecoder()
;Constantes
Enumeration
#Star
#Star2
#Star3
#mouse
#son_menu
#menu_titre
#menu_new
#menu_new_r
#menu_option
#menu_option_r
#menu_credits
#menu_credits_r
#menu_quitter
#menu_quitter_r
EndEnumeration
;- Création de la fenêtre principale
MaFenetre = OpenScreen(800,600,32,"misery of space")
If MaFenetre = 0
MessageRequester("Erreur", "Impossible d'ouvrir une fenêtre DirectX", #PB_MessageRequester_Ok)
EndIf
;- Chargement des etoiles 1
LoadSprite(#Star, "decor/star.bmp")
;- Chargement des etoiles 2
LoadSprite(#Star2, "decor/star2.bmp")
;- Chargement des etoiles 3
LoadSprite(#Star3,"decor/star3.bmp")
Structure Etoile
posx.f
posy.f
vitesse.f
EndStructure
Global NewList Stars.Etoile()
Global NewList Stars2.Etoile()
Global NewList Stars3.Etoile()
;- Chargement des etoiles 2
; LoadSprite(#Star2, "decor/star2.bmp")
; Structure Etoile2
; posx.f
; posy.f
; vitesse.f
; EndStructure
; Global NewList Stars2.Etoile2()
;- Chargement des etoiles 3
; LoadSprite(#Star3,"decor/star3.bmp")
; Structure Etoile3
; posx.f
; posy.f
; vitesse.f
; EndStructure
; Global NewList Stars3.Etoile3()
;- chargement curseur de la souris
LoadSprite(#mouse, "decor/cursor.bmp", 0)
;- chargement du menu
LoadSprite(#menu_titre, "menu/menu_titre.bmp", 0)
LoadSprite(#menu_new, "menu/menu_new.bmp", 0)
LoadSprite(#menu_new_r, "menu/menu_new_r.bmp", 0)
LoadSprite(#menu_option, "menu/menu_option.bmp", 0)
LoadSprite(#menu_option_r, "menu/menu_option_r.bmp", 0)
LoadSprite(#menu_credits, "menu/menu_credits.bmp", 0)
LoadSprite(#menu_credits_r, "menu/menu_credits_r.bmp", 0)
LoadSprite(#menu_quitter, "menu/menu_quitter.bmp", 0)
LoadSprite(#menu_quitter_r, "menu/menu_quitter_r.bmp", 0)
;- on lance le son menu
If LoadSound(#son_menu, "sound/menu.ogg", #PB_Sound_Streaming)
SoundVolume(#son_menu, 50, 0)
PlaySound(#son_menu, #PB_Sound_Loop)
EndIf
;- on charge le deplacement et la position des etoiles
Procedure DisplayEtoile()
ResetList(Stars())
While NextElement(Stars())
If Stars()\posy > 600
Stars()\posy = -5
EndIf
DisplayTransparentSprite(#Star, Stars()\posx, Stars()\posy)
Stars()\posy + Stars()\vitesse
Wend
ResetList(Stars2())
While NextElement(Stars2())
If Stars2()\posy > 600
Stars2()\posy = -5
EndIf
DisplayTransparentSprite(#Star2, Stars2()\posx, Stars2()\posy)
Stars2()\posy + Stars2()\vitesse
Wend
ResetList(Stars3())
While NextElement(Stars3())
If Stars3()\posy > 600
Stars3()\posy = -5
EndIf
DisplayTransparentSprite(#Star3, Stars3()\posx, Stars3()\posy)
Stars3()\posy + Stars3()\vitesse
Wend
EndProcedure
;- on affiche les etoiles
For i = 1 To 400 ;- nombre d'etoile afficher etoile 1er et 2eme plan
AddElement(Stars())
AddElement(Stars2())
;AddElement(Stars3()) ; <===================================== //////////!!!!! Ca c'est en trop ;) !!!!!\\\\\\\\\\
Stars()\posx = Random(800)
Stars()\posy = Random(600)
Stars()\vitesse = 5 ;- vitesse etoile premier plan
Stars2()\posx = Random(800)
Stars2()\posy = Random(600)
Stars2()\vitesse = 2 ;- vitesse etoile second plan
Next
For i = 1 To 900 ;- nombre d'etoile afficher etoile 3eme plan
AddElement(Stars3())
Stars3()\posx = Random(800)
Stars3()\posy = Random(600)
Stars3()\vitesse = 1 ;- vitesse etoile troisieme plan
Next
Repeat
ClearScreen(RGB(0,0,0))
DisplayEtoile()
;- position des menu
DisplayTransparentSprite(#menu_titre, 60, 20)
TransparentSpriteColor(#menu_titre, RGB(0, 0, 10))
DisplayTransparentSprite(#menu_new, 280, 400)
TransparentSpriteColor(#menu_new, RGB(0, 0, 10))
DisplayTransparentSprite(#menu_option, 280, 450)
TransparentSpriteColor(#menu_option, RGB(0, 0, 10))
DisplayTransparentSprite(#menu_credits, 280, 500)
TransparentSpriteColor(#menu_credits, RGB(0, 0, 10))
DisplayTransparentSprite(#menu_quitter, 280, 550)
TransparentSpriteColor(#menu_quitter, RGB(0, 0, 10))
;- déplacement de la souris
ExamineMouse()
x = MouseX()
y = MouseY()
DisplayTransparentSprite(#mouse, x-SpriteWidth(#mouse)/2, y-SpriteHeight(#mouse)/2)
TransparentSpriteColor(#mouse, RGB(0, 0, 10))
;- le curseur passe ou clic sur un menu
If SpriteCollision(#mouse, x, y, #menu_new, 280, 400) = 1
DisplayTransparentSprite(#menu_new_r, 280, 400)
TransparentSpriteColor(#menu_new_r, RGB(0, 0, 10))
EndIf
If SpriteCollision(#mouse, x, y, #menu_option, 280, 450) = 1
DisplayTransparentSprite(#menu_option_r, 280, 450)
TransparentSpriteColor(#menu_option_r, RGB(0, 0, 10))
EndIf
If SpriteCollision(#mouse, x, y, #menu_credits, 280, 500) = 1
DisplayTransparentSprite(#menu_credits_r, 280, 500)
TransparentSpriteColor(#menu_credits_r, RGB(0, 0, 10))
EndIf
If SpriteCollision(#mouse, x, y, #menu_quitter, 280, 550) = 1
DisplayTransparentSprite(#menu_quitter_r, 280, 550)
TransparentSpriteColor(#menu_quitter_r, RGB(0, 0, 10))
If MouseButton(#PB_MouseButton_Left) = 0
ElseIf MouseButton(#PB_MouseButton_Left) = 1
End
EndIf
EndIf
ExamineKeyboard()
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
Sinon à la place de :
Code : Tout sélectionner
If MaFenetre = 0
MessageRequester("Erreur", "Impossible d'ouvrir une fenêtre DirectX", #PB_MessageRequester_Ok)
EndIf
Il faudrait peut-être mieux mettre :
Code : Tout sélectionner
If MaFenetre = 0
MessageRequester("Erreur", "Impossible d'ouvrir une fenêtre DirectX", #PB_MessageRequester_Ok)
End
EndIf
Comme ça si ta fenêtre est foireuse tu sors direct du programme après avoir fermé ton MessageRequester.
Alors que dans ton cas tu parcours quand même ton programme jusqu'au bout.
Sinon dans la plupart des codes que j'ai trouvé ici, la plupart des gens mettent la résolution écran sous forme de constante.
Parce que si tu décidais de passer ton code de 800x600 en 1024x768 tu devras chercher dans tout ton code, la valeur de 600 pour la modifier par 768, alors qu'avec une constante, tu ne modifies que celle-ci.
Prend l'habitude d'utiliser : EnableExplicit en début de code cela t'éviteras bien des problèmes dans le futur.
Tiens! j'ai cru qu'il y avait un bug dans ton code puisque seulement 2 niveaux d'étoiles sont visibles, mais cela vient tout simplement du fait que "star3.bmp" est noire, et forcément du noir sur du noir...
Sinon sympa ce petit menu réactif.
Bye.