PureBasic

Forums PureBasic
Nous sommes le Sam 24/Aoû/2019 5:34

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 15 messages ] 
Auteur Message
 Sujet du message: Vers l'infini 0.6
MessagePosté: Mar 24/Mar/2009 23:56 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 08/Juil/2007 18:32
Messages: 1307
Localisation: Toulouse
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:
envahisseurs

Image

enregister l'image png suivante sous le nom de
Code:
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):

_________________
config de mon ordi: seven, directx11, Pentium(R) DualCore E5700, RadeonHD 4550 512MB, PureBasic 4.61 x86


Dernière édition par beauregard le Mer 25/Mar/2009 0:12, édité 2 fois.

Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Vers l'infini 0.6
MessagePosté: Mar 24/Mar/2009 23:58 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 08/Juil/2007 18:32
Messages: 1307
Localisation: Toulouse
Code source principal( un fichier de sauvegarde sera fabriqué dans le dossier où vous enregistrerez ce code):
Code:
;
; 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


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Vers l'infini 0.6
MessagePosté: Mer 25/Mar/2009 0:00 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 08/Juil/2007 18:32
Messages: 1307
Localisation: Toulouse
1er code .pbi
Code:
;
; 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


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Vers l'infini 0.6
MessagePosté: Mer 25/Mar/2009 0:02 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 08/Juil/2007 18:32
Messages: 1307
Localisation: Toulouse
2eme code .pbi et c'est fini... bon test :)
Code:
;
; 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   

_________________
config de mon ordi: seven, directx11, Pentium(R) DualCore E5700, RadeonHD 4550 512MB, PureBasic 4.61 x86


Dernière édition par beauregard le Mer 25/Mar/2009 9:58, édité 1 fois.

Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: Mer 25/Mar/2009 4:44 
Hors ligne
Avatar de l’utilisateur

Inscription: Jeu 08/Déc/2005 5:19
Messages: 936
Localisation: Guadeloupe
: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 !


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: Mer 25/Mar/2009 21:30 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 08/Juil/2007 18:32
Messages: 1307
Localisation: Toulouse
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


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: Mer 25/Mar/2009 22:06 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 23/Sep/2006 18:32
Messages: 6644
Localisation: Isere
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)


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: Ven 27/Mar/2009 16:47 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 08/Juil/2007 18:32
Messages: 1307
Localisation: Toulouse
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


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: Sam 28/Mar/2009 1:53 
Hors ligne
Avatar de l’utilisateur

Inscription: Jeu 27/Jan/2005 19:07
Messages: 2194
On ne peut pas avoir un paquet tout enballé, un prêt à jouer?
Un exe ou similaire?


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: Sam 28/Mar/2009 13:48 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 08/Juil/2007 18:32
Messages: 1307
Localisation: Toulouse
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


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: Sam 28/Mar/2009 14:57 
Hors ligne
Avatar de l’utilisateur

Inscription: Jeu 27/Jan/2005 19:07
Messages: 2194
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 édition par Frenchy Pilou le Sam 28/Mar/2009 19:42, édité 2 fois.

Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: Sam 28/Mar/2009 15:14 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 08/Juil/2007 18:32
Messages: 1307
Localisation: Toulouse
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:
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-exclu-itw-masaaki-kukino-kof-xii.html

_________________
config de mon ordi: seven, directx11, Pentium(R) DualCore E5700, RadeonHD 4550 512MB, PureBasic 4.61 x86


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Vers l'infini 0.6
MessagePosté: Jeu 08/Oct/2009 19:51 
Hors ligne
Avatar de l’utilisateur

Inscription: Lun 17/Déc/2007 12:44
Messages: 1628
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

_________________
Image

Image

Image Official site of PureBasic
Image Official site of SpiderBasic

Configuration : Tower: Windows 7 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.62 (x86 et x64)


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Vers l'infini 0.6
MessagePosté: Jeu 08/Oct/2009 20:38 
Hors ligne
Avatar de l’utilisateur

Inscription: Mer 28/Jan/2004 20:58
Messages: 4312
Localisation: Clermont ferrand OU Olsztyn
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)]


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Vers l'infini 0.6
MessagePosté: Ven 09/Oct/2009 16:42 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 08/Juil/2007 18:32
Messages: 1307
Localisation: Toulouse
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


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 15 messages ] 

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 2 invités


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages

Rechercher:
Aller à:  

 


Powered by phpBB © 2008 phpBB Group | Traduction par: phpBB-fr.com
subSilver+ theme by Canver Software, sponsor Sanal Modifiye