Garzul Invader the revenge ( remanié )

Programmation avancée de jeux en PureBasic
garzul
Messages : 683
Inscription : mer. 26/mai/2004 0:33

Garzul Invader the revenge ( remanié )

Message par garzul »

:D Bonjour depuis 2 jour je programmer un petit invader remanié de mon ancien invader ( sur mon site ) et donc la il y a plusieur ennemis et il et sans média :) , il utilisent les liste chainer pour les ennemis et les étoile , il contient une petite intro réaliser par mes soin , vous pouvez l'utiliser comme bon vous semble , je voudrai savoir si mon code et maintenant plus clair et mieux organiser ( c'est pour savoir si faut que je soigne mon code encore ) Merci à vous d'essayer ce jeux . PS : il reste beaucoup de chose à ameliorer . @++ ====> Code :

Code : Tout sélectionner

;/*********************************************
;/* \\ Garzul Invader remanier sans media //  *  
;/*       \\  Crée par Garzul | 2004  //      *  
;/* \\JaPBe > 2.4.7.17 || Purebasic > 3.91 // *  
;/*********************************************  


  #Ecran_Largeur = 600 ;Definie la largeur de l'écran 
  #Ecran_Hauteur = 600 ;Definie la hauteur de l'écran

;Enumeration des constant 
Enumeration

  #Etoile  ; Constante du sprite Etoile
  #Police  ; Constant de la Police
  #Ennemis ; Constant du sprite des Ennemis
  #Joueur  ; Constant du sprite Joueur
  #Tir     ; Constant du sprite Tir
 
EndEnumeration

;-Création des variable d'affichage de l'intro et des ennemis 

  Intro     = 0
  TexteX    = 110
  TexteY    = 300
  JoueurX   = 270
  JoueurY   = 570
  AffichTir = 1
  TirX      = 270
  TirY      = 570
  Score     = 0
  vie       = 3
  
;Variable global pour une utilisation dans les procédure 
Global Intro , TexteY , TexteX , RedText , GreenText , BlueText , Police , GreenText2 , BlueText2 , JoueurX , JoueurY , AffichTir , TirX , TirY , Score , vie
  
  
;chargement d'une police 
Police = LoadFont(#Police ,"Modern" ,8 ,#PB_Font_Italic) 


;- On crée la fenêtre.
If OpenWindow(0, 0, 0, #Ecran_Largeur, #Ecran_Hauteur, #PB_Window_BorderLess | #PB_Window_ScreenCentered, "Invader") = 0
  End
EndIf

;- On ouvre l'openscreen.

If InitSprite() = 0
  MessageRequester("Erreur", "Impossible d'initialiser la souris ,le clavier ou l'écran. Vérifiez la présence de DirectX 7 ou supérieur.", 0  | #MB_IconError)
  End
EndIf

If InitKeyboard() = 0
  MessageRequester("Erreur", "Impossible d'initialiser le clavier veuillez verifier si il est bien connecter à votre ordinateur.", 0 | #MB_IconError)
  End
EndIf

If OpenWindowedScreen(WindowID(), 0, 0, #Ecran_Largeur, #Ecran_Hauteur, 1, 0, 0) = 0
  MessageRequester("Erreur", "Impossible d'ouvrir l'écran.", 0  | #MB_IconError )
  End
EndIf


;Création du sprite Joueur
CreateSprite( #Joueur , 80 , 10 )

  StartDrawing(SpriteOutput(#Joueur))
  
    Box(0,0,80,10,RGB($78,$8D,$8D))
    
    For i = 0 To 200
    
      Plot(Random(80),Random(10),RGB($FB,$FF,$53))
      
    Next i
    
  StopDrawing()
  
  
  
;Création du sprite Tir
CreateSprite(#Tir , 20 , 20 )

  StartDrawing(SpriteOutput(#Tir))
  
    Circle(10,10,7,RGB($6B,$EA,$68))
    
    Box(4,5,12,10,RGB($EC,$6,$C))
    
  StopDrawing()  



;Création du sprite etoile
CreateSprite( #Etoile , 1 , 1 )

  StartDrawing(SpriteOutput(#Etoile))
  
    Plot(0,0,RGB($FF,$FF,$FF))
    
  StopDrawing()


;On crée la structure Etoile ainsi que la liste chainée stars
Structure Etoile

  x.l
  y.l
  Vitesse.l
  
EndStructure

NewList Stars.Etoile()
   
   
;Création des ennemis
CreateSprite(#Ennemis , 15,15)

  StartDrawing(SpriteOutput(#Ennemis))
  
    Box(0,0,15,15,RGB($1E,$12,$F3))
  
    Circle(3 , 3 , 4 , RGB($53,$AE,$B3))
    Circle(12 , 3 , 4 , RGB($53,$AE,$B3))
    
    Box(3 , 11 , 9 , 3 , RGB($FF,$6,$D))
  
  StopDrawing()
  
  
Structure Ennemis

  x.l
  y.l
  Vitesse.l
  
EndStructure

NewList Ennemi.Ennemis()


     ;On crée une procedure affichage pour l'etoile
  Procedure Affichage() 
  
     ResetList(Stars())
     
     While NextElement(Stars())
     
         If Stars()\y > 600
       
            Stars()\y = -5
          
         EndIf
       
       DisplayTransparentSprite( #Etoile , Stars()\x , Stars()\y )
       TransparentSpriteColor(#Etoile,0,0,0)
       
       Stars()\y + Stars()\Vitesse 
     
     Wend
     
   EndProcedure
   
   
   For i = 0 To 300
   
     AddElement(Stars())
     
     Stars()\x = Random(600) 
     Stars()\y = Random(600)
     Stars()\Vitesse = 1
     
   Next i
  

  Procedure AffichageEnnemis()
  
         ResetList(Ennemi())
     
     While NextElement(Ennemi())
     
 
         If Ennemi()\y > 600
       
            Ennemi()\y = -5
          
         EndIf
       
       DisplayTransparentSprite( #Ennemis , Ennemi()\x ,  Ennemi()\y )
       TransparentSpriteColor(#Ennemis,0,0,0)
       
       Ennemi()\y + Ennemi()\Vitesse 
     
     Wend
     
   EndProcedure
   
   
   For i = 0 To 50
   
     AddElement(Ennemi())
     
     Ennemi()\x = Random(600) 
     Ennemi()\y = Random(600) + -650
     Ennemi()\Vitesse = 2
 
   Next i



  
;-Procedure d'intro
  Procedure Intro()
    
      RedText + 2
      
      If RedText > 255 
      
         RedText = 255
         
      EndIf
    
      If RedText    = 255
      
         GreenText2 = 255
         
      EndIf
      
    StartDrawing(ScreenOutput())
       
       For i = 0 To 601 Step 5
         For e = 0 To 600 Step 10
           Plot(i , e , RGB( $1E , $23 , $E8 ))
         Next e
       Next i
       
       
       FrontColor( RedText , GreenText , BlueText )
       DrawingMode(1)
       Locate( TexteX, TexteY )
       DrawText(" GARZUL INVADER THE REVENGE ( Les pygméin attaque ) ")
       
       FrontColor( RedText , GreenText2 , BlueText2 )
       DrawingMode(1)
       Locate( 200 , 350 )
       DrawText(" Appuyer sur entrer pour jouer ")
       
       DrawingFont(Police)
       FrontColor( 0 , 255 , 0 )
       DrawingMode(1)
       Locate( 530 , 580 )
       DrawText(" Garzul | 2004 ")
       
       
    StopDrawing()
    
    ExamineKeyboard()
      If KeyboardPushed(#PB_Key_Return)
      
         Intro = 1
         
      EndIf
     
  EndProcedure
  
;-Procedure du joueur 
  Procedure Joueur()

    DisplayTransparentSprite(#Joueur , JoueurX , JoueurY)
    TransparentSpriteColor(#Joueur,0,0,0)
    
    ;On crée les deplacement
    If KeyboardPushed(#PB_Key_Right)
    
       JoueurX + 5
       
    EndIf
    
    If KeyboardPushed(#PB_Key_Left)
    
       JoueurX - 5
       
    EndIf

    ;On crée vite les test de collision des bord
    If JoueurX > 600 : JoueurX = 600 : EndIf
    If JoueurX < 0   : JoueurX = 0   : EndIf
    
  EndProcedure
  
  
  ;-Tir du joueur
  Procedure Tir()
  
    If  AffichTir = 1 And KeyboardPushed(#PB_Key_Space)
    
       TirX = JoueurX + 35
       AffichTir      = 0
       
    EndIf
     
  EndProcedure



;-Affichage des tir
  Procedure AffichageTir()
  
    If AffichTir = 0
       
 
       DisplayTransparentSprite(#Tir,TirX,TirY)
       TransparentSpriteColor(#Tir,0,0,0)
       
       TirY - 5
       
         If TirY < 0
       
            AffichTir = 1
            TirY      = 570
            
         EndIf 
         
    EndIf

  EndProcedure
   

;-Collision
  Procedure Collision()
  
    ForEach Ennemi()
    
      If SpriteCollision(#Ennemis,Ennemi()\x,Ennemi()\y,#Joueur,JoueurX,JoueurY)

         vie - 1
         
         DeleteElement(Ennemi())
         
         AddElement(Ennemi())
    
         Ennemi()\x = Random(600)
         Ennemi()\y = Random(600) + -650
         Ennemi()\Vitesse = 2

    Break
    
      EndIf
      
    Next 
  
  
    ForEach Ennemi()
    
      If SpriteCollision(#Ennemis,Ennemi()\x,Ennemi()\y,#Tir,TirX,TirY)

         Score     + 2
         DeleteElement(Ennemi())
         
   
           For i = 0 To 5
         
             AddElement(Ennemi())
    
             Ennemi()\x = Random(600)
             Ennemi()\y = Random(600) + -650
             Ennemi()\Vitesse = 4
           
           Next

         TirY      = 570
         AffichTir = 1

    Break
    
      EndIf
      
    Next 
    
    If vie < 0 
    
       MessageRequester("DEAD","You are dead",0 | #MB_IconInformation)
       vie   = 3
       Score = 0
       
    EndIf
    
    
  EndProcedure
  
  
;-Affichage du score et de la vie 
  Procedure ScoreVie()
  
    StartDrawing(ScreenOutput())
       
      FrontColor( 200 , 100 , 100 )
      DrawingMode(1)
      Locate( 0 , 20 )
      DrawText(" Score = " + Str(Score))
      
      Locate( 0 , 35 )
      DrawText(" Vie    = " + Str(vie))
      
    StopDrawing()
  
  EndProcedure
  
  
;*______________________________________*__**__*__**__*__**__*___________________________________________*
;/****************************************  //\\ BOUCLE //\\  *********************************************
;/****************************************  \\//*||**||*\\//  *********************************************
;*______________________________________*__**__*__**__*__**__*___________________________________________*
Repeat

  Event = WindowEvent()
  Delay(5)


   ;Affichage du jeux
   If Intro = 1
   
      Affichage()
      AffichageEnnemis()
      Joueur()
      Tir()
      AffichageTir()
      Collision()
      ScoreVie()
      
   EndIf
   
   
   ;Affichage de l'intro 
   If Intro = 0
   
      Intro()
      
   EndIf

 
    ;-FPS
    #DefinitionFPS = 20
    cpt + 1
    If cpt = #DefinitionFPS
      cpt = 0
      fps.f = #DefinitionFPS * 1000 / (ElapsedMilliseconds() - Temps)
      Temps = ElapsedMilliseconds()
    EndIf
    
    
    StartDrawing(ScreenOutput())
    
          FrontColor( 0 , 100 , 255 )
          DrawingMode(1)
          Locate(0, 5)
          DrawText("FPS = " + StrF(fps, 1))
          
    StopDrawing()
    
    
  FlipBuffers() ;Inversion des deux buffer 
  ClearScreen( 0 , 0 , 0 )
    
    If IsScreenActive() = 0
      End
    EndIf
    
;Fin du programme si appuyer sur echap .    
  ExamineKeyboard()
Until Event = #PB_Event_CloseWindow Or KeyboardPushed(#PB_Key_Escape)
Dernière modification par garzul le mer. 27/oct./2004 14:33, modifié 4 fois.
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

l'organisation du code est bien :D
l'orthographe n'a pas changé :lol:
Vous avez était tuer
Sinon, il y a un prob au niveau des collision comme tu le dis
regarde donc le nom de tes sprites au niveau des collisions

c'est Ennemi() alors que c'est une liste chainé avec une structure :roll: avec un debug, on le voit de suite.

il faut mettre ceci ;)

Code : Tout sélectionner

SpriteCollision(#Ennemis, Ennemi()\x, Ennemi()\y, #Joueur, JoueurX, JoueurY)
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
garzul
Messages : 683
Inscription : mer. 26/mai/2004 0:33

Message par garzul »

Effectivement LSI , je l'ai coder à l'arrache tout sa donc il y a peuyt être des truc qui m'ont echaper :D
garzul
Messages : 683
Inscription : mer. 26/mai/2004 0:33

Message par garzul »

Au lieu de vous avez était tuer j'ai mis YOU ARE DEAD sa va comme sa :D
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

garzul a écrit :Au lieu de vous avez était tuer j'ai mis YOU ARE DEAD sa va comme sa :D
Ah oui, c'est nettement mieux!

Tu peux aussi le dire en Klingon, comme ça, tu seras sûr de ne faire aucune faute dans une langue terrienne :lol:

T'est gonflé, quand même!
Garzul, si t'existait pas, faudrait absolument t'inventer :lol:
garzul
Messages : 683
Inscription : mer. 26/mai/2004 0:33

Message par garzul »

:lol: Hé au niveau du jeux ? ( Bah quoi au moin comme sa je fais plus de faute et les anglais pourront jouer à mon jeux :D
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

J'ai testé.

Bon, c'est pas mal, mais il faudrait revoir un peu tes ennemis, parce que chez moi, une fois que tu as tué quelques ennemis au début, ça fait comme un couloir vers le milieu de l'écran.
Une fois que tu est dedans, plus la peine de tirer, les ennemis passent de chaque côté sans te toucher.

Quand on regarde bien la disposition des ennemis une fois qu'on est dans le couloir, on voit qu'elle ne change pas. C'est toujours la même disposition qui se répète.
garzul
Messages : 683
Inscription : mer. 26/mai/2004 0:33

Message par garzul »

Ok vais voir sa et les autre que pensez - vous de mon jeux ?
garzul
Messages : 683
Inscription : mer. 26/mai/2004 0:33

Message par garzul »

Donc j'ai modifier chris il et un peu plus dur qu'avant mais au moin les ennemis sont bien répartit :D
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Toujours pareil, sauf qu'il y a plus d'ennemis à tuer avant d'avoir le couloir, mais une fois qu'on est dedans, ça passe de chaque côté sans toucher.
garzul
Messages : 683
Inscription : mer. 26/mai/2004 0:33

Message par garzul »

Ta pas une idée de coment je pourrais regler sa ? Ou alors j'allonge la barre comme sa je serais sur que sa toucheras :D
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

y'a trop d'ennemis !

je ne peux pas suivre le rythme :)

Sinon , il est bien ton code, mais puisque tu le demandes , je te fais ici une légère modification , en sachant que si tu as 10 programmeurs ,tu auras 10 façons de faire ,et les 10 auront raison :)

tout ça pour dire qu'il n'y a pas qu'une façon d'organiser , il faut trouver celle qui te convient .

Voici les remarques :

1 tu définis des constantes écran_largeur et ecran_hauteur , et tu ne les utilises pas !! j'ai mis des commentaires un peu partout où tu devrais utiliser tes constantes.( j'en ai peut-être oublié )

2 pour le test des collisions ,tu faisais deux boucles , une seule suffit .

3 j'ai regroupé tes procédures

Sinon , bravo tu utilises les listes chainées , tu ne vas plus pouvoir t'en passer :)





Code : Tout sélectionner

;/********************************************* 
;/* \\ Garzul Invader remanier sans media //  *  
;/*       \\  Crée par Garzul | 2004  //      *  
;/* \\JaPBe > 2.4.7.17 || Purebasic > 3.91 // *  
;/*********************************************  


#Ecran_Largeur = 600 ;Definie la largeur de l'écran 
#Ecran_Hauteur = 600 ;Definie la hauteur de l'écran 

;Enumeration des constant 
Enumeration 
  
  #Etoile  ; Constante du sprite Etoile 
  #Police  ; Constant de la Police 
  #Ennemis ; Constant du sprite des Ennemis 
  #Joueur  ; Constant du sprite Joueur 
  #Tir     ; Constant du sprite Tir 
  
EndEnumeration 
#Nb_Ennemis = 20 ; Nombre d'ennemis 

;-Création des variable d'affichage de l'intro et des ennemis 

;Variable global pour une utilisation dans les procédure 
Global Intro , TexteY , TexteX , RedText , GreenText , BlueText , Police , GreenText2 , BlueText2 , JoueurX , JoueurY , AffichTir , TirX , TirY , Score , vie 
Global niveau 
;  <<< c'est mieux de déclarer les variables avant de les assigner 
Intro     = 0 
TexteX    = 110 
TexteY    = 300 
JoueurX   = 270 
JoueurY   = 570 
AffichTir = 1 
TirX      = 270 
TirY      = 570 
Score     = 0 
vie       = 3 
niveau    = 1
  
;chargement d'une police 
Police = LoadFont(#Police ,"Modern" ,8 ,#PB_Font_Italic) 

;- On crée la fenêtre. 
If OpenWindow(0, 0, 0, #Ecran_Largeur, #Ecran_Hauteur, #PB_Window_BorderLess | #PB_Window_ScreenCentered, "Invader") = 0 
  End 
EndIf 

;- On ouvre l'openscreen. 

If InitSprite() = 0 
  MessageRequester("Erreur", "Impossible d'initialiser la souris ,le clavier ou l'écran. Vérifiez la présence de DirectX 7 ou supérieur.", 0  | #MB_ICONERROR) 
  End 
EndIf 

If InitKeyboard() = 0 
  MessageRequester("Erreur", "Impossible d'initialiser le clavier veuillez verifier si il est bien connecter à votre ordinateur.", 0 | #MB_ICONERROR) 
  End 
EndIf 

If OpenWindowedScreen(WindowID(), 0, 0, #Ecran_Largeur, #Ecran_Hauteur, 1, 0, 0) = 0 
  MessageRequester("Erreur", "Impossible d'ouvrir l'écran.", 0  | #MB_ICONERROR ) 
  End 
EndIf 

;Change la table des nombres aléatoire 
RandomSeed(ElapsedMilliseconds()) 

;Création du sprite Joueur 
CreateSprite( #Joueur , 80 , 10 ) 
StartDrawing(SpriteOutput(#Joueur)) 
Box(0,0,80,10,RGB($78,$8D,$8D)) 
For i = 0 To 200 
  Plot(Random(80),Random(10),RGB($FB,$FF,$53)) 
Next i 
StopDrawing() 
  
;Création du sprite Tir 
CreateSprite(#Tir , 20 , 20 ) 
StartDrawing(SpriteOutput(#Tir)) 
Circle(10,10,7,RGB($6B,$EA,$68)) 
Box(4,5,12,10,RGB($EC,$6,$C)) 
StopDrawing()  

;Création du sprite etoile 
CreateSprite( #Etoile , 1 , 1 ) 
StartDrawing(SpriteOutput(#Etoile)) 
Plot(0,0,RGB($FF,$FF,$FF)) 
StopDrawing() 

;On crée la structure Etoile ainsi que la liste chainée stars 
Structure Etoile 
  x.l 
  y.l 
  Vitesse.l 
EndStructure 

NewList Stars.Etoile() 
    
;Création des ennemis 
CreateSprite(#Ennemis , 15,15) 
StartDrawing(SpriteOutput(#Ennemis)) 
Box(0,0,15,15,RGB($1E,$12,$F3)) 
Circle(3 , 3 , 4 , RGB($53,$AE,$B3)) 
Circle(12 , 3 , 4 , RGB($53,$AE,$B3)) 
Box(3 , 11 , 9 , 3 , RGB($FF,$6,$D)) 
StopDrawing() 
  
Structure Ennemis 
  x.l 
  y.l 
  Vitesse.l 
EndStructure 

NewList Ennemi.Ennemis() 
     ;On crée une procedure affichage pour l'etoile 

    
For i = 0 To 300 
  AddElement(Stars()) 
  Stars()\x = Random(600) ; <<< tu mets 600 alors que tu as défini une constante , il faut l'utiliser 
  Stars()\y = Random(600) ; <<<< même remarque 
  Stars()\Vitesse = 1 
Next i 
    
For i = 0 To #Nb_Ennemis 
  AddElement(Ennemi()) 
  Ennemi()\x = Random(600)      ; <<< tu mets 600 alors que tu as défini une constante , il faut l'utiliser 
Ennemi()\y = Random(600) + -650 ;<<<< idem 
Ennemi()\Vitesse = Random(1)+1 
Next i 
  
;-Procedure d'intro 
Procedure Intro() 
  
  RedText + 2 
  
  If RedText > 255 
    
    RedText = 255 
    
  EndIf 
  
  If RedText    = 255 
    
    GreenText2 = 255 
    
  EndIf 
  
  StartDrawing(ScreenOutput()) 
  
  For i = 0 To 601 Step 5 
    For e = 0 To 600 Step 10 ; <<< tu mets 600 alors que tu as défini une constante , il faut l'utiliser 
      Plot(i , e , RGB( $1E , $23 , $E8 )) 
    Next e 
  Next i 
  
  
  FrontColor( RedText , GreenText , BlueText ) 
  DrawingMode(1) 
  Locate( TexteX, TexteY ) 
  DrawText(" GARZUL INVADER THE REVENGE ( Les pygméin attaque ) ") 
  
  FrontColor( RedText , GreenText2 , BlueText2 ) 
  DrawingMode(1) 
  Locate( 200 , 350 ) 
  DrawText(" Appuyer sur entrer pour jouer ") 
  
  DrawingFont(Police) 
  FrontColor( 0 , 255 , 0 ) 
  DrawingMode(1) 
  Locate( 530 , 580 ) 
  DrawText(" Garzul | 2004 ") 
  
  StopDrawing() 
  
  ExamineKeyboard() 
  If KeyboardPushed(#PB_Key_Return) 
    
    Intro = 1 
    
  EndIf 
  
EndProcedure 

;-Affichage 
Procedure Affichage() 
  ForEach Stars()       ; <<< Bien que ça fonctionne très bien comme tu as fait ,tu peux aussi faire comme ça 
    If Stars()\y > 600  ; <<< tu as fait une constante ecran_hauteur , il faut l'utiliser 
      Stars()\y = -5 
    EndIf 
    DisplayTransparentSprite( #Etoile , Stars()\x , Stars()\y ) 
    TransparentSpriteColor(#Etoile,0,0,0) 
    Stars()\y + Stars()\Vitesse 
  Next 
EndProcedure 

;-Affiche ennemis 
Procedure AffichageEnnemis() 
  
  ForEach Ennemi()

    If Ennemi()\y > 600  ; <<< tu as fait une constante ecran_hauteur , il faut l'utiliser 
    
      Ennemi()\y = -5 
      
    EndIf 
    
    DisplayTransparentSprite( #Ennemis , Ennemi()\x ,  Ennemi()\y ) 
    ;TransparentSpriteColor(#Ennemis,0,0,0) 
    
    Ennemi()\y + Ennemi()\Vitesse 
    
  Next 
  
EndProcedure 
  
;-Procedure du joueur 
Procedure Joueur() 
  
  DisplayTransparentSprite(#Joueur , JoueurX , JoueurY) 
  TransparentSpriteColor(#Joueur,0,0,0) 
  
  ;On crée les deplacement 
  If KeyboardPushed(#PB_Key_Right) 
    
    JoueurX + 5 
    
  EndIf 
  
  If KeyboardPushed(#PB_Key_Left) 
    
    JoueurX - 5 
    
  EndIf 
  
  ;On crée vite les test de collision des bord 
  If JoueurX > 600 : JoueurX = 600 : EndIf   ; <<< tu mets 600 alors que tu as défini une constante , il faut l'utiliser 
  If JoueurX < 0   : JoueurX = 0   : EndIf 
  
EndProcedure 
  
  
  ;-Tir du joueur 
Procedure Tir() 
  
  If  AffichTir = 1 And KeyboardPushed(#PB_Key_Space) 
    TirX = JoueurX + 35 
    AffichTir      = 0 
    
  EndIf 
  
EndProcedure 



;-Affichage des tir 
Procedure AffichageTir() 
  
  If AffichTir = 0 
    
    
    DisplayTransparentSprite(#Tir,TirX,TirY) 
    TransparentSpriteColor(#Tir,0,0,0) 
    
    TirY - 5 
    
    If TirY < 0 
      
      AffichTir = 1 
      TirY      = 570 
      
    EndIf 
    
  EndIf 
  
EndProcedure 
    

;-Collision 
Procedure Collision() 
  ;  inutile de faire deux boucles ! 
  
  ForEach Ennemi() 
    
    If SpriteCollision(#Ennemis,Ennemi()\x,Ennemi()\y,#Joueur,JoueurX,JoueurY) 
      
      vie - 1 
      
      DeleteElement(Ennemi()) 
      
      AddElement(Ennemi()) 
      Ennemi()\x = 20 + Random(580)        ; <<< tu mets 600 alors que tu as défini une constante , il faut l'utiliser 
      Ennemi()\y = Random(600) + -650 
      Ennemi()\Vitesse = Random(1) +1 
      
      Break 
      
    ElseIf  SpriteCollision(#Ennemis,Ennemi()\x,Ennemi()\y,#Tir,TirX,TirY) 
      
      Score     + 2 
      If Score > niveau * #Nb_Ennemis * 2
        niveau + 1
      EndIf  
      DeleteElement(Ennemi()) 
      If CountList(Ennemi()) <= niveau * #Nb_Ennemis * 2
        For i = 0 To 5 
          AddElement(Ennemi()) 
          Ennemi()\x = 20 + Random(580) ; <<< tu mets 600 alors que tu as défini une constante , il faut l'utiliser 
          Ennemi()\y = Random(600) + -650 
          Ennemi()\Vitesse = Random(3)+1  
        Next 
      EndIf
      TirY      = 570 
      AffichTir = 1 
      
      Break  
      
    EndIf 
    
  Next 
  
  If vie < 0 
    
    MessageRequester("DEAD","You are dead",0 | #MB_ICONINFORMATION) 
    vie   = 3 
    Score = 0 
    niveau = 1
  EndIf 
  
EndProcedure 
  
  
;-Affichage du score et de la vie 
Procedure ScoreVie() 
  
  StartDrawing(ScreenOutput()) 
  
  FrontColor( 200 , 100 , 100 ) 
  DrawingMode(1) 
  Locate( 0 , 20 ) 
  DrawText(" Score = " + Str(Score)) 
  
  Locate( 0 , 35 ) 
  DrawText(" Vie    = " + Str(vie)) 
  
  StopDrawing() 
  
EndProcedure 
  
  
;*______________________________________*__**__*__**__*__**__*___________________________________________* 
;/****************************************  //\\ BOUCLE //\\  ********************************************* 
;/****************************************  \\//*||**||*\\//  ********************************************* 
;*______________________________________*__**__*__**__*__**__*___________________________________________* 
Repeat 
  
  Event = WindowEvent() 
  Delay(5) 
  
  
  ;Affichage du jeux 
  If Intro = 1 
    
    Affichage() 
    AffichageEnnemis() 
    Joueur() 
    Tir() 
    AffichageTir() 
    Collision() 
    ScoreVie() 
    
  EndIf 
  
  
  ;Affichage de l'intro 
  If Intro = 0 
    
    Intro() 
    
  EndIf 
  
  
  ;-FPS 
  #DefinitionFPS = 20 
  cpt + 1 
  If cpt = #DefinitionFPS 
    cpt = 0 
    fps.f = #DefinitionFPS * 1000 / (ElapsedMilliseconds() - Temps) 
    Temps = ElapsedMilliseconds() 
  EndIf 
  
  
  StartDrawing(ScreenOutput()) 
  
  FrontColor( 0 , 100 , 255 ) 
  DrawingMode(1) 
  Locate(0, 5) 
  DrawText("FPS = " + StrF(fps, 1)) 
  
  StopDrawing() 
  
  
  FlipBuffers() ;Inversion des deux buffer 
  ClearScreen( 0 , 0 , 0 ) 
  
  If IsScreenActive() = 0 
    End 
  EndIf 
  
  ;Fin du programme si appuyer sur echap .    
  ExamineKeyboard() 
Until Event = #PB_Event_CloseWindow Or KeyboardPushed(#PB_Key_Escape)
Dernière modification par comtois le mer. 27/oct./2004 20:59, modifié 1 fois.
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

ligne 306 ;)

Code : Tout sélectionner

      For i = 0 To 5
        If CountList(Ennemi())<#Nb_Ennemis
          AddElement(Ennemi())
          Ennemi()\x = Random(600) ; <<< tu mets 600 alors que tu as défini une constante , il faut l'utiliser
          Ennemi()\y = Random(600) + -650
          Ennemi()\Vitesse = Random(3)+1 
        EndIf
      Next
Dri ;)
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

à mon avis , c'était fait exprès pour augmenter la difficulté , mais là il a mis la dose le garzul :P

( sinon il n'aurait pas fait une boucle for i=0 to 5 mais juste un addlelement() , tu en détruis un ,tu en refais un , et ainsi tu gardes le même nombre )
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
garzul
Messages : 683
Inscription : mer. 26/mai/2004 0:33

Message par garzul »

:D est oui :D merci a vous je vais étudier tout sa :)
Répondre