Page 1 sur 2

Misery of space

Publié : jeu. 28/janv./2010 20:23
par venom
Bonsoir,

voilà je ne sais pas pourquoi mais depuis mardi je me suis amusé a programmer un menu de jeux 2d. Surement du en partie au tuto de Dobro :wink: .
Bref le nom ne casse pas trois pattes a un canard :) , mais bon c'est juste histoire de se faire la patte :wink: .

donc j'ai fait un menu plutôt basic, avec curseur de souris, musique de fond et décore etc...
voici le zip avec un exécutable et la source au cas ou sa peut servir a quelqu'un.

La question qui me viens a l'esprit maintenant c'est plus niveau organisation.
imaginons que je continue ce jeux shoot em up. Si l'utilisateur clique sur nouvelle partie ont lance donc le niveau 1 avec la vie afficher, le vaisseau afficher, musique, ennemis etc...

Mais c'est quoi le mieux pour afficher tout cela un nouveau code a part ou bien inclus dans le code du menu ? Car a la fin le code risque de devenir incompressible non ?

Comment procédez vous vous ?
en gros, avez vous un seul code de x lignes, ou un code pour chaque level ?

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 ?

Attention sa n'est pas dit qu'il y est une suite, mais merci de vos suggestions, critiques.








@++

Re: Misery of space

Publié : jeu. 28/janv./2010 21:48
par Cool Dji
Salut Venom,

Perso, pour Mad Fire, j'ai fait tout dans le même fichier mais à l'avenir je vais segmenter les différents levels dans des code séparés.
ça permet d'éclaircir le code et de pas se trimbaler un fichier de 10.000 lignes...surtout quand c'est le bordel !!!

Après, 10 fichiers de 1.000 lignes mal organisés peuvent être moins compréhensible qu'un fichier de 10.000 bien structuré :D

Bonne suite :wink:

Re: Misery of space

Publié : ven. 29/janv./2010 2:15
par Geo Trouvpatou
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.

Re: Misery of space

Publié : ven. 29/janv./2010 6:39
par venom
Salut Geo Trouvpatou,

merci de tes remarques.

Pour les structures, sa n'est pas de moi mais du tuto dans la section débutant :) [TUTO] Structures et Listes Chainées, un fond etoilé....

Pour le message d'erreur DirectX, en effet sans end sa ne sert pas a grand chose :oops:

Et pour EnableExplicit, je vais regarder a cela sur le forum et la Doc merci du tuyau :wink:
Geo Trouvpatou a écrit :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...
:? Pourtant elles s'affiche chez moi certes pas très forte mais sa fait toute la différence :lol:

merci a toi.


@Cool Dji
merci de ton conseille j'étais quasiment sur que ça serait mieux de séparer mais bon je préfère demander :wink: :)
mais pour ce faire, il faut utilisé la fonction IncludeBinary je suppose ?









@++

Re: Misery of space

Publié : ven. 29/janv./2010 14:44
par jbernard13
super ton menu , c'est toi qui dessiner le vaisseau?

Re: Misery of space

Publié : ven. 29/janv./2010 15:08
par venom
Salut jb13,

non sa n'est pas moi c'est Google :D :wink:
merci.






@++

Re: Misery of space

Publié : ven. 29/janv./2010 15:53
par Ar-S
Sympa ce petit menu, je grossirai un tantinet le curseur par contre (ou mieux, je l'animerai) pour qu'il "saute au yeux", car là j'ai mis 2,3 sec à le trouver

Re: Misery of space

Publié : ven. 29/janv./2010 17:58
par venom
Ar-S a écrit :Sympa ce petit menu, je grossirai un tantinet le curseur par contre (ou mieux, je l'animerai) pour qu'il "saute au yeux", car là j'ai mis 2,3 sec à le trouver
:lol: oui je sais je suis justement en train de voir pour le changer. Par contre comment faire pour que le curseur ne démarre pas a la position x=0, y=0 ?

et pour Cool Dji j'aurais aussi aimé savoir comment tu fait pour bouger ton texte comme cela dans Mad Fire car 5453 lignes j'ai du mal a trouvé :wink: :lol:









@++

Re: Misery of space

Publié : ven. 29/janv./2010 22:34
par Ar-S
venom a écrit : :lol: oui je sais je suis justement en train de voir pour le changer. Par contre comment faire pour que le curseur ne démarre pas a la position x=0, y=0 ?

Simplement en utilisant MouseLocate(x,y).

Une fois que t'as ouvert ta fenêtre, ajoute par exemple

Code : Tout sélectionner

MouseLocate(303, 368)
ça placera le curseur dans le réacteur de droite ^^

Re: Misery of space

Publié : ven. 29/janv./2010 22:46
par venom
Merci Ar-S,

la position est bien en plus :P :wink:







@++

Re: Misery of space

Publié : dim. 31/janv./2010 3:50
par Geo Trouvpatou
Pour te motiver un peu, voici un code de comtois.

Code : Tout sélectionner

;Initialise l'environnement nécessaire au fonctionnement des sprites et pour ouvrir un écran.
InitSprite()

;Initialise l'environnement propre à la gestion du clavier. 
InitKeyboard()

;Ouvre un nouvel écran avec les caractéristiques Largeur, Hauteur et Profondeur. 
OpenScreen(800,600,32,"Demo")

;Declare les Procedures
Declare AddTir(x.l,y.l)
Declare GestionTir()
Declare AddMeteorite()
Declare GestionMeteorite()
Declare AddEclats(id.l,x.l,y.l)
Declare GestionEclats()


;Sprites
;Nombre de météorites différentes
#MaxMeteorites=25

Enumeration 
	#Vaisseau
	#Tir
	#Meteorite
	#Eclats = #PB_Compiler_EnumerationValue + #MaxMeteorites
EndEnumeration

Structure s_Sprite
	id.l  ; No du sprite
	x.l
	y.l
	Vitesse.l
EndStructure

Structure s_particule Extends s_Sprite
 	dx.l
	dy.l
EndStructure 

Global NewList TirJoueur.s_Sprite()
Global NewList Meteorite.s_Sprite()
Global NewList Eclats.s_particule()

Global Vaisseau.s_Sprite, Meteorite.s_Sprite
  
;Sprite vaisseau
CreateSprite(#Vaisseau,32,32)

StartDrawing(SpriteOutput(#Vaisseau))
	Line(SpriteWidth(#Vaisseau)/2,0,SpriteWidth(#Vaisseau)/2,SpriteHeight(#Vaisseau),RGB(255,255,0))
	Line(SpriteWidth(#Vaisseau)/2,0,-SpriteWidth(#Vaisseau)/2,SpriteHeight(#Vaisseau),RGB(255,255,0))
	Line(0,SpriteHeight(#Vaisseau)-1,SpriteWidth(#Vaisseau),0,RGB(255,255,0))
	FillArea(SpriteWidth(#Vaisseau)/2,SpriteHeight(#Vaisseau)/2,RGB(255,255,0),RGB(255,155,0))
StopDrawing()

Vaisseau\x=400-SpriteWidth(#Vaisseau)/2 ; Centre le Vaisseau
Vaisseau\y=600-SpriteHeight(#Vaisseau)
Vaisseau\Vitesse=2   
   

;Sprite pour les tirs
CreateSprite(#Tir,3,3)
StartDrawing(SpriteOutput(#Tir))
	Box(0,0,3,3,RGB(255,55,55))
StopDrawing()  

;Sprite des météorites et des particules
For i=#Meteorite To #Meteorite+#MaxMeteorites
	Couleur=RGB(Random(255),Random(255),Random(255))
	Size=25+Random(25)
	CreateSprite(i,Size,Size)
	StartDrawing(SpriteOutput(i))
		Circle(SpriteWidth(i)/2,SpriteHeight(i)/2,(SpriteWidth(i)/2),Couleur)
    StopDrawing()  
    
    
	;Sprite des particules
	Size/2
	p=i+#MaxMeteorites+1
	CreateSprite(p,Size,Size)
	StartDrawing(SpriteOutput(p))
		DrawingMode(4)
		Circle(SpriteWidth(p)/2,SpriteHeight(p)/2,SpriteWidth(p)/2,Couleur)
    StopDrawing()  
Next i

Repeat
	;Inverse le buffer d'arrière plan avec le buffer visible à l'écran. 
    ;La partie invisible du buffer remplace alors complètement La partie visible. 
    FlipBuffers()
    
    ;Efface l'écran courant avec la couleur specifiée. 
    ClearScreen(RGB(0,0,30))
    
    ;Met à jour l'état du clavier.Cette fonction doit être appelée avant d'utiliser les commandes 
    ;KeyboardInkey(), KeyboardPushed() et KeyboardReleased(). 
    
    If ExamineKeyboard()
        If KeyboardPushed(#PB_Key_Left)
            Vaisseau\x - Vaisseau\Vitesse
            If Vaisseau\x <0
                Vaisseau\x=0
            EndIf
        ElseIf KeyboardPushed(#PB_Key_Right)
            Vaisseau\x + Vaisseau\Vitesse
            If Vaisseau\x > 800-SpriteWidth(#Vaisseau)
                Vaisseau\x=800-SpriteWidth(#Vaisseau)
            EndIf
        EndIf    
		If KeyboardPushed(#PB_Key_Space) And ElapsedMilliseconds()-DernierTir>100 ;Autorise un tir tous les 100 ms
			DernierTir=ElapsedMilliseconds()
			AddTir(Vaisseau\x+SpriteWidth(#Vaisseau)/2,Vaisseau\y)
        EndIf
    EndIf	
    
	AddMeteorite()
	GestionMeteorite()
	GestionTir()
    GestionEclats()
    DisplayTransparentSprite(#Vaisseau,Vaisseau\x,Vaisseau\y)
    
Until KeyboardPushed(#PB_Key_Escape)

Procedure AddTir(x.l,y.l)
    
	AddElement(TirJoueur())
    TirJoueur()\id = #Tir
    TirJoueur()\x=x
    TirJoueur()\y=y
    TirJoueur()\Vitesse=4 
    
EndProcedure

Procedure AddEclats(id.l,x.l,y.l)
    
	n=4+Random(5)                              ;Nombre d'éclats
	For i=1 To n
		AddElement(Eclats())                   ;Ajoute un éclat à la liste Eclats() 
		Eclats()\id=id+#MaxMeteorites+1        ;Détermine le sprite de l'éclat en fonction de la météorite touchée 
		Eclats()\x=x                           ;Position de départ d'un éclat 
		Eclats()\y=y
		While Eclats()\dx=0 Or Eclats()\dy=0  ;DX ou DY doivent être différents de zéro
		    Eclats()\dx=2-Random(4)            ;Pour éviter qu'un éclat reste sur place
		    Eclats()\dy=2-Random(4)
        Wend    
    Next i	
	
EndProcedure

Procedure  GestionEclats()
    
	ForEach Eclats()
        Eclats()\x+Eclats()\dx
        Eclats()\y+Eclats()\dy
        ;Si un éclat sort de l'écran , on le supprime
        If Eclats()\x>800 Or Eclats()\x<SpriteWidth(Eclats()\id) Or Eclats()\y>600 Or Eclats()\y<SpriteHeight(Eclats()\id)
            DeleteElement(Eclats())
            Continue
        EndIf
        DisplayTransparentSprite(Eclats()\id,Eclats()\x,Eclats()\y)
    Next
    
EndProcedure

Procedure GestionTir()
    
	ForEach TirJoueur()
        TirJoueur()\y - TirJoueur()\Vitesse
        DisplaySprite(TirJoueur()\id,TirJoueur()\x,TirJoueur()\y)
        ;Si le tir sort de l'écran on l'efface
        If TirJoueur()\y<0  
            DeleteElement(TirJoueur())
            Continue
        EndIf
        ;Test si un tir touche une météorite
        ForEach Meteorite()
            If SpritePixelCollision(TirJoueur()\id,TirJoueur()\x ,TirJoueur()\y,Meteorite()\id,Meteorite()\x,Meteorite()\y)
                DeleteElement(TirJoueur())
                AddEclats(Meteorite()\id,Meteorite()\x,Meteorite()\y)
                DeleteElement(Meteorite())
                Break 2
            EndIf	
        Next	
    Next
	
EndProcedure

Procedure  AddMeteorite()
    
	If CountList(Meteorite())<10
        AddElement(Meteorite())
        Meteorite()\id=#Meteorite+Random(#MaxMeteorites)
        Meteorite()\x=Random(800-SpriteWidth(#Meteorite))
        ;La météorite est créée en dehors de l'écran 
        Meteorite()\y=-Random(500)
        Meteorite()\Vitesse=1+Random(3)
    EndIf	
    
EndProcedure
Procedure GestionMeteorite()
    
	ForEach Meteorite()
		Meteorite()\y + Meteorite()\Vitesse
		;Si une météorite sort de l'écran , on la supprime
		If Meteorite()\y>600
			DeleteElement(Meteorite())
			Continue
        EndIf
		DisplayTransparentSprite(Meteorite()\id,Meteorite()\x,Meteorite()\y)
    Next
	
EndProcedure

Re: Misery of space

Publié : dim. 31/janv./2010 4:50
par venom
Merci Geo Trouvpatou,

cela va me permettre de voir au niveau des tirs :wink:






@++

Re: Misery of space

Publié : dim. 31/janv./2010 18:52
par venom
Bon j'y est regarder un petit peut, :) certes les procédures ne sont pas de moi ( merci all ) :wink:

Mais j'ai réussi a faire tirer un vaisseau qui lui ce déplace via la souris, donc tir avec le bouton gauche de souris :wink: .
plus ajout d'un son a chaque tir. Bref simple pour certain :lol: mais je vous présente la source ainsi qu'un exécutable tout près :D .

Misery of space lvl 1

Et la source direct:

Code : Tout sélectionner

InitSprite() 
InitKeyboard() 
InitMouse() 
InitSound() 
UseOGGSoundDecoder()

;Declare les Procedures
Declare AddTir(x.l,y.l)
Declare GestionTir()

;Constantes 
Enumeration
#Star
#Star2 
#mouse 
#menu_fond
#son_level_1
#Tir
#son_tir
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 de l'image de fond
LoadSprite(#menu_fond,"decor\fond1.bmp")

Structure Etoile 
	posx.f 
	posy.f 
	vitesse.f 
EndStructure 
Global NewList Stars.Etoile() 
Global NewList Stars2.Etoile() 
Global NewList Stars3.Etoile() 

Structure s_Sprite
		id.l  ; No du sprite
		x.l
		y.l
		Vitesse.l
EndStructure
Global NewList TirJoueur.s_Sprite()
Global Vaisseau.s_Sprite, Meteorite.s_Sprite

;- chargement curseur de la souris
LoadSprite(#mouse, "decor\vaisseau.bmp", 0)
MouseLocate(379, 540)

;- on lance le son ambiant
If LoadSound(#son_level_1, "sound\level1.ogg", #PB_Sound_Streaming)
		SoundVolume(#son_level_1, 70, 0)
			PlaySound(#son_level_1, #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 
EndProcedure 

;- on affiche les etoiles
For i  = 1 To 400 ;- nombre d'etoile afficher etoile 1er et 2eme plan
	AddElement(Stars()) 
	AddElement(Stars2()) 
	Stars()\posx = Random(800) 
	Stars()\posy = Random(600) 
	Stars()\vitesse = 3 ;- vitesse etoile premier plan
	Stars2()\posx = Random(800) 
	Stars2()\posy = Random(600) 
	Stars2()\vitesse = 1 ;- vitesse etoile second plan
Next  

;Sprite pour les tirs 
CreateSprite(#Tir,2,4)
StartDrawing(SpriteOutput(#Tir))
		Box(0,0,2,4,RGB(255,55,55))
StopDrawing()  

Repeat 
  FlipBuffers()
	ClearScreen(RGB(0,0,0)) 

;- position de l'image de fond
DisplayTransparentSprite(#menu_fond, 0, 0)
TransparentSpriteColor(#menu_fond, RGB(0, 0, 10))

;- déplacement et tir de la souris
	ExamineMouse()                   
		x = MouseX()              
		y = MouseY()               
	DisplayTransparentSprite(#mouse, x-SpriteWidth(#mouse)/2, 535)
	TransparentSpriteColor(#mouse, RGB(0, 0, 10)) 
	
	 If MouseButton(#PB_MouseButton_Left) And ElapsedMilliseconds()-DernierTir>100
		DernierTir=ElapsedMilliseconds()
		 AddTir(MouseX(),MouseY()-60)
		 
;- on lance le son tir
		  LoadSound(#son_tir, "sound\bip.ogg", 0)
		   SoundVolume(#son_tir, 70, 0)
			  PlaySound(#son_tir, 0)
	 EndIf

;- affichage des etoiles et tirs
    DisplayEtoile()
		GestionTir()

 ExamineKeyboard()
Until KeyboardPushed(#PB_Key_Escape)

Procedure AddTir(x.l,y.l)
		
		AddElement(TirJoueur())
		TirJoueur()\id = #Tir
		TirJoueur()\x=x
		TirJoueur()\y=540
		TirJoueur()\Vitesse=8 
		
EndProcedure

Procedure GestionTir()
		
		ForEach TirJoueur()
				TirJoueur()\y - TirJoueur()\Vitesse
				DisplaySprite(TirJoueur()\id,TirJoueur()\x,TirJoueur()\y)
				;Si le tir sort de l'écran on l'efface
				If TirJoueur()\y<0  
						DeleteElement(TirJoueur())
						Continue
				EndIf  
		Next
		
EndProcedure
Il me reste a voir comment coller le menu avec le code level 1 :D






@++

Re: Misery of space

Publié : dim. 31/janv./2010 21:38
par jbernard13
tu avais du bon boulot Venom , tu devrais faire de ton code un tuto ça serait bien .
je suis entrain d'etudier ton code ... :o

Re: Misery of space

Publié : dim. 31/janv./2010 22:00
par Cool Dji
Hello Venom,

Attention, je vais te révéler le secret de l'affichage des textes qui bougent...
Sur le principe, c'est assez simple :
J'affiche en sprite lettre par lettre un mot ou une expression. Pour chaque lettre/sprite je mets un petit random sur les X et Y => ça donne le petit effet de tremblotte. :D

Coté technique :
J'ai une image qui contient toutes les lettres d'une police de caractère
Tu peux la trouver dans le dossier MadFire

Code : Tout sélectionner

; Charge l'image qui contient toutes les lettres graphiques
LoadSprite(1,"Data\letter.bmp", #PB_Sprite_Memory )

Global String$ = " !'#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~é"
; Cette chaine indique l'ordre des lettres dans mon image
; pour faire simple, ici, tous les caractères ont la même taille
; mais on pourrait adapter le code pour avoir des caractères + ou - larges...




Declare AfficheTextcentre(TextMenu01$,y.i,fondu.i) 




; dans la boucle
If StartSpecialFX()

; affiche le mot score centré en X, position y=10, et en fondu 255
AfficheTextcentre("Score",10,255) 

StopSpecialFX()  
EndIf 




; La procédure
; Celle-ci compare chaque caractère de la chaine à afficher avec les caractères de l'image
; quand la caractere à afficher est trouvé
; un clipsprite selectionne la bonne lettre
; et le displaysprite affiche la lettre
; i correspond à la position de la lettre dans la chaine
; i*16 correspond à la position en x de la lettre sur l'écran
; le random(1) permet de faire tremblotter la lettre autour de la position x de la lettre
; y est entré dans l'appel de la procédure
; fondu est entré dans l'appel de la procédure
; la valeur 400 correspond à la moitié d'un écran de 800 pixels et centre le texte

; ya bien entendu moyen d'optimiser le code mais c'est pas un truc qui m'amuse ;)

Procedure AfficheTextcentre(Text$,y.i,fondu.i)
  For i=1 To Len(Text$)              ; regarde chaque lettre de la chaine (ici score)
   For j=1 To Len(String$)           ; cherche la position de la lettre de la chaine dans l'image
     If Mid(Text$,i,1)=Mid(String$,j,1) ; si on a trouvé
       ClipSprite(1,(j-1)*16,0,16,16)  ; selectionne la lettre
       
       DisplayTransparentSprite(1,i*16+Random(1)+400-Len(Text$)*8-16, y+Random(1))
       j=Len(String$) ; on sort de la boucle de recherche de la lettre dans l'image
     EndIf 
   Next
 Next

EndProcedure