Vers l'infini 0.6

Programmation avancée de jeux en PureBasic
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Vers l'infini 0.6

Message par beauregard »

Une version plus gourmande en ressource, ou pas, puisque le fond est désormais entièrement recouvert de sprite3D, selon les bon conseils du docteur Dri... et l'information de tonton sur la gloutonnerie de la commande ClearScreen... dont l'utilisation n'a plus lieu d'être.
Et si ce n'est déjà fait:
enregister l'image png suivante sous le nom de

Code : Tout sélectionner

envahisseurs
Image

enregister l'image png suivante sous le nom de

Code : Tout sélectionner

infiniship
Image
Si le jeu ralentis sur votre machine préhistorique, vous pouvez espérer gagnez quelques image/s en désactivant le delay(1) ligne, heu, 384...

3 codes( le code principal et 2 .pbi):
Dernière modification par beauregard le mer. 25/mars/2009 0:12, modifié 2 fois.
config de mon ordi: seven, directx11, Pentium(R) DualCore E5700, RadeonHD 4550 512MB, PureBasic 4.61 x86
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Re: Vers l'infini 0.6

Message par beauregard »

Code source principal( un fichier de sauvegarde sera fabriqué dans le dossier où vous enregistrerez ce code):

Code : Tout sélectionner

;
; vers l'infini 0.6 - video game - PC - mode fenêtre - 24/03/2009 - source PureBasic 4.30
; France - pseudo: beauregard
; touches flêchées gauche et droite, X( tir) et F( image/seconde)

; prochains objectifs:

; -> boss de fin de niveau( grande soucoupe protégé par de petits blocs destructibles + séquence de tirs orientés)...
; ... et ré-utiliser tête 3eme envahisseur( rajout d'une bouche rire).
; -> après avoir terminé 3 niveaux, affrontement avec ce boss( à chaque rencontre: +de blocs +de tirs orientés, vitesse...)

If InitMouse ()=0 Or InitKeyboard ()=0 Or InitSprite ()=0  Or InitSprite3D ()=0 
     MessageRequester ( "Error" , "Can't open DirectX 7 or later" , 0)
     End
EndIf
If InitSound() = 0 
  MessageRequester("Error", "Can't open DirectX 7 Or Sound Card is not present", 0)
  End
EndIf

;Buffer$=Space(128)
;mciSendString_("open  5.MID type sequencer alias mid",Buffer$,128,0)
;mciSendString_("play mid",0,0,0)

Global manette.b
If InitJoystick():manette=1:joyInfoEx.JOYINFOEX:joyInfoEx\dwSize = SizeOf(JOYINFOEX):EndIf

UsePNGImageDecoder()
; °°°°°°°°°°°°°°°°°°°°  fonte °°°°°°°°°°°°°°°°°°°°°°°°°°
LoadFont ( 0 , "Comic Sans Ms" ,16, #PB_Font_Bold)
LoadFont ( 1 , "Comic Sans Ms" ,30, #PB_Font_Bold)
LoadFont ( 2 , "Comic Sans Ms" ,10, #PB_Font_Bold)

Enumeration ; ici, on donne un petit nom à nos sprites( non, chuis pas un numéro !):
  #shipb
  #envahisseurs
  #bouche ; pour le 3eme 
  #tirbruteA1  
  #tirbruteA2
  
  #boum:#boum3D
  #boun:#boun3D
     #pointA:#pointA3D ; 10
     #pointB:#pointB3D ; 20
     #pointC:#pointC3D ; 30
     #pointD:#pointD3D ; 100
     #ilifeup:#ilifeup3D ; signifier au joueur qu'il gagne une vie supplémentaire.    

  #fleche:#fleche3D  
  #irepere
  ; sprite3D utilisés pour le fond( étoilé):
  #sfonda:#sfonda3D
  #sfondb:#sfondb3D
  #sfondc:#sfondc3D
  #sfondd:#sfondd3D
  #sfonde:#sfonde3D
  #sfondf:#sfondf3D  
  
  #filante:#filante3D
EndEnumeration

Structure objet ;- opération de clonage... 
 id.w ; id comme identité
 x.l
 y.l
 speed.l
 tempoA.w
 tempoB.w 
 boutonA.b
 boutonB.b
 boutonC.b  
 taille.w
 clonetransp.w
 trembl.b
 blindage.b ; utilisé pour bruteB et C
 bobo.b
 zoom.w
EndStructure
Global NewList bruteA.objet() ; 
Global NewList bruteB.objet() ; 
Global NewList bruteC.objet() ;
Global NewList soucoupe.objet()
Global NewList scorep.objet()
Global NewList lifeup.objet()
Global NewList baoum.objet()
 
Global NewList tirb.objet() ; tir brute
Global NewList tirg.objet() ; tir gentil
Global NewList etoile.objet() ; fond

Declare Affichageintro()
Declare Affichagelevel()

Declare Fetoile(x,y,classe) ;- classe=0 -> fabrication fond étoilé dans Affichageintro() 
Declare Affichagetoile()

Declare Ftirgentil(x,y)
Declare Affichagetirgentil()

Declare Affichageship()

Declare Fsoucoupe(e); Si extra=1 alors la soucoupe surgit par la gauche. Si extra=2 alors la soucoupe surgit par la droite.
Declare Affichsoucoupe()

Declare FbruteA(x,y)
Declare AffichagebruteA()

Declare FbruteB(x,y)
Declare AffichagebruteB()

Declare FbruteC(x,y)
Declare AffichagebruteC()

Declare Ftirbrute(x,y)
Declare Affichagetirbrute()

Declare Affichagegameover()

Declare Fscorep(x,y,nbrepoint)
Declare Affichagescorep()

Declare Fbaoum(x,y,p)
Declare Affichagebaoum()

Declare Flifeup(x,y)
Declare Affichagelifeup()

Declare cdirection(joyCaps,joyInfoEx)

Declare Fin()

Global EcranX.w=768, EcranY.w=768
If OpenWindow ( 0 , 0, 0, EcranX, EcranY, "vers l'infini 0.6 - no ClearScreen" , #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar| #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_ScreenCentered | #PB_Window_ScreenCentered ) 
 OpenWindowedScreen ( WindowID ( 0 ), 0, 0, EcranX, EcranY, 0, 1, 1) ; un ecran graphique dans la fenêtre toute simple.
 SetWindowColor(0, RGB (0, 0, 0))  
EndIf
KeyboardMode(#PB_Keyboard_International) 
Sprite3DQuality(0) ;- Q 

  Global score.d, hiscore.d, newhiscore.b

  OpenFile(0, "infinisauv.dat"); cette commande fabrique un fichier .dat au nom de infinisauv s'il n'existe pas.
  ; lecture fichier de sauvegarde :
  If ReadFile(0,"infinisauv.dat")
    hiscore=ReadDouble(0);ReadCharacter(0);ReadByte(0)
    CloseFile(0)
  EndIf

;  ici, vous pouvez activer la ligne suivante, à la condition de placer le fichier Lazer.wav( se trouvant dans le dossier data de WaponezII)
; dans le dossier où vous avez enregistrer ce code( vers l'infini)
;  LoadSound(0, "Lazer.wav") ; un son un peu énervant hein ? Et oui, va falloir en trouver un autre...

; 5 images d'une taille de 64*64: vaisseau dirigé par le joueur.
; 16 images d'une taille de 64*48: vaisseau en démonstration pour l'intro.
; espace non encore utilisé d'une taille de 128*48.
; 1 image d'une taille de 128*48: titre du jeu
LoadSprite (#shipb,"infiniship.png")
LoadSprite (#envahisseurs,"envahisseurs.png")
;IncludeFile  "infinidata.pbi"

IncludeFile  "pixelinfini.pbi"


Global etape.b=0, pause.b, directionX.b, bouton1.b, lacheboutonX.b, level.b=1 ;- level 7: trio gagnant
Global Xgentil.w=400-32, Ygentil.w=EcranY-96, vie.b=3, invuln.w=99, bonusvie.b, zoomboum.w, transpboum.w, zoomY.w
Global recharge.b, zutA.w
Global tousensemble.b, ordretirbrute.w, choixtirbrute.w, nbreis.b
Global speedbrut.b=1, nbrdetruit.w
Global dirbruteA.b ; direction des bruteA
Global dirbruteB.b ; direction des bruteB
Global dirbruteC.b ; direction des bruteC
Global extra.b,nombrextra.b, topdepartextra.b 
nextlevel.b
MouseLocate(400, 300)
Delay(1)
; ******************************************************************************************************
Repeat ;- Boucle principale
; ******************************************************************************************************
 Event= WindowEvent ()
;- 
;- protection 
;    SetClipboardImage(0) ; Met une copie de l'#Image dans le presse-papier. 

   
 ;Event= WaitWindowEvent (100)
If Start3D(); on place cette commande/condition dès le début de la boucle principale. 
 
 ExamineKeyboard ()

; °°°°°°°°°°°°°°°°°°°°°°
;- Commandes: °°°°°°°°°°°° 
If manette=1:ExamineJoystick(0):EndIf
; °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
If pause=0:ReleaseMouse(0); on récupère la souris pour le jeu
  ExamineMouse()
EndIf
If pause>0:ReleaseMouse(1):EndIf; on libère la souris
If manette=0
  If KeyboardPushed ( #PB_Key_P ) And pause=0:pause=1:EndIf
  If KeyboardPushed ( #PB_Key_P )=0 And pause=1:pause=2:EndIf
  If KeyboardPushed ( #PB_Key_P ) And pause=2:pause=3:EndIf
  If KeyboardPushed ( #PB_Key_P )=0 And pause=3:pause=0:EndIf
EndIf
If manette=1
  If JoystickButton(0,8) And pause=0:pause=1:EndIf
  If JoystickButton(0,8)=0 And pause=1:pause=2:EndIf
  If JoystickButton(0,8) And pause=2:pause=3:EndIf
  If JoystickButton(0,8)=0 And pause=3:pause=0:EndIf
EndIf
; °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
directionX=0:bouton1=0
If manette=0
  If KeyboardPushed ( #PB_Key_Right ):directionX=1:EndIf ; droite.	
  If KeyboardPushed ( #PB_Key_Left ):directionX=-1:EndIf ; gauche.
  If KeyboardPushed ( #PB_Key_X ):bouton1=1:EndIf ; bouton action
EndIf
If manette=1
  If joyGetPosEx_(#JOYSTICKID1,joyInfoEx) = #JOYERR_NOERROR
    cdirection(joyCaps,joyInfoEx)
  EndIf
  If JoystickAxisX(0)=1:directionX=1:EndIf ; droite.	
  If JoystickAxisX(0)=-1:directionX=-1:EndIf ; gauche.
  If JoystickButton(0,1):bouton1=1:EndIf ; bouton action    
EndIf
; °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° 
;- étapes: °°°°°°°°°°°°    
If etape=0; *******
  Affichagetoile()
  Affichageintro() ; fabrication des étoiles
EndIf

If etape=1; *******
  Affichagetoile()
  Affichagelevel(); dans cette procédure -> fabrication des brutes.
EndIf

If etape=10; ******* 

  ;- fond étoilé
  Affichagetoile()
  
  Affichsoucoupe()
 
  If extra=1 Or extra=2:Fsoucoupe(extra):extra=10:EndIf; ordre de Fabrication clone soucoupe volante

  AffichagebruteA() ; ordre d'affichage des clones bruteA.
  AffichagebruteB() ; ordre d'affichage des clones bruteB.
  AffichagebruteC() ; ordre d'affichage des clones bruteC.
  ordretirbrute=0

  Affichagetirbrute() ; ordre d'affichage des clones tirs brute.
  
  Affichageship(); vaisseau du joueur
  Affichagebaoum():Affichagescorep()
  Affichagelifeup()
    
  ;- changement de niveau, explication:
  ; pour le 1er niveau, il y a 16 brutesA à détruire.
  ; pour le 2eme niveau, il y a 8 brutesA et 8 brutesB à détruire.
  ; pour le 3eme niveau, il y a 16 brutesA et 8 brutesB à détruire.
; 4 niveau-> Boss( non effectif)  
  ; pour le 5eme niveau, il y a 16 brutesB à détruire.
  ; pour le 6eme niveau, il y a 8 brutesB et 8 brutesC à détruire.
  ; pour le 7eme niveau, il y a 8 brutesA et 8 brutesB et 8 brutesC à détruire.  
; 8 niveau-> Boss( non effectif)  

  ; ... et provisoire la même chose pour tout les niveau suivant.  
  
  If nextlevel=0  
    If (nbrdetruit>16-1 And level=1) Or (nbrdetruit>16-1 And level=2) Or (nbrdetruit>24-1 And level=3):nextlevel=1:EndIf
  EndIf
  If nextlevel=0
    If level=4:nextlevel=1:EndIf; niveau du 1er Boss( non effectif, alors on zappe).
    If level=8:nextlevel=1:EndIf; niveau du 2eme Boss( non effectif, alors on zappe).
    If level=10:nextlevel=1:level=0:EndIf; niveau 10 terminus, alors on zappe et on propose de recommencer.
  EndIf
  If nextlevel=0  
    If (nbrdetruit>16-1 And level=5) Or (nbrdetruit>16-1 And level=6) Or (nbrdetruit>24-1 And level=7):nextlevel=1:EndIf
  EndIf
  If nextlevel=0  
    If (nbrdetruit>40-1 And level=9):nextlevel=1:EndIf; Or (nbrdetruit>16-1 And level=6) Or (nbrdetruit>24-1 And level=7):nextlevel=1:EndIf
  EndIf
        
  If nextlevel=1:nextlevel=0
    If extra=0:nombrextra=0:topdepartextra=0 
      level+1:etape=1
    
      dirbruteA=0:dirbruteB=0:dirbruteC=0; dans une même direction, pour un même but ;) 
      speedbrut=1:nbrdetruit=0    
    EndIf
  EndIf
;- joueur gagne une vie
  If (score>490 And bonusvie=0) Or (score>990 And bonusvie=1) Or (score>1490 And bonusvie=2) Or (score>1990 And bonusvie=3)
    bonusvie+1:vie+1:Flifeup(Xgentil+11, Ygentil) ; joueur gagne une vie tout les 500 pts
  EndIf
  If (score>2490 And bonusvie=4) Or (score>2990 And bonusvie=5) Or (score>3490 And bonusvie=6) Or (score>3990 And bonusvie=7)
    bonusvie+1:vie+1:Flifeup(Xgentil+11, Ygentil)  ; joueur gagne une vie tout les 500 pts
  EndIf
  If (score>4500-10 And bonusvie=8) Or (score>5000-10 And bonusvie=9) Or (score>5500-10 And bonusvie=10) Or (score>6000-10 And bonusvie=11)
    bonusvie+1:vie+1:Flifeup(Xgentil+11, Ygentil)  ; joueur gagne une vie tout les 500 pts
  EndIf
  If (score>6500-10 And bonusvie=12) Or (score>7000-10 And bonusvie=13) Or (score>7500-10 And bonusvie=14) Or (score>8000-10 And bonusvie=15)
    bonusvie+1:vie+1:Flifeup(Xgentil+11, Ygentil)  ; joueur gagne une vie tout les 500 pts
  EndIf
  If (score>8500-10 And bonusvie=16) Or (score>9000-10 And bonusvie=17) Or (score>9500-10 And bonusvie=18) Or (score>10000-10 And bonusvie=19)
    bonusvie+1:vie+1:Flifeup(Xgentil+11, Ygentil)  ; joueur gagne une vie tout les 500 pts
  EndIf
      
  ClipSprite(#shipb, 0, 208, 64, 48):DisplayTransparentSprite( #shipb , 10, 10)
  StartDrawing ( ScreenOutput ())
    DrawingMode (1)
      FrontColor ( RGB (255,255,255))      

      DrawingFont ( FontID (0)) 
      score$= Str (score) 
      FrontColor ( RGB (154,154,154)) :DrawText (350+1, 5+1, "SCORE " +score$)
      FrontColor ( RGB (234,234,234)) :DrawText (350, 5, "SCORE " +score$)
      
      DrawingFont ( FontID (0))
      hiscore$= Str (hiscore) 

      FrontColor ( RGB (255, 153, 0)) :DrawText ((EcranX-120)+1, 5+1, "HI-SCORE ")
      FrontColor ( RGB (255,224,0)) :DrawText ((EcranX-120), 5, "HI-SCORE ") 

      FrontColor ( RGB (255, 153, 0)) :DrawText (680+1,25+1, "" +hiscore$)
      FrontColor ( RGB (255, 224, 0)) :DrawText (680,25, "" +hiscore$) 
            
      DrawingFont ( FontID (1))
      vie$= Str (vie) 
      FrontColor ( RGB (164,21,21)) :DrawText (42+1, 4+1, "  " +vie$)
      FrontColor ( RGB (253,201,255)) :DrawText (42, 4, "  " +vie$)     
  StopDrawing ()
  
  ; Si invuln=100, alors explosion 1.
  ; Si invuln=101, alors explosion 2.  
  If vie<1 And invuln<100:etape=20:EndIf

  If etape=10 And tousensemble=1:tousensemble=0:topdepartextra=1 
    ForEach bruteA()
      bruteA()\y+24
    Next
    ForEach bruteB()
      bruteB()\y+24
    Next
    ForEach bruteC()
      bruteC()\y+24
    Next
  EndIf
  
  If etape=10 ; désigner la brute qui va tirer: il faut utiliser 2 variables globales: choixtirbrute et ordretirbrute 
    If pause=0:tempotirbrute+1:EndIf
      If tempotirbrute>64:tempotirbrute=0:nbrdebrute=0
        ForEach bruteA()
          nbrdebrute+1
        Next
        ForEach bruteB()
          nbrdebrute+1
        Next
        ForEach bruteC()
          nbrdebrute+1
        Next      
        choixtirbrute=Random(nbrdebrute); de 0 à 7... 
        choixtirbrute+1; ...et là +1, donc maintenant de 1 à nombre de brute présent à l'écran.
      EndIf  
  EndIf  
    
EndIf; If etape=10

If etape=20; *******
  Affichagegameover()
EndIf 

 If KeyboardPushed ( #PB_Key_F ) And nbreis=0:nbreis+1:EndIf
 If KeyboardPushed ( #PB_Key_F )=0 And nbreis=1:nbreis+1:EndIf
 If KeyboardPushed ( #PB_Key_F ) And nbreis=2:nbreis+1:EndIf
 If KeyboardPushed ( #PB_Key_F )=0 And nbreis=3:nbreis=0:EndIf

 If nbreis=1 Or nbreis=2:Gosub fps:EndIf ; nombre d'image par seconde. 
 
 Stop3D(); on place cette commande à la fin de la boucle principale. 
EndIf ; If Start3D()

 Delay(1) ;- là
 FlipBuffers(1) 

;  ClearScreen(RGB(0,0,0)) ; joyeusement désactivé, suivant les recommendation du docteur Dri. 

; ******************************************************************************************************   
 If Event= #PB_Event_CloseWindow Or KeyboardPushed ( #PB_Key_Escape ):Fin():EndIf; si clique coin haut droit ou touche Esc, alors ferme fenêtre.
ForEver



fps:
If Val ( FormatDate ( "%ss" , Date ()))=sek 
    fps+1
Else
    FPS$= Str (fps)
    fps=0
EndIf
sek= Val ( FormatDate ( "%ss" , Date ()))
StartDrawing ( ScreenOutput ())
DrawingMode (1)
FrontColor ( RGB (255,255,255))
DrawText (1,1, "FPS: " +FPS$)
vram=AvailableScreenMemory()
  vram$= Str (vram)
  FrontColor ( RGB (154,154,154)) :DrawText (1+1,80+1, "vram: " +vram$)
  FrontColor ( RGB (234,234,234)) :DrawText (1,80, "vram: " +vram$)
  ;zutA+1   
  zutA$= Str (zutA) 
  FrontColor ( RGB (154,154,154)) :DrawText (1+1,120+1, "zutA: " +zutA$)
  FrontColor ( RGB (234,234,234)) :DrawText (1,120, "zutA: " +zutA$)
  
  extra$= Str (extra) 
  FrontColor ( RGB (154,154,154)) :DrawText (1+1,140+1, "extra: " +extra$)
  FrontColor ( RGB (234,234,234)) :DrawText (1,140, "extra: " +extra$)  

zutA=0

StopDrawing ()
Return

IncludeFile  "infiniaffichage.pbi"

Procedure.l Affichagelevel()
Static tempolevel.b

  ForEach tirg() ; il faut supprimer tout les clones tirg. 
    DeleteElement(tirg())
  Next
  ForEach tirb() ; il faut supprimer tout les clones tirb.  
    DeleteElement(tirb())
  Next
  
  ForEach scorep() ; il faut supprimer tout les clones score.  
    DeleteElement(scorep())
  Next
  ForEach lifeup() ; il faut supprimer tout les clones life.  
    DeleteElement(lifeup())
  Next
      
  StartDrawing ( ScreenOutput ())
    DrawingMode (1)
      DrawingFont ( FontID (1)) 
      FrontColor ( RGB (255,255,255))
      level$= Str (level) 
      FrontColor ( RGB (154,154,154)) :DrawText (276+1, 260+1, "NIVEAU  " +level$)
      FrontColor ( RGB (234,234,234)) :DrawText (276, 260, "NIVEAU  " +level$)
    
  StopDrawing ()

If level=5 Or level=10 Or level=15 Or level=20; après chaque boss, on nettoie l'espace, hum.
;  ForEach etoile()
;    DeleteElement(etoile())
;  Next  
EndIf

If tempolevel<50 And pause=0:tempolevel+1
  If tempolevel>49:tempolevel=0:etape=10

  ; ecriture fichier de sauvegarde :  
  If newhiscore=1:newhiscore=0
    If CreateFile(0,"infinisauv.dat")
      WriteDouble(0, hiscore);WriteCharacter(0, hiscore);WriteByte(0, hiscore) 
      CloseFile(0)
    EndIf
  EndIf

  ;- ordre de fabrication brutes:
  
  ; ordre de Fabrication des clones bruteA:
  If level=1 Or level=2 Or level=3 Or level=7 Or level=9
    For t=1 To 8
      FbruteA(t,48*3) ; mis en en première ligne. Et ce n'est pas la plus confortable, voyez ;)
    Next
  EndIf
  If level=1 Or level=3 Or level=9
    For t=1 To 8
      FbruteA(t,48*2)
    Next
  EndIf 
  If level=9
    For t=1 To 8
      FbruteA(t,48)
    Next
  EndIf
  If level=9
    For t=1 To 8
      FbruteA(t,48*4) ; mis devant la première ligne.
    Next
  EndIf
  If level=9
    For t=1 To 8
      FbruteA(t,48*5) ; mis devant ceux qui sont devant la première ligne. Heu... oui, on va arrêtez là ! :).
    Next
  EndIf
      
  ; ordre de Fabrication des clones bruteB:
  If level=5 Or level=6
    For t=1 To 8
      FbruteB(t,48*3) ; mis en en première ligne. 
    Next
  EndIf
  If level=2 Or level=5 Or level=7
    For t=1 To 8
      FbruteB(t,48*2)
    Next
  EndIf 
  If level=3
    For t=1 To 8
      FbruteB(t,48) ; mis en en première ligne. 
    Next
  EndIf
  
  ; ordre de Fabrication des clones bruteC:
  If level=6
    For t=1 To 8
      FbruteC(t,48*2)
    Next
  EndIf 
  If level=7
    For t=1 To 8
      FbruteC(t,48)
    Next
  EndIf

 
  EndIf
EndIf

EndProcedure

Procedure.l Fetoile(x, y, classe) ; Fabrication des etoiles tout en sprite3D.

LastElement(etoile())
AddElement(etoile())

If classe=0 ; fond étoilé( taille 128*128)
  If y=0 Or y=2 Or y=4 Or y=6
    etoile()\id=x ; de 0 à 5
  EndIf
  If y=1 Or y=3 Or y=5 ; le hasard n'existant pas, ben faut inverser les trucs et les machin pour éviter l'apparition de motifs...
    If x=0:etoile()\id=5:EndIf
    If x=1:etoile()\id=4:EndIf
    If x=2:etoile()\id=3:EndIf
    If x=3:etoile()\id=2:EndIf
    If x=4:etoile()\id=1:EndIf
    If x=5:etoile()\id=0:EndIf        
  EndIf
  etoile()\x=x*128
  etoile()\y=y*128
EndIf

If classe=1 ; étoile filante( taille 16*16)
  etoile()\id=50
  etoile()\y=y
  If etoile()\y=-16 ; vers la gauche
    etoile()\x=Random (256-16)  
  EndIf
  If etoile()\y=-80 ; vers le milieu
    etoile()\x=Random (256-16):etoile()\x+256 
  EndIf
  If etoile()\y=-144 ; vers la droite
    etoile()\x=Random (256-16):etoile()\x+512
  EndIf  
EndIf

EndProcedure

Procedure.l Ftirgentil(x,y) ; Fabrication des tirs du vaisseau du joueur

LastElement(tirg())
AddElement(tirg())

tirg()\x=x
tirg()\y=y

;PlaySound(0, 0)

EndProcedure  

Procedure.l Fsoucoupe(e)
 
LastElement(soucoupe())
AddElement(soucoupe())

soucoupe()\id=e  
If soucoupe()\id=1:soucoupe()\x=-79:EndIf
If soucoupe()\id=2:soucoupe()\x=815:EndIf
;If nombrextra<3:nombrextra+1:EndIf; on augmente la vitesse de la soucoupe à chaque apparition( vitesse de départ maximale=3)
soucoupe()\speed=1;nombrextra ; je l'ai deconnecté car finalement, c'est peut être un peu injuste pour le joueur.
EndProcedure 

Procedure.l FbruteA(x,y) ; Fabrication des clones bruteA

LastElement(bruteA())
AddElement(bruteA())

; taille 32 colonnes +32 pour la séparation entre les bruteA, voyez.
bruteA()\x=x*64
bruteA()\y=y
bruteA()\blindage=1

EndProcedure

Procedure.l FbruteB(x,y) ; Fabrication des clones bruteB

LastElement(bruteB())
AddElement(bruteB())

; taille 32 colonnes +32 pour la séparation entre les bruteB, voyez.
bruteB()\x=x*64
bruteB()\y=y
bruteB()\blindage=2
EndProcedure
 
Procedure.l FbruteC(x,y) ; Fabrication des clones bruteC

LastElement(bruteC())
AddElement(bruteC())

; taille 32 colonnes +32 pour la séparation entre les bruteC, voyez.
bruteC()\x=x*64
bruteC()\y=y
bruteC()\blindage=3
EndProcedure 

Procedure.l Ftirbrute(x,y) ; Fabrication des tirs ennemis provenant des clones bruteA

LastElement(tirb())
AddElement(tirb())

tirb()\x=x
tirb()\y=y

EndProcedure

Procedure.l Fscorep(x,y,nbrepoint) ; Fabrication des clones score personnalisés

LastElement(scorep())
AddElement(scorep())
scorep()\x=x
scorep()\y=y
scorep()\id=nbrepoint

EndProcedure

Procedure.l Fbaoum(x,y,p) ; Fabrication explosion brute

LastElement(baoum())
AddElement(baoum())
baoum()\x=x
baoum()\y=y
baoum()\id=p

EndProcedure



Procedure.l Flifeup(x,y) ; Fabrication des clones life

LastElement(lifeup())
AddElement(lifeup())
lifeup()\x=x
lifeup()\y=y

EndProcedure
Procedure.l cdirection(*caps.JOYCAPS, *info.JOYINFOEX) ; joypad: utilisation de la croix directionnelle.
    If *info\dwPOV=0 Or *info\dwPOV=4500 Or *info\dwPOV=31500:directionY=-1:EndIf; haut 
    If *info\dwPOV=18000 Or *info\dwPOV=22500 Or *info\dwPOV=13500:directionY=1:EndIf; bas
    If *info\dwPOV=9000 Or *info\dwPOV=4500 Or *info\dwPOV=13500:directionX=1:EndIf; droite 
    If *info\dwPOV=27000 Or *info\dwPOV=31500 Or *info\dwPOV=22500:directionX=-1:EndIf; gauche
EndProcedure
Procedure.l Fin()
        
        ;mciSendString_("CLOSE MIDI",0,0,0)
        
 If IsSprite(#shipb):FreeSprite(#shipb):EndIf
 If IsSprite(#envahisseurs):FreeSprite(#envahisseurs):EndIf
 If IsSprite(#bouche):FreeSprite(#bouche):EndIf
 If IsSprite(#tirbruteA1):FreeSprite(#tirbruteA1):EndIf  
 If IsSprite(#tirbruteA2):FreeSprite(#tirbruteA2):EndIf
 If IsSprite(#boum):FreeSprite(#boum):EndIf
 If IsSprite3D(#boum3D):FreeSprite3D(#boum3D):EndIf
 If IsSprite(#boun):FreeSprite(#boun):EndIf
 If IsSprite3D(#boun3D):FreeSprite3D(#boun3D):EndIf
 
 If IsSprite(#pointA):FreeSprite(#pointA):EndIf
 If IsSprite3D(#pointA3D):FreeSprite3D(#pointA3D):EndIf
 If IsSprite(#pointB):FreeSprite(#pointB):EndIf
 If IsSprite3D(#pointB3D):FreeSprite3D(#pointB3D):EndIf 
 If IsSprite(#pointC):FreeSprite(#pointC):EndIf
 If IsSprite3D(#pointC3D):FreeSprite3D(#pointC3D):EndIf 
 If IsSprite(#pointD):FreeSprite(#pointD):EndIf
 If IsSprite3D(#pointD3D):FreeSprite3D(#pointD3D):EndIf 
 If IsSprite(#ilifeup):FreeSprite(#ilifeup):EndIf
 If IsSprite3D(#ilifeup3D):FreeSprite3D(#ilifeup3D):EndIf

 If IsSprite(#sfonda):FreeSprite(#sfonda):EndIf
 If IsSprite3D(#sfonda3D):FreeSprite3D(#sfonda3D):EndIf
 If IsSprite(#sfondb):FreeSprite(#sfondb):EndIf
 If IsSprite3D(#sfondb3D):FreeSprite3D(#sfondb3D):EndIf
 If IsSprite(#sfondc):FreeSprite(#sfondc):EndIf
 If IsSprite3D(#sfondc3D):FreeSprite3D(#sfondc3D):EndIf
 If IsSprite(#sfondd):FreeSprite(#sfondd):EndIf
 If IsSprite3D(#sfondd3D):FreeSprite3D(#sfondd3D):EndIf
 If IsSprite(#sfonde):FreeSprite(#sfonde):EndIf
 If IsSprite3D(#sfonde3D):FreeSprite3D(#sfonde3D):EndIf
 If IsSprite(#sfondf):FreeSprite(#sfondf):EndIf
 If IsSprite3D(#sfondf3D):FreeSprite3D(#sfondf3D):EndIf

 If IsSprite(#filante):FreeSprite(#filante):EndIf
 If IsSprite3D(#filante3D):FreeSprite3D(#filante3D):EndIf

 End ; et c'est toujours un peu triste...
EndProcedure
config de mon ordi: seven, directx11, Pentium(R) DualCore E5700, RadeonHD 4550 512MB, PureBasic 4.61 x86
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Re: Vers l'infini 0.6

Message par beauregard »

1er code .pbi

Code : Tout sélectionner

;
; Ce code, regroupant toutes les fabrications, doit être sauvegardé sous le nom de pixelinfini en .pbi
;
If CreateSprite(#bouche, 8, 6, 0); un peu de pixel art: bouche ouverte pour le 3eme envahisseur.

    StartDrawing(SpriteOutput(#bouche))
    
    ; 1ere ligne:
    LineXY (0, 0, 7, 0, RGB (211,0,0))
    ; 2eme ligne:    
    Plot(0, 1, RGB (185, 227, 250)):Plot(7, 1, RGB (185, 227, 250))
    LineXY (1, 1, 6, 1, RGB (255, 255, 255))
    ; 3eme et 4eme ligne:
    LineXY (0, 2, 7, 2, RGB (176, 27, 37))
    LineXY (0, 3, 7, 3, RGB (176, 27, 37))
    ; 5eme ligne:    
    Plot(0, 4, RGB (185, 227, 250)):Plot(1, 4, RGB (185, 227, 250))
    Plot(6, 4, RGB (185, 227, 250)):Plot(7, 4, RGB (185, 227, 250))
    LineXY (2, 4, 5, 4, RGB (255, 255, 255))
    ; 6eme ligne:
    LineXY (0, 5, 7, 5, RGB (211,0,0)) 
    
    StopDrawing ()   
EndIf

CreateSprite ( #tirbruteA1 , 16, 16) ; tir ennemi: image 1 
 StartDrawing ( SpriteOutput ( #tirbruteA1 ))
  BackColor ( RGB (0,0,0))
    Ellipse(8, 8, 8, 8 ,RGB(225, 0, 0)) 
    Ellipse(8, 8, 5, 5 ,RGB(255, 80, 80))
 StopDrawing ()
CreateSprite ( #tirbruteA2 , 16, 16) ; tir ennemi: image 2 
 StartDrawing ( SpriteOutput ( #tirbruteA2 ))
  BackColor ( RGB (0,0,0))
    Ellipse(8, 8, 8-2, 8 ,RGB(225, 0, 0)) 
    Ellipse(8, 8, 6-2, 6 ,RGB(255, 80, 80))
 StopDrawing ()
 
;- explosion:
CreateSprite ( #boum ,128, 128, #PB_Sprite_Texture ) ; vaisseau amis
 StartDrawing ( SpriteOutput ( #boum ))
  BackColor ( RGB (0,0,0))
  Circle(64, 64, 64, RGB (255, 161, 0)):Circle(64, 64, 56, RGB (255, 190, 55))  
 StopDrawing ()
CreateSprite3D ( #boum3D , #boum ) ; sprite3D( utilisant les capacitées de votre carte vidéo).

CreateSprite ( #boun ,128, 128, #PB_Sprite_Texture ) ; brute
 StartDrawing ( SpriteOutput ( #boun ))
  BackColor ( RGB (0,0,0))
  Circle(64, 64, 64, RGB (255, 160, 135)):Circle(64, 64, 56, RGB (255, 190, 175))  
 StopDrawing ()
CreateSprite3D ( #boun3D , #boun ) ; sprite3D( utilisant les capacitées de votre carte vidéo).

 CreateSprite ( #irepere , 4, 4, 0 ) ; test utile pour le programmeur
 StartDrawing ( SpriteOutput ( #irepere ))
  BackColor ( RGB (0,0,0))
  Box (0,0, 5, 5, RGB (190, 27, 27))
 StopDrawing ()

CreateSprite ( #pointA ,32, 32, #PB_Sprite_Texture )
 StartDrawing ( SpriteOutput ( #pointA ))
  BackColor ( RGB (0,0,0)):DrawingMode(#PB_2DDrawing_Transparent)  
      FrontColor ( RGB (255, 153, 0)) :DrawText (0+1, 0+1, "+10")
      FrontColor ( RGB (255, 224,0)) :DrawText (0, 0, "+10")
 StopDrawing () 
CreateSprite3D ( #pointA3D , #pointA )

CreateSprite ( #pointB ,32,32, #PB_Sprite_Texture )
 StartDrawing ( SpriteOutput ( #pointB ))
  BackColor ( RGB (0,0,0)):DrawingMode(#PB_2DDrawing_Transparent)
      FrontColor ( RGB (255, 153, 0)) :DrawText (0+1, 0+1, "+20")
      FrontColor ( RGB (255, 224,0)) :DrawText (0, 0, "+20")
 StopDrawing () 
CreateSprite3D ( #pointB3D , #pointB )

CreateSprite ( #pointC ,32,32, #PB_Sprite_Texture )
 StartDrawing ( SpriteOutput ( #pointC ))
  BackColor ( RGB (0,0,0)):DrawingMode(#PB_2DDrawing_Transparent)
      FrontColor ( RGB (255, 153, 0)) :DrawText (0+1, 0+1, "+30")
      FrontColor ( RGB (255, 224,0)) :DrawText (0, 0, "+30")
 StopDrawing () 
CreateSprite3D ( #pointC3D , #pointC )

CreateSprite ( #pointD ,32,32, #PB_Sprite_Texture )
 StartDrawing ( SpriteOutput ( #pointD ))
  BackColor ( RGB (0,0,0)):DrawingMode(#PB_2DDrawing_Transparent)
      FrontColor ( RGB (255, 153, 0)) :DrawText (0+1, 0+1, "+50")
      FrontColor ( RGB (255, 224,0)) :DrawText (0, 0, "+50")
 StopDrawing () 
CreateSprite3D ( #pointD3D , #pointD )

CreateSprite ( #ilifeup ,64,64, #PB_Sprite_Texture )
 StartDrawing ( SpriteOutput ( #ilifeup ))
  BackColor ( RGB (0,0,0)):DrawingMode(#PB_2DDrawing_Transparent)
      FrontColor ( RGB (164,21,21)) :DrawText (0+1, 0+1, "LIFE+1")
      FrontColor ( RGB (253,201,255)) :DrawText (0, 0, "LIFE+1")
 StopDrawing () 
CreateSprite3D ( #ilifeup3D , #ilifeup )


;- fabrication fond etoilé
  If CreateSprite(#sfonda, 128, 128, #PB_Sprite_Texture) ; sprite3D de 64*64 utilisé pour le fond( évitant d'utiliser ClearScreen)
    StartDrawing(SpriteOutput(#sfonda)):Box (0,0, 128, 128, RGB (1, 1, 1));:DrawText (28,22, " 1 ")
      For t=0 To 8+Random (24)
        Plot(Random (127), Random (127) , RGB( 150+Random (100), 150+Random (100), 150+Random (100)))
      Next
    StopDrawing()
  EndIf
  CreateSprite3D ( #sfonda3D , #sfonda )

  If CreateSprite(#sfondb, 128, 128, #PB_Sprite_Texture) ; sprite3D de 64*64 utilisé pour le fond( évitant d'utiliser ClearScreen)
    StartDrawing(SpriteOutput(#sfondb)):Box (0,0, 128, 128, RGB (1, 1, 1));:DrawText (28,22, " 2 ")
      For t=0 To 8+Random (24)
        Plot(Random (127), Random (127) , RGB( 150+Random (100), 150+Random (100), 150+Random (100)))
      Next
    StopDrawing()
  EndIf
  CreateSprite3D ( #sfondb3D , #sfondb )

  If CreateSprite(#sfondc, 128, 128, #PB_Sprite_Texture) ; sprite3D de 64*64 utilisé pour le fond( évitant d'utiliser ClearScreen)
    StartDrawing(SpriteOutput(#sfondc)):Box (0,0, 128, 128, RGB (1, 1, 1));:DrawText (28,22, " 3 ")
      For t=0 To 8+Random (24)
        Plot(Random (127), Random (127) , RGB( 150+Random (100), 150+Random (100), 150+Random (100)))
      Next
    StopDrawing()
  EndIf
  CreateSprite3D ( #sfondc3D , #sfondc )

  If CreateSprite(#sfondd, 128, 128, #PB_Sprite_Texture) ; sprite3D de 64*64 utilisé pour le fond( évitant d'utiliser ClearScreen)
    StartDrawing(SpriteOutput(#sfondd)):Box (0,0, 128, 128, RGB (1, 1, 1));:DrawText (28,22, " 4 ")
      For t=0 To 8+Random (24)
        Plot(Random (127), Random (127) , RGB( 150+Random (100), 150+Random (100), 150+Random (100)))
      Next
    StopDrawing()
  EndIf
  CreateSprite3D ( #sfondd3D , #sfondd )

  If CreateSprite(#sfonde, 128, 128, #PB_Sprite_Texture) ; sprite3D de 64*64 utilisé pour le fond( évitant d'utiliser ClearScreen)
    StartDrawing(SpriteOutput(#sfonde)):Box (0,0, 128, 128, RGB (1, 1, 1));:DrawText (28,22, " 5 ")
      For t=0 To 8+Random (24)
        Plot(Random (127), Random (127) , RGB( 150+Random (100), 150+Random (100), 150+Random (100)))
      Next
    StopDrawing()
  EndIf
  CreateSprite3D ( #sfonde3D , #sfonde )

  If CreateSprite(#sfondf, 128, 128, #PB_Sprite_Texture) ; sprite3D de 64*64 utilisé pour le fond( évitant d'utiliser ClearScreen)
    StartDrawing(SpriteOutput(#sfondf)):Box (0,0, 128, 128, RGB (1, 1, 1));:DrawText (28,22, " 6 ")
      For t=0 To 8+Random (24)
        Plot(Random (127), Random (127) , RGB( 150+Random (100), 150+Random (100), 150+Random (100)))
      Next
    StopDrawing()
  EndIf
  CreateSprite3D ( #sfondf3D , #sfondf )

  If CreateSprite(#filante, 16, 16, #PB_Sprite_Texture) ; sprite3D de 64*64 utilisé pour le fond( évitant d'utiliser ClearScreen)
    StartDrawing(SpriteOutput(#filante))
      Box (7,7, 2, 2, RGB (245, 245, 245))
    StopDrawing()
  EndIf
  CreateSprite3D ( #filante3D , #filante )

 ;- image protection:
 ; ( lors de l'appui de la touche PrintScreen)
  If CreateImage(0,24,16)
    StartDrawing(ImageOutput(0))
      Box(0,0, 8,16,RGB(0, 0, 255))
      Box(8,0, 8,16,RGB(255,255,255))      
      Box(16,0, 8,16,RGB(255, 0, 0))
    StopDrawing()
  EndIf
config de mon ordi: seven, directx11, Pentium(R) DualCore E5700, RadeonHD 4550 512MB, PureBasic 4.61 x86
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Re: Vers l'infini 0.6

Message par beauregard »

2eme code .pbi et c'est fini... bon test :)

Code : Tout sélectionner

;
; Ce code, regroupant toutes les procédures d'affichages, doit être sauvegardé sous le nom de infiniaffichage en .pbi
; version 0.6
Procedure.l Affichageintro() ; titre + vaisseau du joueur vue sous toute les coutures...
Static tempoappui.b
Static tempointro.b
Static ishipintro.b
Static tempocercle.b
Static cercler.b
Static cercletat.b
Static fabriquetoile.b

If fabriquetoile=0:fabriquetoile=1
    For tx=0 To 5  
      For ty=0 To 5+1 
        Fetoile( tx, ty, 0) ; installation des étoiles dans la partie gauche de l'écran.
      Next  
    Next
EndIf    
; titre:
ClipSprite(#shipb, 192, 208, 128, 48):DisplayTransparentSprite( #shipb , 400-64, 212)
  ClipSprite(#shipb, 300, 208, 17, 2):DisplayTransparentSprite( #shipb , 400+45, 210)

; l'objectif ici, étant de rendre le titre un peu moins triste:
If pause=0:tempocercle+2:EndIf
If tempocercle>4:tempocercle=0
  If cercletat=0:cercler+1
    If cercler>32:cercler=32:cercletat=1:EndIf
  EndIf
  If cercletat=1:cercler-1
    If cercler<0:cercler=0:cercletat=0:EndIf
  EndIf    
EndIf
   
For t=1 To 360 Step 10; 360/10= 36 étoiles rouges.
 ClipSprite(#shipb, 209, 230, 15, 15)
; DisplayTransparentSprite( #shipb , 370+24+(80+cercler)*Sin(t*0.0174532925), 205+24+(80+cercler)*Cos(t*0.0174532925)) ; (80+cercler)=diamètre
 DisplayTransparentSprite( #shipb , 370+24+(80+cercler)*(Sin(cercler+t*0.0174532925)), 205+24+(80+cercler)*(Cos(cercler+t*0.0174532925))) ; (80+cercler)=diamètre
;zutA+1
Next

ClipSprite(#shipb, 200, 211, 1, 1):DisplayTransparentSprite( #shipb , 380, 190):DisplayTransparentSprite( #shipb , 440, 280)
DisplayTransparentSprite( #shipb , 420, 170):DisplayTransparentSprite( #shipb , 400, 300):DisplayTransparentSprite( #shipb , 380, 280)
DisplayTransparentSprite( #shipb , 356, 274):DisplayTransparentSprite( #shipb , 366, 264):DisplayTransparentSprite( #shipb , 409, 268)

; vaisseau du joueur vue sous toute les coutures:
If pause=0:tempointro+1:EndIf
If tempointro>18:tempointro=0
  ishipintro+1
  If ishipintro>15:ishipintro=0:EndIf
EndIf
If ishipintro<5:ClipSprite(#shipb, ishipintro*64, 64, 64, 48):EndIf
If ishipintro>4 And ishipintro<10:ClipSprite(#shipb, (ishipintro-5)*64, 112, 64, 48):EndIf
If ishipintro>9 And ishipintro<15:ClipSprite(#shipb, (ishipintro-10)*64, 160, 64, 48):EndIf
If ishipintro=15:ClipSprite(#shipb, 0, 208, 64, 48):EndIf
DisplayTransparentSprite( #shipb , 400-32, 410)  

;DisplayTransparentSprite( #irepere , 400, 350) 
  StartDrawing ( ScreenOutput ())
    DrawingMode (1)
      FrontColor ( RGB (255,255,255))
    If manette=0      
      DrawingFont ( FontID (0)) 
      FrontColor ( RGB (154,154,154)) :DrawText (277+1, 540+1, "appuyez sur la touche X")
      FrontColor ( RGB (234,234,234)) :DrawText (277, 540, "appuyez sur la touche X")
      
      DrawingFont ( FontID (2)) 
      FrontColor ( RGB (154,154,154)) :DrawText (150+1, 672+1, "Il n'y a pas de manette de jeu branché sur votre machine, quelle tristesse...")
      FrontColor ( RGB (234,234,234)) :DrawText (150, 672, "Il n'y a pas de manette de jeu branché sur votre machine, quelle tristesse...")
    EndIf            
    If manette=1
      DrawingFont ( FontID (0)) 
      FrontColor ( RGB (154,154,154)) :DrawText (150+1, 540+1, "appuyez sur le bouton 1 de votre manette de jeu")
      FrontColor ( RGB (234,234,234)) :DrawText (150, 540, "appuyez sur le bouton 1 de votre manette de jeu")
          
      DrawingFont ( FontID (2)) 
      FrontColor ( RGB (154,154,154)) :DrawText (300+1, 672+1, "manette joyeusement détectée !")
      FrontColor ( RGB (234,234,234)) :DrawText (300, 672, "manette joyeusement détectée !")    
    EndIf  
      DrawingFont ( FontID (2)) 
      FrontColor ( RGB (154,154,154)) :DrawText ((EcranX-120)+1, 8+1, "version 0.6")
      FrontColor ( RGB (234,234,234)) :DrawText ((EcranX-120), 8, "version 0.6") 
  StopDrawing ()
  
If tempoappui<51 And pause=0:tempoappui+1:EndIf
If bouton1=1 And tempoappui>50 And pause=0:tempoappui=0:etape=1:lacheboutonX=1:EndIf
EndProcedure 



Procedure.l Affichagetoile()
Static fabfilante.b

ForEach etoile()
  If etoile()\id=50 And etoile()\boutonA=1:DeleteElement(etoile()):EndIf ; détruire étoile filante
Next

ForEach etoile()


;  If etoile()\taille=0:ClipSprite(#shipb, 200, 211, 1, 1):DisplayTransparentSprite( #shipb , etoile()\x, etoile()\y):EndIf
;  If etoile()\taille=1:ClipSprite(#shipb, 209, 230, 15, 15):DisplayTransparentSprite( #shipb , etoile()\x-7, etoile()\y):EndIf
 If etoile()\id<6

  If etoile()\id=0
    DisplaySprite3D( #sfonda3D , etoile()\x, etoile()\y, 255)   
  EndIf
  If etoile()\id=1
    DisplaySprite3D( #sfondb3D , etoile()\x, etoile()\y, 255)   
  EndIf
  If etoile()\id=2
    DisplaySprite3D( #sfondc3D , etoile()\x, etoile()\y, 255)   
  EndIf
  If etoile()\id=3
    DisplaySprite3D( #sfondd3D , etoile()\x, etoile()\y, 255)   
  EndIf
  If etoile()\id=4
    DisplaySprite3D( #sfonde3D , etoile()\x, etoile()\y, 255)   
  EndIf
  If etoile()\id=5
    DisplaySprite3D( #sfondf3D , etoile()\x, etoile()\y, 255)   
  EndIf        
  
  If pause=0 And etape=10:etoile()\y+1
    If etoile()\y>EcranY
    etoile()\y=-128
    fabfilante=1
    EndIf  
  EndIf 
 
 EndIf ; If etoile()\id<6
 
 
 If etoile()\id=50 ; etoile filante
  zutA+1 ; test: connaitre le nombre d'étoile 
  DisplaySprite3D( #filante3D , etoile()\x, etoile()\y, 170)   
  
  If pause=0 And etape=10:etoile()\y+2
    If etoile()\y>EcranY
      etoile()\boutonA=1
    EndIf  
  EndIf 
 EndIf  
 
 
Next

If fabfilante=1:fabfilante=0 ; on en profite pour fabriquer quelques étoiles filantes...
  Fetoile(0, -16, 1):Fetoile(0, -80, 1):Fetoile(0, -144, 1)
EndIf

EndProcedure

Procedure.l Affichagegameover()
Static tempover.b


If tempover<51 And pause=0:tempover+1:EndIf ; petite temporisation, avant de redonner la main au joueur.

  StartDrawing ( ScreenOutput ())
    DrawingMode (1)
      DrawingFont ( FontID (1)) 
      FrontColor ( RGB (255,255,255))
      FrontColor ( RGB (154,154,154)) :DrawText (276+1, 260+1, "GAME OVER")
      FrontColor ( RGB (234,234,234)) :DrawText (276, 260, "GAME OVER")      
  If manette=0 And tempover>50
      DrawingFont ( FontID (0))    
      FrontColor ( RGB (154,154,154)) :DrawText (280+1, 480+1, "appuyez sur la touche X")
      FrontColor ( RGB (234,234,234)) :DrawText (280, 480, "appuyez sur la touche X")
  EndIf
  If manette=1 And tempover>50
      DrawingFont ( FontID (0))    
      FrontColor ( RGB (154,154,154)) :DrawText (280+1, 480+1, "appuyez sur le bouton 1")
      FrontColor ( RGB (234,234,234)) :DrawText (280, 480, "appuyez sur le bouton 1")
  EndIf  
  StopDrawing ()   

If bouton1=1 And tempover>50 And pause=0:tempover=0; remise à l'état premier de toutes les variables, voyez.

  ; ecriture fichier de sauvegarde :  
  If newhiscore=1:newhiscore=0
    If CreateFile(0,"infinisauv.dat")
      WriteDouble(0, hiscore);WriteCharacter(0, hiscore);WriteByte(0, hiscore) 
      CloseFile(0)
    EndIf
  EndIf
  etape=0:level=1:recharge=0
  Xgentil=400-32:Ygentil=EcranY-96:score=0:vie=3:invuln=99:bonusvie=0
  extra=0:nombrextra=0:topdepartextra=0   

  dirbruteA=0:dirbruteB=0:dirbruteC=0; dans une même direction, pour un même but ;) 
  speedbrut=1:nbrdetruit=0

  ForEach tirg() ; il faut supprimer tout les clones tirg. 
    DeleteElement(tirg())
  Next
  ForEach soucoupe() ; il faut supprimer tout les soucoupes. 
    DeleteElement(soucoupe())
  Next
  ForEach bruteA() ; il faut supprimer tout les clones bruteA. 
    DeleteElement(bruteA())
  Next  
  ForEach bruteB() ; il faut supprimer tout les clones bruteB. 
    DeleteElement(bruteB())
  Next  
  ForEach bruteC() ; il faut supprimer tout les clones bruteC. 
    DeleteElement(bruteC())
  Next  

  ForEach tirb() ; il faut supprimer tout les clones tirb.  
    DeleteElement(tirb())
  Next
  
;  ForEach etoile()
;    DeleteElement(etoile())
;  Next
  
  ForEach scorep() ; il faut supprimer tout les clones score.  
    DeleteElement(scorep())
  Next
  ForEach lifeup() ; il faut supprimer tout les clones life.  
    DeleteElement(lifeup())
  Next  
EndIf
;DisplayTransparentSprite( #irepere , 400, 350)
EndProcedure

Procedure.l Affichageship() ; vaisseau dirigé par le joueur.

Static tempod.b ; temporisation utilisée pour la direction du vaisseau du joueur
Static shipdirection.b ; et cette variable détermine la direction du vaisseau du joueur

;zutA=shipdirection
If pause=0 And invuln<100
  If directionX=1 And Xgentil<EcranX-64:Xgentil+6; va à droite
    If Xgentil>EcranX-65:Xgentil=EcranX-64:EndIf ; limite droite
    If shipdirection<0:shipdirection=0:EndIf
    tempod+1
    If tempod>6:tempod=0
      If shipdirection<2:shipdirection+1:EndIf
    EndIf  
  EndIf

  If directionX=-1 And Xgentil>0:Xgentil-6; va à gauche	
    If Xgentil<1:Xgentil=0:EndIf ; limite gauche
    If shipdirection>0:shipdirection=0:EndIf
    tempod+1
    If tempod>6:tempod=0
      If shipdirection>-2:shipdirection-1:EndIf
    EndIf
  EndIf

  ; si le joueur ne touche pas les touches fleches, alors le vaisseau doit se rétablir.
  If directionX=0;KeyboardPushed ( #PB_Key_Right )=0 And KeyboardPushed ( #PB_Key_Left )=0
    tempod+1
    If tempod>6:tempod=0
      If shipdirection>0:shipdirection-1:EndIf
      If shipdirection<0:shipdirection+1:EndIf    
    EndIf
  EndIf

  If bouton1=0 And lacheboutonX=1:lacheboutonX=0:EndIf
  If bouton1=1 And lacheboutonX=0 And recharge=0 ; tir !
    recharge=24:Ftirgentil( (Xgentil+32)-8, Ygentil )
    lacheboutonX=1; <- ligne a désactiver si vous voulez donner au joueur un tir automatique.
  EndIf
  If recharge>0:recharge-1:EndIf ; petite temporisation avant d'autoriser un prochain tir
EndIf; If pause=0 And invuln<100

Affichagetirgentil()

If invuln>0 And invuln<100 And pause=0:invuln-1:EndIf
If invuln=0 Or (invuln>10 And invuln<20) Or (invuln>30 And invuln<40) Or (invuln>50 And invuln<60) Or (invuln>80 And invuln<90) Or invuln=100
  ; 5 images d'une taille de 64*64
  If shipdirection=0:ClipSprite(#shipb, 0, 0, 64, 64):EndIf; vue de dessus( si le joueur ne touche à rien) 
  If shipdirection=1:ClipSprite(#shipb, 64, 0, 64, 64):EndIf; droite 1
  If shipdirection=2:ClipSprite(#shipb, 128, 0, 64, 64):EndIf; droite 2
  If shipdirection=-1:ClipSprite(#shipb, 192, 0, 64, 64):EndIf; gauche 1
  If shipdirection=-2:ClipSprite(#shipb, 256, 0, 64, 64):EndIf; gauche 2
  DisplayTransparentSprite( #shipb , Xgentil, Ygentil)
EndIf

;DisplayTransparentSprite( #irepere , Xgentil, Ygentil) 
;DisplayTransparentSprite( #irepere , Xgentil+64, Ygentil)   


If invuln>99; explosion du vaisseau ! Utilisation d'un sprite3D
; taille de #boum3D: 128*128
; ZoomSprite3D(#Sprite3D, Largeur, Hauteur)

  ; Si invuln=100, alors explosion 1.
  ; Si invuln=101, alors explosion 2.
  
If invuln=100;- 1ere partie de l'explosion
  ZoomSprite3D(#boum3D, 64+zoomboum, 64+zoomboum)
  DisplaySprite3D ( #boum3D , (Xgentil)-(zoomboum/2), (Ygentil)-(zoomboum/2), 55+transpboum)
  If transpboum<200 And pause=0:transpboum+4:EndIf
EndIf
If invuln=101;- 2eme partie de l'explosion
  ZoomSprite3D(#boum3D, 128, 192-zoomboum)
  DisplaySprite3D ( #boum3D , (Xgentil)-(64/2), ((Ygentil)-(zoomboum/2))+zoomY, 55+transpboum)
  If transpboum>0 And pause=0:transpboum-4:EndIf
EndIf

If zoomboum<64 And invuln=100 And pause=0:zoomboum+2; 1ere partie de l'explosion
  If zoomboum>63:zoomboum=64:invuln=101:EndIf
EndIf
If zoomboum<128 And invuln=101 And pause=0:zoomboum+2:zoomY+2; 2eme partie de l'explosion
  If zoomboum>127:zoomboum=0:invuln=99:EndIf; fin explosion, le jouer récupère la main.  
EndIf

;zutA=transpboum;(Xgentil-32)-(zoomboum/2)

EndIf; If invuln=100; explosion du vaisseau !

EndProcedure

Procedure.l Affichagetirgentil() ; Affichage des clones tirs du vaisseau du joueur

ForEach tirg()

  If pause=0:tirg()\y-10:EndIf
  If pause=0:tirg()\boutonB+1:EndIf
  If tirg()\boutonB=9:tirg()\boutonB=1:EndIf
  If tirg()\boutonB<5;1 2 3 4
    ClipSprite(#envahisseurs, 0, 175, 16, 13):DisplayTransparentSprite( #envahisseurs , tirg()\x, tirg()\y); image tir haut 1  
    ClipSprite(#envahisseurs, 32, 175, 16, 13):DisplayTransparentSprite( #envahisseurs , tirg()\x, tirg()\y+12); image tir bas 1
  EndIf
  If tirg()\boutonB>4; 5 6 7 8
    ClipSprite(#envahisseurs, 16, 175, 16, 13):DisplayTransparentSprite( #envahisseurs , tirg()\x, tirg()\y); image tir haut 2  
    ClipSprite(#envahisseurs, 16+32, 175, 16, 13):DisplayTransparentSprite( #envahisseurs , tirg()\x, tirg()\y+12); image tir bas 2
  EndIf
      
  If tirg()\boutonA=1 Or tirg()\y<0-15:DeleteElement(tirg()):Continue:EndIf 

  ForEach soucoupe() ; ici, nous allons vérifier si un tir gentil touche la soucoupe qui ne tremble pas: 
    If tirg()\x>(soucoupe()\x-15)-8 And tirg()\x<(soucoupe()\x+79)+8 And soucoupe()\boutonB=0 ; -15 +79
      If tirg()\y>(soucoupe()\y+2)-8 And tirg()\y<(soucoupe()\y+81)+8
        tirg()\boutonA=1:soucoupe()\boutonA+1:score=score+(50*soucoupe()\boutonA):soucoupe()\boutonB=1
        soucoupe()\boutonC=soucoupe()\boutonA;le boutonC va nous servir pour l'affichage spécifique du score de la soucoupe.
        If soucoupe()\boutonC=5:soucoupe()\boutonB=2:EndIf
      EndIf
    EndIf
  Next   

  ForEach bruteA() ; ici, nous allons vérifier si un tir gentil touche une bruteA: 
    If tirg()\x>bruteA()\x-8 And tirg()\x<(bruteA()\x+31)+8
      If tirg()\y>bruteA()\y-8 And tirg()\y<(bruteA()\y+31)+8
        tirg()\boutonA=1:bruteA()\blindage-1:bruteA()\bobo=10
        If bruteA()\blindage<1
          nbrdetruit+1:score+10
          Fscorep(bruteA()\x,bruteA()\y, 10) ; score
          Fbaoum(bruteA()\x, bruteA()\y+4, 1) ;- explosion d'une puissance de 1
          DeleteElement(bruteA())
        EndIf  
      EndIf
    EndIf
  Next  

  ForEach bruteB() ; ici, nous allons vérifier si un tir gentil touche une bruteB: 
    If tirg()\x>bruteB()\x-8 And tirg()\x<(bruteB()\x+31)+8
      If tirg()\y>bruteB()\y-8 And tirg()\y<(bruteB()\y+31)+8
        tirg()\boutonA=1:bruteB()\blindage-1:bruteB()\bobo=10
        If bruteB()\blindage<1        
          nbrdetruit+1:score+20
          Fscorep(bruteB()\x,bruteB()\y, 20)
          Fbaoum(bruteB()\x-8, bruteB()\y-8, 2) ;- explosion d'une puissance de 2          
          DeleteElement(bruteB())
        EndIf          
      EndIf
    EndIf
  Next
   
  ForEach bruteC() ; ici, nous allons vérifier si un tir gentil touche une bruteC: 
    If tirg()\x>bruteC()\x-8 And tirg()\x<(bruteC()\x+31)+8
      If tirg()\y>bruteC()\y-8 And tirg()\y<(bruteC()\y+31)+8
        tirg()\boutonA=1:bruteC()\blindage-1:bruteC()\bobo=10
        If bruteC()\blindage<1        
          nbrdetruit+1:score+30
          Fscorep(bruteC()\x,bruteC()\y, 30)
          Fbaoum(bruteC()\x-16, bruteC()\y-16, 3) ;- explosion d'une puissance de 3          
          DeleteElement(bruteC())
        EndIf          
      EndIf
    EndIf
  Next
  ; ici, newhiscore autorisera la sauvegarde du hi-score sur le fichier de sauvegarde( voir Procedure.l Affichagegameover() ).
  If score>hiscore:hiscore=score:newhiscore=1:EndIf    
Next

;- augmente régulièrement la vitesse
;- de déplacement des brutes, au fur et à mesure de leurs destructions...
If nbrdetruit>4-1 And speedbrut<2:speedbrut=2:EndIf
If nbrdetruit>8-1 And speedbrut<3:speedbrut=3:EndIf
If nbrdetruit>12-1 And speedbrut<4:speedbrut=4:EndIf
If nbrdetruit>16-1 And speedbrut<5:speedbrut=5:EndIf
If nbrdetruit>20-1 And speedbrut<6:speedbrut=6:EndIf

EndProcedure

Procedure.l Affichsoucoupe() 

ForEach soucoupe()
; °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
  ; soucoupe touchée par un laser tiré par le joueur:
  If pause=0 And soucoupe()\boutonB=1:soucoupe()\trembl=0
    soucoupe()\tempoA+1
    ; 1 2 3
    If soucoupe()\tempoA>3 And soucoupe()\tempoA<7:soucoupe()\trembl=soucoupe()\boutonA:EndIf;4 5 6
    ; 7 8 9
    If soucoupe()\tempoA>9 And soucoupe()\tempoA<13:soucoupe()\trembl=-soucoupe()\boutonA:EndIf;10 11 12    
    ; 13 14 15    
    If soucoupe()\tempoA>15 And soucoupe()\tempoA<19:soucoupe()\trembl=soucoupe()\boutonA:EndIf;16 17 18
    ; 19 20 21
    If soucoupe()\tempoA>21 And soucoupe()\tempoA<25:soucoupe()\trembl=-soucoupe()\boutonA:EndIf;22 23 24     
    If soucoupe()\tempoA=25:soucoupe()\tempoA=0:soucoupe()\boutonB=0:soucoupe()\trembl=0
      soucoupe()\id+1 ; fin du tremblement, alors la soucoupe repart dans la direction opposé... 
      If soucoupe()\id=3:soucoupe()\id=1:EndIf
      If soucoupe()\speed<3:soucoupe()\speed+1:EndIf; ... en augmentant sa vitesse, hé hé !
    EndIf    


    If soucoupe()\tempoA=1 Or soucoupe()\tempoA=7 Or soucoupe()\tempoA=13 Or soucoupe()\tempoA=19
      ;le boutonC va nous servir pour l'affichage spécifique du score de la soucoupe( voir Procedure.l Affichagetirgentil() ):
      If soucoupe()\boutonC>0:soucoupe()\boutonC-1
        If soucoupe()\tempoA=1:Fscorep(soucoupe()\x+16,soucoupe()\y+64, 100):EndIf
        If soucoupe()\tempoA=7:Fscorep(soucoupe()\x+16,soucoupe()\y+48, 100):EndIf
        If soucoupe()\tempoA=13:Fscorep(soucoupe()\x+16,soucoupe()\y+32, 100):EndIf
        If soucoupe()\tempoA=19:Fscorep(soucoupe()\x+16,soucoupe()\y+16, 100):EndIf
      EndIf
    EndIf
  EndIf

; °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
  ; fuite...
  If pause=0 And soucoupe()\boutonB=2:soucoupe()\trembl=0; ... au 5eme coup au but...
    soucoupe()\tempoA+1
    If soucoupe()\tempoA=25:soucoupe()\tempoA=1:EndIf    
    ; 1 2 3
    If soucoupe()\tempoA>3 And soucoupe()\tempoA<7:soucoupe()\trembl=soucoupe()\boutonA:EndIf;4 5 6
    ; 7 8 9
    If soucoupe()\tempoA>9 And soucoupe()\tempoA<13:soucoupe()\trembl=-soucoupe()\boutonA:EndIf;10 11 12    
    ; 13 14 15    
    If soucoupe()\tempoA>15 And soucoupe()\tempoA<19:soucoupe()\trembl=soucoupe()\boutonA:EndIf;16 17 18
    ; 19 20 21
    If soucoupe()\tempoA>21 And soucoupe()\tempoA<25:soucoupe()\trembl=-soucoupe()\boutonA:EndIf;22 23 24

    If soucoupe()\tempoA=1 Or soucoupe()\tempoA=7 Or soucoupe()\tempoA=13 Or soucoupe()\tempoA=19
      ;le boutonC va nous servir pour l'affichage spécifique du score de la soucoupe( voir Procedure.l Affichagetirgentil() ):
      If soucoupe()\boutonC>0:soucoupe()\boutonC-1:Fscorep(soucoupe()\x+16,soucoupe()\y+64, 100):EndIf
    EndIf  
    
    soucoupe()\y-1; ... l'extra quitte le terrain de jeu par le haut.
    If soucoupe()\y+79<0:DeleteElement(soucoupe()):extra=0:Continue:EndIf ; si sort de l'écran par le haut, alors...         
  EndIf

; °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°  
  ; vie normale
  If pause=0 And soucoupe()\boutonB=0 
    If soucoupe()\id=2:soucoupe()\x-soucoupe()\speed
      If soucoupe()\x+79<0:DeleteElement(soucoupe()):extra=0:Continue:EndIf ; si sort de l'écran par la gauche, alors...
    EndIf
    If soucoupe()\id=1:soucoupe()\x+soucoupe()\speed
      If soucoupe()\x-15>800:DeleteElement(soucoupe()):extra=0:Continue:EndIf ; si sort de l'écran par la droite, alors...
    EndIf    
  EndIf
  
  
  
  ClipSprite(#envahisseurs, 0, 68, 64, 79-4); soucoupe 
  DisplayTransparentSprite( #envahisseurs , (soucoupe()\x)+soucoupe()\trembl, (soucoupe()\y+2+4)+24)
  ClipSprite(#envahisseurs, 8, 64, 56, 4); haut de la soucoupe 
  DisplayTransparentSprite( #envahisseurs , (soucoupe()\x)+soucoupe()\trembl+8, (soucoupe()\y+2)+24)  
  ClipSprite(#envahisseurs, 32, 32, 15, 19); aile gauche de la soucoupe 
  DisplayTransparentSprite( #envahisseurs , (soucoupe()\x-15)+soucoupe()\trembl, (soucoupe()\y+55)+24)
  ClipSprite(#envahisseurs, 49, 32, 15, 19); aile gauche de la soucoupe 
  DisplayTransparentSprite( #envahisseurs , (soucoupe()\x+64)+soucoupe()\trembl, (soucoupe()\y+55)+24)

  If soucoupe()\boutonB>0; bouche "Oooh ! je suis touché par un vilain laser, alors que je promène paisiblement mon troupeau de lama de l'espace..." 
    ClipSprite(#envahisseurs, 0, 64, 8, 4)
    DisplayTransparentSprite( #envahisseurs , (soucoupe()\x)+soucoupe()\trembl+28, (soucoupe()\y+2+28)+24)  
  EndIf
;  DisplayTransparentSprite( #irepere , soucoupe()\x-15, soucoupe()\y+2)
;  DisplayTransparentSprite( #irepere , soucoupe()\x+79, soucoupe()\y+2)

Next  

EndProcedure

Procedure.l AffichagebruteA() ; Affichage des clones bruteA

ForEach bruteA()
  If ordretirbrute=0:ordretirbrute=1:EndIf
  ordretirbrute+1

  If pause=0
    If dirbruteA=0:bruteA()\x+speedbrut 
      If bruteA()\x>(EcranX-4)-32:dirbruteA=1:EndIf ; bord de l'écran droite
    EndIf
    If dirbruteA=2:bruteA()\x-speedbrut 
      If bruteA()\x<0+4:dirbruteA=3:EndIf ; bord de l'écran gauche
    EndIf
  

  EndIf
  ClipSprite(#envahisseurs, 0, 0, 32, 32) 
  DisplayTransparentSprite( #envahisseurs , bruteA()\x, bruteA()\y)
  
  If bruteA()\y>EcranY-48:etape=20:EndIf; si touche le bas de l'écran, alors game over
    
  ; faut attendre le dernier clone pour decendre tout ce beau monde. Ce qui complique un peu le code.  
  If dirbruteA=1 And LastElement(bruteA()):dirbruteC=2:dirbruteB=2:dirbruteA=2:tousensemble=1
    If topdepartextra=1 And extra=0:extra=1:EndIf
  EndIf
  If dirbruteA=3 And LastElement(bruteA()):dirbruteC=0:dirbruteB=0:dirbruteA=0:tousensemble=1
    If topdepartextra=1 And extra=0:extra=2:EndIf
  EndIf
  
  If choixtirbrute>0 And choixtirbrute=ordretirbrute; tir ennemi !!
    choixtirbrute=0:Ftirbrute( (bruteA()\x+16)-8, (bruteA()\y+31)-8 )
  EndIf

  ; ici, nous allons vérifier si un vaisseau bruteA touche le gentil vaisseau du joueur, hum:
  If invuln=0  
    If bruteA()\x+16>Xgentil-1 And bruteA()\x+16<Xgentil+64; on teste à partir du milieu de bruteA, car faut pas être trop dur avec le joueur.
      If bruteA()\y+16>Ygentil-1 And bruteA()\y+16<Ygentil+64
        invuln=100:vie-1:transpboum=0:zoomY=0
      EndIf
    EndIf
  EndIf
    
Next

EndProcedure

Procedure.l AffichagebruteB() ; Affichage des clones bruteB

ForEach bruteB()
  If ordretirbrute=0:ordretirbrute=1:EndIf
  ordretirbrute+1
  
  If pause=0
    If dirbruteB=0:bruteB()\x+speedbrut 
      If bruteB()\x>(EcranX-4)-32:dirbruteB=1:EndIf ; bord de l'écran droite
    EndIf
    If dirbruteB=2:bruteB()\x-speedbrut 
      If bruteB()\x<0+4:dirbruteB=3:EndIf ; bord de l'écran gauche
    EndIf
  
    ;bruteB()\y=posYbruteB
  EndIf
  
  If bruteB()\bobo=0:ClipSprite(#envahisseurs, 32, 0, 32, 32):DisplayTransparentSprite( #envahisseurs , bruteB()\x, bruteB()\y):EndIf
  If bruteB()\bobo>0:bruteB()\bobo-1 ; si touché par un tir gentil, alors...
    ClipSprite(#envahisseurs, 0, 143, 32, 32):DisplayTransparentSprite( #envahisseurs , bruteB()\x, bruteB()\y):EndIf

  If bruteB()\y>EcranY-48:etape=20:EndIf; si touche le bas de l'écran, alors game over
    
  ; faut attendre le dernier clone pour decendre tout ce beau monde. Ce qui complique un peu le code.  
  If dirbruteB=1 And LastElement(bruteB()):dirbruteC=2:dirbruteB=2:dirbruteA=2:tousensemble=1
    If topdepartextra=1 And extra=0:extra=1:EndIf
  EndIf
  If dirbruteB=3 And LastElement(bruteB()):dirbruteC=0:dirbruteB=0:dirbruteA=0:tousensemble=1
    If topdepartextra=1 And extra=0:extra=2:EndIf
  EndIf
  
  If choixtirbrute>0 And choixtirbrute=ordretirbrute; tir ennemi !!
    choixtirbrute=0:Ftirbrute( (bruteB()\x+16)-8, (bruteB()\y+31)-8 )
  EndIf

  ; ici, nous allons vérifier si un vaisseau bruteB touche le gentil vaisseau du joueur, hum:
  If invuln=0  
    If bruteB()\x+16>Xgentil-1 And bruteB()\x+16<Xgentil+64; on teste à partir du milieu de bruteB, car faut pas être trop dur avec le joueur.
      If bruteB()\y+16>Ygentil-1 And bruteB()\y+16<Ygentil+64
        invuln=100:vie-1:transpboum=0:zoomY=0
      EndIf
    EndIf
  EndIf
    
Next

EndProcedure

Procedure.l AffichagebruteC() ; Affichage des clones bruteC

ForEach bruteC()
  If ordretirbrute=0:ordretirbrute=1:EndIf
  ordretirbrute+1
  
  If pause=0
    If dirbruteC=0:bruteC()\x+speedbrut 
      If bruteC()\x>(EcranX-4)-32:dirbruteC=1:EndIf ; bord de l'écran droite
    EndIf
    If dirbruteC=2:bruteC()\x-speedbrut 
      If bruteC()\x<0+4:dirbruteC=3:EndIf ; bord de l'écran gauche
    EndIf
  
    ;bruteC()\y=posYbruteC
  EndIf

  If bruteC()\bobo=0:ClipSprite(#envahisseurs, 0, 32, 32, 32):DisplayTransparentSprite( #envahisseurs , bruteC()\x, bruteC()\y):EndIf
  If pause=0:bruteC()\tempoA+1:EndIf
  If bruteC()\tempoA>24:bruteC()\tempoA=0:EndIf
  If bruteC()\tempoA>12 And bruteC()\bobo=0
    DisplayTransparentSprite( #bouche , bruteC()\x+12, bruteC()\y+20)
  EndIf

  If bruteC()\bobo>0:bruteC()\bobo-1 ; si touché par un tir gentil, alors...
    ClipSprite(#envahisseurs, 32, 143, 32, 32):DisplayTransparentSprite( #envahisseurs , bruteC()\x, bruteC()\y):EndIf

  If bruteC()\y>EcranY-48:etape=20:EndIf; si touche le bas de l'écran, alors game over
      
  ; faut attendre le dernier clone pour decendre tout ce beau monde. Ce qui complique un peu le code.  
  If dirbruteC=1 And LastElement(bruteC()):dirbruteC=2:dirbruteB=2:dirbruteA=2:tousensemble=1
    If topdepartextra=1 And extra=0:extra=1:EndIf
  EndIf
  If dirbruteC=3 And LastElement(bruteC()):dirbruteC=0:dirbruteB=0:dirbruteA=0:tousensemble=1
    If topdepartextra=1 And extra=0:extra=2:EndIf
  EndIf
  
  If choixtirbrute>0 And choixtirbrute=ordretirbrute; tir ennemi !!
    choixtirbrute=0:Ftirbrute( (bruteC()\x+16)-8, (bruteC()\y+31)-8 )
  EndIf

  ; ici, nous allons vérifier si un vaisseau bruteC touche le gentil vaisseau du joueur, hum:
  If invuln=0  
    If bruteC()\x+16>Xgentil-1 And bruteC()\x+16<Xgentil+64; on teste à partir du milieu de bruteB, car faut pas être trop dur avec le joueur.
      If bruteC()\y+16>Ygentil-1 And bruteC()\y+16<Ygentil+64
        invuln=100:vie-1:transpboum=0:zoomY=0
      EndIf
    EndIf
  EndIf
    
Next

EndProcedure

Procedure.l Affichagetirbrute() ; Affichage des clones tirs ennemis bruteA
Static tempotb.b

If pause=0:tempotb+1:EndIf ; placé ici afin que l'animation des tirs ennemis soit tous synchronisés.
If tempotb>8:tempotb=1:EndIf

ForEach tirb()

  If pause=0:tirb()\y+4:EndIf
  If tempotb<5:DisplayTransparentSprite( #tirbruteA1 , tirb()\x, tirb()\y):EndIf
  If tempotb>4:DisplayTransparentSprite( #tirbruteA2 , tirb()\x, tirb()\y):EndIf 
  
  
;zutA+1
  ; ici, nous allons vérifier si un tir ennemi touche le gentil vaisseau du joueur, hum:
  If invuln=0  
    If tirb()\x>Xgentil-1 And tirb()\x<(Xgentil+64)-16
      If tirb()\y>Ygentil-1 And tirb()\y<(Ygentil+64)-16
        DeleteElement(tirb())
        invuln=100:vie-1:transpboum=0:zoomY=0

      EndIf
    EndIf
  EndIf
Next
ForEach tirb()
  If tirb()\y>EcranY:DeleteElement(tirb()):EndIf  
Next
EndProcedure

Procedure.l Affichagescorep()

ForEach scorep()

  If pause=0
    If scorep()\id<100:scorep()\y-1:EndIf ; brutes
    If scorep()\id=100:scorep()\y+1:EndIf ; soucoupe
    scorep()\clonetransp+4
    If scorep()\clonetransp>240:DeleteElement(scorep()):Continue:EndIf
  EndIf
  If scorep()\id=10
    DisplaySprite3D ( #pointA3D , scorep()\x, scorep()\y-2, 255-scorep()\clonetransp)   
  EndIf
  If scorep()\id=20
    DisplaySprite3D ( #pointB3D , scorep()\x, scorep()\y-2, 255-scorep()\clonetransp)   
  EndIf  
  If scorep()\id=30
    DisplaySprite3D ( #pointC3D , scorep()\x, scorep()\y-2, 255-scorep()\clonetransp)   
  EndIf  
  If scorep()\id=100
    DisplaySprite3D ( #pointD3D , scorep()\x, scorep()\y-2, 255-scorep()\clonetransp)   
  EndIf  
Next  

EndProcedure

Procedure.l Affichagebaoum()

ForEach baoum()

  If pause=0
    If baoum()\boutonA=0
      If baoum()\id=1 And baoum()\zoom<32:baoum()\zoom+6 ; p1
        If baoum()\zoom>31:baoum()\zoom=32:baoum()\boutonA=1:EndIf
      EndIf  
      If baoum()\id=2 And baoum()\zoom<48:baoum()\zoom+6 ; p2
        If baoum()\zoom>47:baoum()\zoom=48:baoum()\boutonA=1:EndIf
      EndIf
      If baoum()\id=3 And baoum()\zoom<64:baoum()\zoom+6 ; p3
        If baoum()\zoom>63:baoum()\zoom=64:baoum()\boutonA=1:EndIf
      EndIf      
    EndIf
    If baoum()\boutonA=1
      If baoum()\zoom>-32:baoum()\zoom-4
        If baoum()\zoom<-31:baoum()\zoom=-32:baoum()\boutonA=2:EndIf
      EndIf  
      If baoum()\clonetransp<200:baoum()\clonetransp+2:EndIf
    EndIf
    If baoum()\boutonA=2
      DeleteElement(baoum()):Continue 
    EndIf    
  EndIf ; If pause=0
  
  Sprite3DBlendingMode(5,10);2) ; claire  
  If baoum()\id=1
    ZoomSprite3D(#boun3D, 32+baoum()\zoom, 32+baoum()\zoom)      
    DisplaySprite3D ( #boun3D , baoum()\x-(baoum()\zoom/2), baoum()\y-(baoum()\zoom/2), 255-baoum()\clonetransp)
  EndIf
  If baoum()\id=2
    ZoomSprite3D(#boun3D, 48+baoum()\zoom, 48+baoum()\zoom)      
    DisplaySprite3D ( #boun3D , baoum()\x-(baoum()\zoom/2), baoum()\y-(baoum()\zoom/2), 255-baoum()\clonetransp)
  EndIf
  If baoum()\id=3
    ZoomSprite3D(#boun3D, 64+baoum()\zoom, 64+baoum()\zoom)      
    DisplaySprite3D ( #boun3D , baoum()\x-(baoum()\zoom/2), baoum()\y-(baoum()\zoom/2), 255-baoum()\clonetransp)
  EndIf    
  Sprite3DBlendingMode(5,6); de base
  
Next  

EndProcedure

Procedure.l Affichagelifeup()

ForEach lifeup()

  If pause=0
    lifeup()\y-1

    lifeup()\clonetransp+4
    If lifeup()\clonetransp>240:DeleteElement(lifeup()):Continue:EndIf
  EndIf
  DisplaySprite3D ( #ilifeup3D , lifeup()\x, lifeup()\y-2, 255-lifeup()\clonetransp)   
 
Next  

EndProcedure    
Dernière modification par beauregard le mer. 25/mars/2009 9:58, modifié 1 fois.
config de mon ordi: seven, directx11, Pentium(R) DualCore E5700, RadeonHD 4550 512MB, PureBasic 4.61 x86
Avatar de l’utilisateur
Huitbit
Messages : 939
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Message par Huitbit »

:D
Superfluide, aucune saccade, fps au max ou presque (58<fps<61), le ventilateur ne bronche pas.
Pour une fois que mon pc et ma carte graphique en carton digèrent quelque chose :P
Il ne manque que des *.wav et des *.mid (en "local" pourquoi pas ? :wink: )

Le petit post sur la fluidité des jeux 2D porte ses (premiers?) fruits :roll:

Bravo, bravissimo !

Cette nouvelle version met du panache à la section jeu :D

Hasta la vista !
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Message par beauregard »

Huitbit a écrit ::D
Superfluide, aucune saccade, fps au max ou presque (58<fps<61), le ventilateur ne bronche pas.
Pour une fois que mon pc et ma carte graphique en carton digèrent quelque chose :P
Il ne manque que des *.wav et des *.mid (en "local" pourquoi pas ? :wink: )

Le petit post sur la fluidité des jeux 2D porte ses (premiers?) fruits :roll:

Bravo, bravissimo !

Cette nouvelle version met du panache à la section jeu :D

Hasta la vista !
merci Huibit :) ta carte graphique est au moins en bois, puisqu'elle gère au moins 42 sprites3D de bonne taille, et sans fatigue ;) imagine le nombre d'amiga 500 qu'il faudrait pour égaler cette prouesse !
je ne suis pas très doué pour les bruitages, quand à la musique ben c'est pas mieux. Mais peut être qu'un jour, oui peut être qu'un membre du forum fera preuve d'initiative...

... et le ciel brillera ! ;)
config de mon ordi: seven, directx11, Pentium(R) DualCore E5700, RadeonHD 4550 512MB, PureBasic 4.61 x86
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Super boulot...exactement le meme que quand j'avais 17 ans.
Tout est fluide, je me serais cru dans un bar sur une table jeutel :D

Encore bravo et merci de ton partage 8)
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Message par beauregard »

Kwai chang caine a écrit :Super boulot...exactement le meme que quand j'avais 17 ans.
Tout est fluide, je me serais cru dans un bar sur une table jeutel :D

Encore bravo et merci de ton partage 8)
:)
Sous son emballage plastique, le beau jouet en 3D...
Image
Frenchy Pilou
Messages : 2194
Inscription : jeu. 27/janv./2005 19:07

Message par Frenchy Pilou »

On ne peut pas avoir un paquet tout enballé, un prêt à jouer?
Un exe ou similaire?
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Message par beauregard »

Frenchy Pilou a écrit :On ne peut pas avoir un paquet tout enballé, un prêt à jouer?
Un exe ou similaire?
un exe, mmh, un exe, pourquoi me demander un exe, mmh... alors, il suffit de faire un copier/coller vers un beau dossier, que tu aura nommé, heu, pbjeu par exemple, et heu attend, houlà, 1413 messages, 2005, c'est un grand ! Donc çà tu sais le faire, hum, hum...

C'est à dire que l'intérêt de ce forum c'est de mettre son code, d'en parler, puis de l'améliorer. Avec la version 0.6 ben au lieu d'afficher un très grand nombre de petits sprites, chacun représentant une étoile( et avec de belle petites saccades), ben maintenant ce sont de gros sprites3D, dans lesquels j'ai dessiné plein de petit points dedans... et sans utiliser clearscreen. Cet évolution du code fait donc suite au débat qui a eu lieu forum débutant, là:http://www.purebasic.fr/french/viewtopic.php?t=9127bonne lecture( 10 pages quand même) :)
config de mon ordi: seven, directx11, Pentium(R) DualCore E5700, RadeonHD 4550 512MB, PureBasic 4.61 x86
Frenchy Pilou
Messages : 2194
Inscription : jeu. 27/janv./2005 19:07

Message par Frenchy Pilou »

Oui, mais c'est juste pour gagner du temps, et puis de toute manière, il faudra bien en passer par là si il y a le désir de le mettre sur d'autres sites!
Les gens n'auront pas forcemment Pb pour le lancer ;)
Dernière modification par Frenchy Pilou le sam. 28/mars/2009 19:42, modifié 2 fois.
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Message par beauregard »

Frenchy Pilou a écrit :Oui, mis c'est juste pour gagner du temps, et puis de toute manière, il faudra bien passer par là si il y a le désir de le mettre sur d'autres sites!
Les gens n'auront pas forcemment Pb pour le lancer ;)
Je n'avais pas penser à cela, mmh quand le jeu sera plus avancé, on verra bien :)

Code : Tout sélectionner

la 2D est loin d’avoir dit son dernier mot
pb est fortiche avec la 2D, donc quand je tombe sur un jeu 2D, en HD qui plus est, j'ouvre grand les yeux:http://www.jeuxactu.com/article-36282-e ... f-xii.html
config de mon ordi: seven, directx11, Pentium(R) DualCore E5700, RadeonHD 4550 512MB, PureBasic 4.61 x86
Avatar de l’utilisateur
GallyHC
Messages : 1703
Inscription : lun. 17/déc./2007 12:44

Re: Vers l'infini 0.6

Message par GallyHC »

Bonjour,

Sa a l'air vraiment bien apar qu'avec la version 4.31 de purebasic sa a donne des erreurs de declaration... Je te proposerais bien de faire un zip et de mettre le tout sur mon site. Une partie de mon site est dedier au source en purebasic alors a toi de voir.

Je te donne toujours l'url, mais il faut creer un compte pour mettre une source mais l'avantage c que tout est dans le zip que tu uploaderas.

http://www.koakdesign.info/?url=04

Cordialement,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: Vers l'infini 0.6

Message par Le Soldat Inconnu »

vraiment extra :)

9550 points

le niveau 4 ne fonctionne pas par contre
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)]
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Re: Vers l'infini 0.6

Message par beauregard »

GallyHC a écrit :Bonjour,

Sa a l'air vraiment bien apar qu'avec la version 4.31 de purebasic sa a donne des erreurs de declaration... Je te proposerais bien de faire un zip et de mettre le tout sur mon site. Une partie de mon site est dedier au source en purebasic alors a toi de voir.

Je te donne toujours l'url, mais il faut creer un compte pour mettre une source mais l'avantage c que tout est dans le zip que tu uploaderas.

http://www.koakdesign.info/?url=04

Cordialement,
GallyHC
merci pour ta joyeuse proposition, je vais réfléchir. Avec le passage en 4.30, pour les procédure il faut remplacer les .l par les .i
Le Soldat Inconnu a écrit :vraiment extra :)

9550 points

le niveau 4 ne fonctionne pas par contre
oui, j'avais prévu de mettre un boss à intervalle régulière :)
config de mon ordi: seven, directx11, Pentium(R) DualCore E5700, RadeonHD 4550 512MB, PureBasic 4.61 x86
Répondre