source d'un petit jeux

Programmation avancée de jeux en PureBasic
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

source d'un petit jeux

Message par Backup »

en esperant que ce listing serve aux debutants a comprendre
les sprites , et le principe de base d'un jeux video en 2D

http://michel.dobro.free.fr/bidouilles/space_i.zip

:D
bernard13
Messages : 1221
Inscription : mer. 05/janv./2005 21:30

Message par bernard13 »

merci pour ce tuto

bon week end
bernard13
Messages : 1221
Inscription : mer. 05/janv./2005 21:30

Message par bernard13 »

ca marche pas
j'ai un message d'erreur :

purebasic 54140931.exe a causer une erreur
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

tu as mis midas11.dll dans le dossier "\PureBasic\Compilers" de pure basic ??
comme indiqué dans le listing et le fichier " a lire.txt "

faut virer aussi le "StopModule(0)" qui plante !!

il faut avoir la version 3.93 de pure !!



sinon y devrai pas y avoir de blem !! :D


quelqu'un d'autre a un problem avec ce code ?? 8O
bernard13
Messages : 1221
Inscription : mer. 05/janv./2005 21:30

Message par bernard13 »

j'ai mis midas11.dll dans le dossier "\PureBasic\Compilers" de pure basic
j'ai la version 3.93

mais j'ai pas trouver "StopModule(0)"
dreamind
Messages : 28
Inscription : dim. 16/janv./2005 23:34
Localisation : Toulouse/FRANCE

Message par dreamind »

Moi pour que ça marche j'ai été obligé de mettre

Code : Tout sélectionner

if init...
car sans les if il me disais que l'initialisation n'était pas effective

Je suis débutant donc ??????
bernard13
Messages : 1221
Inscription : mer. 05/janv./2005 21:30

Message par bernard13 »

moi ca marche pas
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

y a eu une confusion de ma part !!
je me suis planté d'archive
ils y avait space_i et space_i2
bien sur fallait lancé le space_i2 !!!

bon j'ai refait l'archive qui est dispo au mem endroit !!

j'en ai profiter pour corriger un petit bug !!

oui c'est vrai que j'ai pas tester toutes les initialisations !! :D

pour que ce soft marche faut avoir un joystick , je suis parti du fait que tout le monde en a un ! :D sinon faut virer tous ce qui concerne le joystick

(initialisation et le gosub dans la boucle principale !!)

voila en principe j'ai reverifié tout la c'est niquel !!

a retelecharger donc !! :lol:

desolé !! :?
bernard13
Messages : 1221
Inscription : mer. 05/janv./2005 21:30

Message par bernard13 »

ça marche il faut un joystick
la premiere fois ça marchais pas parceque j'avais pas brancher mon joystick .....

merci Dobro
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

de rien !

:D :D
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

voici une ammelioration du code (a utiliser avec les media deja en place)

ou bien retelecharger la nouvelle archive

donc voici pour ceux qui ont deja l'archive

l'amelioration concerne le tir du joueur !! :D

Code : Tout sélectionner


; ce programme a été realisé par Dobro
; en pure basic 3.93
; et codé grace a JAPBE version 2.5.3.2
; n'oubliez pas de mettre Midas11.dll dans le repertoire "\PureBasic\Compilers"
 ;- Message a Dobro
    ;{ ; Message de Dobro
           ; hello !
            ; je me suis amuser a programmer ce truc
            ; ce programme peut eventuellement servir d'exemple
            ; pour un debutant en programmation "Jeux 2D"
            ; il y a toutes les bases dedans
            ; animation de sprite , collision, utilisation des structures (simplifié)
            ; j'ai crée les sprites avec un soft de 3D celebre (3dsMax7 version de demo)
            ; les sons on ete piqué dans le dossier "media" de Dark Basic (ils sont libre en principe)
            ; Merci a Oliv pour sa version de text qui ondule fait en été 2004 (apres un petit chalenge entre nous !)
            ; pendant que beaucoups d'autres de la comunauté purebasic etaient en train de bronzer !! (grrrr)
            ;
            ; le but :
            ; des aliens debarquent du haut de l'ecran , et vous tirent dessus
            ; nous ont tire sur les aliens (apres tout ils ont commencé)
            ; reste a gerer un compteur de points avec sauvegarde du score (facile a faire)
            ; de temps en temps une boite (gellule dans le listing)
            ; descend du haut pour redonner de la vie
            ; attention on peut la detruire en tirant dessus
            ; c'est fait expres !! hé! hé!
            ;
           
            ; je veux pas que ce listing apparaisse
            ; sur l'espece de site , pseudo officiel "2Dev" 
            ; par contre ce listing peut apparaitre partout ailleurs !! :-D
           
            ;
            ; 
            ; et du programme qu'il genere
            ; ammeliorez le , changez le , eclatez vous !!
            
            ; j'ai toujours pas de connection internet digne de ce nom
            ; je passe de temps en temps sur le forum
            ; pour me tenir au courant
            ; j'ai une autre passion qui se met en route
            ; la "detection"
            ; si! si! vous savez ces petit appareils qui valent une fortune
            ; qui permettent de detecter les metaux precieux ou pas 
            ; planqué dans le sol par nos ancetre !!
            ; vous avez du voir ces gens sur les plage en train de chgercher des bijoux
            ; ben ce loisir peut se pratiquer n'importe ou (ou presque)
            ; dans les bois , les pres
            ; "et on entend dans les champ........"
            ; comme quoi mem privé d'internet on peut vivre des moment agreable !!
            
            
            ; amitié a tous !! ....
            
            ;... Michel 
            
      ; le module (musique) est de Bruno's Music Box 3 
      ; n'oubliez pas de mettre Midas11.dll dans le repertoire "\PureBasic\Compilers"
      ; pour en profiter 
      ; la routine d'ondulation de text est la creation d'un "QI 250" :Oliv !!! 
    ;}

Declare TimerProc(hwnd.l, uMsg.l, idEvent.l, dwTime.l)
Declare Ondulation(Texte.s,r,v,b) 
FontID = LoadFont(0, "Tahoma", 10, #PB_Font_HighQuality)
;- Initialisations
;{ ; INITs

UseJPEGImageDecoder()


Global  vitt1, vitt2, vitt3,vittx_missile3,vitt3,x_joueur,y_joueur
;{;chargement des images pour les Sprites
id_vaisseau_joueur = LoadImage( 1, "vaisseau_joueur.bmp") ; vaisseau joueur
id_vaisseau_joueur_droit = LoadImage( 2, "vaisseau_joueur2_droite.bmp") ; vaisseau joueur
id_vaisseau_joueur_gauche= LoadImage( 3, "vaisseau_joueur2_gauche.bmp") ; vaisseau joueur

id_missile_base=LoadImage(4 , "missile_base1.bmp") ; missile_base
;id_missile_base2=LoadImage(5 , "missile_base2.bmp") ; missile_base

id_sprite_ennemi1=LoadImage(6 , "vaisseau_ennemi1.bmp") ; vaisseau ennemi1
id_sprite_ennemi2=LoadImage(7 , "vaisseau_ennemi2.bmp") ; vaisseau ennemi2
id_sprite_ennemi3=LoadImage(8, "vaisseau_ennemi3.bmp") ; vaisseau ennemi3
id_missile_ennemi1=LoadImage(9, "missile_ennemi1.bmp") ; missile ennemi1
id_missile_ennemi2=LoadImage(10, "missile_ennemi2.bmp") ; missile ennemi2
id_missile_ennemi3=LoadImage(11, "missile_ennemi3.bmp") ; missile ennemi3
;}

;{ charge l'explosion
Dim   id_explosion(50) 
For t=12 To 44
        id_explosion(t)=LoadImage(t, "explosion"+Str(t-12)+".bmp")
Next t
;}

;{charge gellule_vie
id_gellule_vie=LoadImage(45, "gellule_vie.bmp") ; 
;}





;{; initialisation des variables et constantes
#dobro=1
#Police=1
nbr=0
nbspritefond=500

sprite_vaiseau_fond=nbspritefond+1 ; 501
sprite_joueur_g=nbspritefond+2 ; 502
sprite_joueur_d=nbspritefond+3 ;503
sprite_joueur=nbspritefond+4 ;504

missile_base2=nbspritefond+6 ;506


base_ennemi1=nbspritefond+10 ; de 510
fin_ennemi1=base_ennemi1+10 ; a 520

base_ennemi2=nbspritefond+30 ; de 530
fin_ennemi2=base_ennemi2+10 ; a 540

base_ennemi3=nbspritefond+50 ; de 550
fin_ennemi3=base_ennemi3+10 ; a 560

base_missile_ennemi1=nbspritefond+70 ; de 570
fin_missile_ennemi1=base_missile_ennemi1+10 ; a 580

base_missile_ennemi2=nbspritefond+90 ; de 590
fin_missile_ennemi2=base_missile_ennemi2+10 ; a 600

base_missile_ennemi3=nbspritefond+110 ; de 610
fin_missile_ennemi3=base_missile_ennemi3+10 ; a 620

base_explosion=nbspritefond+130 ; de 630
fin_explosion=base_explosion+32 ; a 662

sprite_gellule_vie=nbspritefond+165 ; 665

missile_base=nbspritefond+170 ;670
fin_missile_base=missile_base+50 ;720
; OLIV

; Variables
#pi=3.14159265
#HauteurSin = 10 ; Coef qui joue sur la hauteur de la sinusoide
#LargeurSin = 20 ; Coef qui joue sur la largeur de la sinusoide
#VitesseAngle =  2 * #pi / 50 ; vitesse de modification de l'angle de départ du texte
#Vitesse = 25 ; Temps du Delay() qui ralentit/augmente l'animation.

Global Angle.f, FontID


;}

;{; les STRUCTURES
Structure ennemi_1
        x.w
        y.w 
        vie.w  
EndStructure


Structure ennemi_2
        x.w
        y.w 
        vie.w 
EndStructure


Structure ennemi_3
        x.w
        y.w 
        vie.w 
EndStructure

Structure missile_ennemi_1
        x.w
        y.w
        vie.w 
        vittx.w
        vitty.w
EndStructure
Structure missile_ennemi_2
        x.w
        y.w
        vie.w 
        vittx.w
        vitty.w
EndStructure
Structure missile_ennemi_3
        x.w
        y.w
        vie.w 
        vittx.w
        vitty.w
EndStructure

Structure joueur
        x.w
        y.w 
        vie.w  
EndStructure


Structure missile_joueur
        x.w
        y.w
        vie.w 
EndStructure

Structure fond
        x.w
        y.w 
        vittx.w
        vitty.w 
EndStructure

Structure explose
        x.w
        y.w 
        vie.w  
EndStructure

Structure gellule_vie
        x.w
        y.w
        vie.w 
EndStructure
;}

;{; Les TABLEAUX
; ; Fond
Dim fond.fond(1024)


; joueur
Dim joueur.joueur(1)
Dim missile_joueur.missile_joueur(50)
Dim explosion_j(50)
Dim   x_explosion(50)
Dim   y_explosion(50)
; missile ennemi
Dim missile_ennemi1.missile_ennemi_1(10)
Dim missile_ennemi2.missile_ennemi_2(10)
Dim missile_ennemi3.missile_ennemi_3(10)




; ennemi1
Dim ennemi1.ennemi_1(10)
; ennemi2
Dim ennemi2.ennemi_2(10)
; ennemi3
Dim ennemi3.ennemi_3(10)



Dim explosion.explose(10)

Dim gellule_vie.gellule_vie(1)

; ; chemin precalculé 1
; Dim chemin1(10000)
;}

;{ initialisation Fenetre et clavier et joystick

InitKeyboard() :; j'espere qu'il y a un clavier au moins !!
Resultat = InitJoystick()
Resultat = InitSound()
If InitModule() = 0
        MessageRequester("Error", "MIDAS11.dll pas present !") : End
EndIf

; ***********************************
Resultat = InitSprite()
FontID = LoadFont(#Police, "arial", 18, #PB_Font_Bold )
EcranX = GetSystemMetrics_(#SM_CXSCREEN)-100:;=largeur de l'ecran
EcranY = GetSystemMetrics_(#SM_CYSCREEN)-100:;=hauteur de l'ecran
WindowID = OpenWindow(1, 0, 0, EcranX, EcranY,  #PB_Window_SystemMenu |#PB_Window_MinimizeGadget| #PB_Window_BorderLess |#PB_Window_ScreenCentered , "Space_i Programmé par Dobro en Purebasic 3.93") 
    
    WindowID = WindowID(1) 
    Result = OpenWindowedScreen(WindowID,0,0, EcranX, EcranY, 1, 0,0)
    KeyboardMode(1) 
   ;} 
    
    ;{; Charge les sons
    LoadSound(1, "explose.wav")
    LoadSound(2, "joueur_mort.wav")
    LoadSound(3, "reanime.wav")
    LoadSound(4, "tir_ennemi_1.wav")
    LoadSound(5, "tir_ennemi_2.wav")
    LoadSound(6, "tir_ennemi_3.wav")
    LoadSound(7, "tir_joueur.wav")
    ;}
    
    ;{; Charge la musique
    LoadModule(0, "FREE_FRO.MOD") 
    ;}
     
    ;{;GACHETTE_TIMER 
   ;- GACHETTE_TIMER 
    SetTimer_(WindowID, 1, 20, @TimerProc()) ; envoie un evenement cadence de tir (vaisseau 1)
    SetTimer_(WindowID, 2, 500, @TimerProc()) ; envoie un evenement toutes les 800 millisecondes (apparition ennemi)
    SetTimer_(WindowID, 3, 50, @TimerProc()) ; envoie un evenement cadence de tir  (vaisseau 2)
    SetTimer_(WindowID, 4, 100, @TimerProc()) ; envoie un evenement cadence de tir (vaisseau 3)
    SetTimer_(WindowID, 5, 30000, @TimerProc()) ; envoie un evenement pour apparition d'une gellule de vie
    ;}
    
    ;{ ************ precalcul des colonnes pour affichage des ennemis ********************
    For uu=0 To 10
             ennemi1(uu)\x=64+Random(EcranX-128)-64 ; test
             ennemi1(uu)\y=0 ; test
             ennemi2(uu)\x=64+Random(EcranX-128)-64  ; test
             ennemi2(uu)\y=0 ; test
             ennemi3(uu)\x=64+Random(EcranX-128) -64 ; test
             ennemi3(uu)\y=0 ; test
             gellule_vie(1)\x=64+Random(EcranX-128) -64
    Next uu
    ;}; **********************************************************************************************
     ;- dessin des etoiles (fond)
    ;{ ; creation des etoiles (fond)
    For sprite=1 To nbspritefond
            CreateSprite(sprite, 2, 2,0)
            StartDrawing( SpriteOutput(sprite) )  
                    Box(0, 0, 2, 2,RGB(Random(255)-150,Random(255)-150,Random(255)-150)) 
            StopDrawing() 
            fond(sprite)\x=Random(EcranX) : fond(sprite)\y=Random(EcranY)
    Next sprite
    ;}
     
    ;{; creation du sprite joueur 
    CreateSprite(sprite_joueur, 64, 64,0)
    StartDrawing( SpriteOutput(sprite_joueur) )   
            DrawImage(id_vaisseau_joueur, 0, 0 ) 
    StopDrawing()  
    ;}
    
    ;{; creation du sprite missile_base
    For a=missile_base To fin_missile_base
            CreateSprite(a, 16,32,0)
            StartDrawing( SpriteOutput(a) )   
                    DrawImage( id_missile_base, 0, 0 )  
            StopDrawing()   
    Next a
    ;}
    
     ;{; creation du sprite missile_base2
    ; CreateSprite(missile_base2, 16,16,0)
    ; StartDrawing( SpriteOutput(missile_base2) )   
            ; DrawImage( id_missile_base2, 0, 0 ) 
    ; StopDrawing()   
     ;}
    
    ;{; creation du sprite joueur droit
    CreateSprite(sprite_joueur_d, 64, 64,0)
    StartDrawing( SpriteOutput(sprite_joueur_d) )   
            DrawImage( id_vaisseau_joueur_droit , 0, 0 ) 
    StopDrawing()  
    ;}
    
    ;{; creation du sprite joueur gauche
    CreateSprite(sprite_joueur_g, 64, 64,0)
    StartDrawing( SpriteOutput(sprite_joueur_g) )   
            DrawImage( id_vaisseau_joueur_gauche , 0, 0 ) 
    StopDrawing()  
    ;}
  
    ;{; creation du sprite ennemi1
    For t=base_ennemi1 To fin_ennemi1 
            CreateSprite(t, 64, 64,0) 
            StartDrawing( SpriteOutput(t) )   
                    DrawImage(id_sprite_ennemi1, 0, 0 )  
            StopDrawing()  
    Next t
    ;}
    
    ;{; creation du sprite ennemi2
    For t=base_ennemi2 To fin_ennemi2
            CreateSprite(t, 64, 64,0)
            StartDrawing( SpriteOutput(t) )   
                    DrawImage(id_sprite_ennemi2, 0, 0 )  
            StopDrawing()  
    Next t
    ;}
    
    ;{; creation du sprite ennemi3
    For t=base_ennemi3 To fin_ennemi3
            CreateSprite(t, 64, 64,0)
            StartDrawing( SpriteOutput(t) )   
                    DrawImage(id_sprite_ennemi3, 0, 0 ) 
            StopDrawing()  
    Next t
    ;}
    
    ;{; creation du sprite missile_ennemi1
    For t1=base_missile_ennemi1 To fin_missile_ennemi1
            CreateSprite(t1, 16, 32,0)
            StartDrawing( SpriteOutput(t1) )   
                    DrawImage(id_missile_ennemi1, 0, 0 ) 
            StopDrawing()  
    Next t1
    ;}
    
    ;{; creation du sprite missile_ennemi2
    For t2=base_missile_ennemi2 To fin_missile_ennemi2
            CreateSprite(t2, 32, 32,0)
            StartDrawing( SpriteOutput(t2) )   
                    DrawImage(id_missile_ennemi2, 0, 0 ) 
            StopDrawing()  
    Next t2
    ;}
    
    ;{; creation du sprite missile_ennemi3
    For t3=base_missile_ennemi3 To fin_missile_ennemi3
            CreateSprite(t3, 32, 32,0)
            StartDrawing( SpriteOutput(t3) )   
                    DrawImage(id_missile_ennemi3, 0, 0 )  
            StopDrawing()  
    Next t3
    ;}
     
    ;{; creation du sprite explosion 
    For im= base_explosion To fin_explosion
             CreateSprite(im, 64, 64,0)
            StartDrawing( SpriteOutput(im) ) 
                    att=im-618
                    DrawImage(id_explosion(att), 0, 0 ) 
            StopDrawing()   
    Next im
    ;}
    
    ;{; creation du sprite gellule_vie  
            CreateSprite(sprite_gellule_vie, 64, 64,0)
            StartDrawing( SpriteOutput(sprite_gellule_vie) )  
                    DrawImage(id_gellule_vie, 0, 0 ) 
            StopDrawing()   
    ;}
     
    ;{; attribue 15 vies au joueur
        joueur(1)\vie=15
        joueur(1)\x=(EcranX/2)-64
        joueur(1)\y=EcranY-64 
    ;}
    
   ;}
     
      PlayModule(0)   
    ;-Boucle principale
    ;{ ;boucle_principale
    Repeat 
            Event=WindowEvent()
            Delay(2)
            ; l'ordre d'affichage des sprites determine leur hauteur !!
            Gosub   test_clavier
            Gosub   test_joystick
            Gosub   affiche_sprite_fond 
            Gosub   tir_joueur  
            Gosub   affiche_sprite_ennemis 
            Gosub   affiche_sprite_joueur 
            Gosub collision 
            Gosub affiche_explosion
            Gosub   hazard
            Gosub affiche_gellule_vie
            If mort=1 And compteur<=200
                    SetTimer_(WindowID, 1, 100000, @TimerProc()) ; envoie un evenement cadence de tir (vaisseau 1)
                    SetTimer_(WindowID, 2, 100000, @TimerProc()) ; envoie un evenement  (apparition ennemi)
                    SetTimer_(WindowID, 3, 100000, @TimerProc()) ; envoie un evenement cadence de tir  (vaisseau 2)
                    SetTimer_(WindowID, 4, 100000, @TimerProc()) ; envoie un evenement cadence de tir (vaisseau 3)
                    SetTimer_(WindowID, 5, 100000, @TimerProc()) ; envoie un evenement pour apparition d'une gellule de vie
                    Ondulation("tu es mort    c'est dommage   non ???? ",255,255,255) 
                    compteur=compteur+1 
                    ; ******** on remet les variable a 0 ********
                    explosion1=0: explosion2=0: explosion3=0: explosion5=0: explosion6=0: explosion7=0: explosion8=0: explosion9=0: explosion10=0
                    For eneo=0 To 10
                            ennemi1(eneo)\vie=0
                            ennemi2(eneo)\vie=0
                            ennemi3(eneo)\vie=0 
                    Next eneo 
                    ; *********************************************
            EndIf   
            If  mort=1 And compteur>200
                    Ondulation("appuis sur    escape    pour   recommencer ",255,255,0) 
            EndIf 
            
            FlipBuffers():; affiche l'ecran 
            ClearScreen(0, 0, 0) :;efface l'ecran
            direction=0 
    Until Event=#PB_Event_CloseWindow 
    End
    
    ;}
    
    ;- sous program !! ***************************************
    ;{ ; ************************ sous prg *************************************************
    
    ;{;    test_clavier:
    test_clavier:
    ; remet les variable a zero avant observetion
    ; feu=0 ; la variable qui commande le tir
    
    ; ************************************************
    ExamineKeyboard()  
    If  mort=0 ; le joueur vit toujours ?
            If KeyboardPushed( #PB_Key_Up )   ; press touche haut
                    ;  Debug "press touche haut"
                    joueur(1)\y=joueur(1)\y-16
            If   joueur(1)\y<0:  joueur(1)\y=0:EndIf  
            EndIf 
            If KeyboardPushed(  #PB_Key_Down  )   ; press touche bas
                    ; Debug " press touche bas"
                    joueur(1)\y= joueur(1)\y+16
            If joueur(1)\y>EcranY-64: joueur(1)\y=EcranY-64:EndIf 
            EndIf 
            If KeyboardPushed( #PB_Key_Left  )   ; press touche gauche
                    ;Debug " press touche gauche"
                    joueur(1)\x= joueur(1)\x-16
            If   joueur(1)\x<0:   joueur(1)\x=0:EndIf 
                    direction=1
                    DisplayTransparentSprite(sprite_joueur_g,  joueur(1)\x,    joueur(1)\y) 
            EndIf 
            If KeyboardPushed(  #PB_Key_Right  )   ; press touche droit
                    ;Debug " press touche droit"
                    joueur(1)\x=joueur(1)\x+16
            If   joueur(1)\x>EcranX-64:   joueur(1)\x=EcranX-64:EndIf 
                    direction=1
                    DisplayTransparentSprite(sprite_joueur_d,   joueur(1)\x,  joueur(1)\y) 
            EndIf 
            
            If KeyboardPushed(  #PB_Key_Space )   ; press touche espace (feu)
                    ;Debug " press touche espace"   
                    missile_joueur(iip)\x= joueur(1)\x+24 ; recup la position X du joueur
                    missile_joueur(iip)\y= joueur(1)\y ; recup la position Y du joueur  
                    missile_joueur(iip)\vie=1 ; active le missile joueur
                    compteur_tir=compteur_tir+1
                    If compteur_tir>5 ; ceci evite d'entendre trop souvent le son du tir du joueur
                            compteur_tir=0
                            PlaySound(7)
                    EndIf
                    iip=iip+1 ; augmente le compteur de missile joueur (0 a 50)
                    If iip>50 :iip=0:EndIf
            EndIf    
    EndIf
    If KeyboardReleased(  #PB_Key_Escape ) And mort=1   ; press touche escape (reanime le joueur)
            ;Debug " press touche escape"  
            joueur(1)\x=(EcranX/2)-64 ; place sur l'ecran du joueur
            joueur(1)\y=EcranY-64
            joueur(1)\vie=15 ; active le joueur
            mort=0
            compteur=0
            ; relance les timers
            SetTimer_(WindowID, 1, 20, @TimerProc()) ; envoie un evenement cadence de tir (vaisseau 1)
            SetTimer_(WindowID, 2, 500, @TimerProc()) ; envoie un evenement toutes les 800 millisecondes (apparition ennemi)
            SetTimer_(WindowID, 3, 50, @TimerProc()) ; envoie un evenement cadence de tir  (vaisseau 2)
            SetTimer_(WindowID, 4, 100, @TimerProc()) ; envoie un evenement cadence de tir (vaisseau 3)
            SetTimer_(WindowID, 5, 30000, @TimerProc()) ; envoie un evenement pour apparition d'une gellule de vie
             PlaySound(3)
    EndIf   

    Return 
    ;} 
    
    ;{ ; test_joystick
    test_joystick:
            ExamineJoystick() 
            joyx=JoystickAxisX()
            If mort=0
                    If   joyx  =-1   ; joystick vers la gauche
                            joueur(1)\x=  joueur(1)\x-16
                    If  joueur(1)\x<0:  joueur(1)\x=0:EndIf 
                            direction=1
                            DisplayTransparentSprite(sprite_joueur_g,  joueur(1)\x,   joueur(1)\y)  
                    EndIf
                    If   joyx =1   ; joystick vers la droite  
                            joueur(1)\x=  joueur(1)\x+16
                    If  joueur(1)\x>EcranX-64:  joueur(1)\x=EcranX-64:EndIf 
                            direction=1
                            DisplayTransparentSprite(sprite_joueur_d,  joueur(1)\x,   joueur(1)\y)  
                    EndIf
                    
                    joyy=JoystickAxisY()
                    If   joyy  =-1   ; joystick vers la gauche
                            joueur(1)\y=  joueur(1)\y-16
                    If   joueur(1)\y<0:  joueur(1)\y=0:EndIf 
                            direction=1
                            DisplayTransparentSprite(sprite_joueur_g,  joueur(1)\x,   joueur(1)\y)  
                    EndIf
                    If   joyy =1   ; joystick vers la droite  
                            joueur(1)\y=  joueur(1)\y+16
                    If  joueur(1)\y>EcranY-64:  joueur(1)\y=EcranY-64:EndIf 
                            direction=1
                            DisplayTransparentSprite(sprite_joueur_d,  joueur(1)\x,   joueur(1)\y)  
                    EndIf
                    
                    boutton=JoystickButton(1)  ; on regarde le bouton 1 (sur 8 )
                    If boutton<>0
                            iip=iip+1
                    If iip>50 :iip=1:EndIf
                            missile_joueur(iip)\x=x_joueur+24 ; releve la position X du joueur
                            missile_joueur(iip)\y=y_joueur ; releve la position Y du joueur  
                            missile_joueur(iip)\vie=1  
                    EndIf 
            EndIf
    Return 
    ;} 
    ;{ ;  affiche_sprite_fond etoile:
    affiche_sprite_fond:
    For sprite=1 To nbspritefond-3 Step 3
            DisplaySprite(sprite,  fond(sprite)\x,  fond(sprite)\y) 
            fond(sprite)\y= fond(sprite)\y+1
            If  fond(sprite)\y>=EcranY
                     fond(sprite)\y=1
            EndIf 
    Next sprite
    For sprite=2 To nbspritefond-3 Step 3
            DisplaySprite(sprite,  fond(sprite)\x,  fond(sprite)\y) 
            fond(sprite)\y= fond(sprite)\y+2
            If  fond(sprite)\y>=EcranY
                     fond(sprite)\y=1
            EndIf 
    Next sprite
    For sprite=3 To nbspritefond-3 Step 3
            DisplaySprite(sprite,  fond(sprite)\x,  fond(sprite)\y) 
             fond(sprite)\y= fond(sprite)\y+3
            If  fond(sprite)\y>=EcranY
                     fond(sprite)\y=1
            EndIf 
    Next sprite
    Return
    ;}
    ;{;  affiche_sprite_joueur:
    affiche_sprite_joueur:
            If  direction=0 
                    If joueur(1)\vie>0
                            DisplayTransparentSprite(sprite_joueur,  joueur(1)\x,   joueur(1)\y) 
                    EndIf 
                    If joueur(1)\vie<=0
                            joueur(1)\y=EcranY+164 ; on met le joueur en dehors de l'ecran 
                            mort=1 ; sert a desactiver le clavier et le joystic 
                    EndIf 
            EndIf 
    Return
    ;}
    ;{;  tir_joueur:   
    tir_joueur:    
                For tot=0 To iip
                        If missile_joueur(tot)\vie=1 ; si le missile est actif (il a ete tiré)
                                DisplaySprite(missile_base+tot, missile_joueur(tot)\x, missile_joueur(tot)\y)  ; on l'affiche 
                                pas=Random(1)*8 ; avec un ecartement variant
                                missile_joueur(tot)\y=missile_joueur(tot)\y-16 ; sinon il monte vers le haut (le tt decale l'affichage )
                                If missile_joueur(tot)\y<=0 ; arrive en haut de l'ecran
                                        missile_joueur(tot)\y=EcranY+65 ; on le met hors de la vue (en bas)
                                        missile_joueur(tot)\vie=0 ; on le desactive
                                EndIf  
                        EndIf
                Next tot 
    Return
    ;}
    ;{;affiche_sprite_ennemis:  
    affiche_sprite_ennemis:  
            vitt1=8 ; vitesse de descente du sprite ennemi 1
            Gosub   affiche_missile_ennemi1
            For ttt1=0 To 10 Step 1 
                    If   ennemi1(ttt1)\vie=1
                            ennemi1(ttt1)\y=ennemi1(ttt1)\y+vitt1 
                            DisplayTransparentSprite(ttt1+510, ennemi1(ttt1)\x,  ennemi1(ttt1)\y) 
                            If ennemi1(ttt1)\y> EcranY
                                    ennemi1(ttt1)\vie=0
                            EndIf
                    EndIf 
            Next ttt1
        
            vitt2=4 ; vitesse de descente du sprite ennemi 2
            Gosub   affiche_missile_ennemi2
            For ttt2=0 To 10 Step 1 
                    If  ennemi2(ttt2)\vie=1
                        ennemi2(ttt2)\y=ennemi2(ttt2)\y+vitt2 
                            DisplayTransparentSprite(ttt2+530, ennemi2(ttt2)\x,  ennemi2(ttt2)\y) 
                            If ennemi2(ttt2)\y> EcranY
                                    ennemi2(ttt2)\vie=0
                            EndIf
                    EndIf 
            Next ttt2
            
            vitt3=4 ; vitesse de descente du sprite ennemi 3
            Gosub   affiche_missile_ennemi3
            For ttt3=0 To 10 Step 1 
                    If  ennemi3(ttt3)\vie=1
                            ennemi3(ttt3)\y=ennemi3(ttt3)\y+vitt3
                            DisplayTransparentSprite(ttt3+550, ennemi3(ttt3)\x,  ennemi3(ttt3)\y) 
                            
                            If ennemi3(ttt3)\y> EcranY
                                    ennemi3(ttt3)\vie=0
                            EndIf
                    EndIf 
            Next ttt3
    Return
    ;}
    
    ;{; affiche_missile_ennemi1: 
        affiche_missile_ennemi1: 
        For tta=0 To iipa Step 1   
                If   missile_ennemi1(tta)\vie=1 
                        DisplaySprite(tta+570, missile_ennemi1(tta)\x, missile_ennemi1(tta)\y+8)     
                        missile_ennemi1(tta)\y=missile_ennemi1(tta)\y+vitt1+16 ; sinon il descend vers le bas (vitesse de descente)
                        If missile_ennemi1(tta)\y>=EcranY ; arrive en bas de l'ecran
                                missile_ennemi1(tta)\y=EcranY+65 ; on le met hors de la vue (en bas) 
                                missile_ennemi1(tta)\vie=0 
                        EndIf  
                EndIf
        Next tta
        Return
    ;}    
        
    ;{; affiche_missile_ennemi2: 
         affiche_missile_ennemi2: 
        For ttb=0 To iipb  Step 1  
                If   missile_ennemi2(ttb)\vie=1 
                        DisplaySprite(ttb+590, missile_ennemi2(ttb)\x, missile_ennemi2(ttb)\y+13)     
                       ; ymiss_ennemi2(ttb)=ymiss_ennemi2(ttb)+vitt2+16 ; sinon il descend vers le bas (vitesse de descente) 
                        ; ***** cherche a toucher le joueur ***** 
                        missile_ennemi2(ttb)\x=missile_ennemi2(ttb)\x+missile_ennemi2(ttb)\vittx
                        missile_ennemi2(ttb)\y=missile_ennemi2(ttb)\y+missile_ennemi2(ttb)\vitty 
                        ; ************************     
                        
                        If missile_ennemi2(ttb)\y>=EcranY ; arrive en bas de l'ecran
                                missile_ennemi2(ttb)\y=EcranY+65 ; on le met hors de la vue (en haut) 
                                missile_ennemi2(ttb)\vie=0 
                        EndIf   
                EndIf 
        Next ttb 
        Return
            ;}  
        
    ;{; affiche_missile_ennemi3: 
         affiche_missile_ennemi3: 
        For ttc=0 To iipc  Step 1 
                If   missile_ennemi3(ttc)\vie=1 
                        DisplaySprite(ttc+610, missile_ennemi3(ttc)\x, missile_ennemi3(ttc)\y+13)    
                      ;  ymiss_ennemi3(ttc)=ymiss_ennemi3(ttc)+vitt3+16 ; sinon il descend vers le bas (vitesse de descente) 
                        ; ***** cherche a toucher le joueur ***** 
                        missile_ennemi3(ttc)\x=missile_ennemi3(ttc)\x+missile_ennemi3(ttc)\vittx
                        missile_ennemi3(ttc)\y=missile_ennemi3(ttc)\y+missile_ennemi3(ttc)\vitty 
                        ; ************************     
                        
                        If missile_ennemi3(ttc)\y>=EcranY ; arrive en bas de l'ecran
                                missile_ennemi3(ttc)\y=EcranY+65 ; on le met hors de la vue (en haut) 
                               missile_ennemi3(ttc)\vie=0 
                        EndIf   
                EndIf 
        Next ttc 
        Return
    ;}
        
    ;{; affiche_explosion: 
        affiche_explosion:   
        If   explosion1=1  
                DisplaySprite(base_explosion+ss1, x_explosion1, y_explosion1+13)  
        ss1=ss1+1 :If ss1=32:ss1=0:explosion1=0: EndIf
        EndIf 
        If   explosion2=1  
                DisplaySprite(base_explosion+ss2, x_explosion2, y_explosion2+13)  
        ss2=ss2+1 :If ss2=32:ss2=0:explosion2=0: EndIf
        EndIf 
        If   explosion3=1  
                DisplaySprite(base_explosion+ss3, x_explosion3,y_explosion3+13)  
        ss3=ss3+1 :If ss3=32:ss3=0:explosion3=0: EndIf
        EndIf 
        If   explosion4=1  
                DisplaySprite(base_explosion+ss4, x_explosion4,y_explosion4+13)  
        ss4=ss4+1 :If ss4=32:ss4=0:explosion4=0: EndIf
        EndIf 
        If   explosion5=1  
                DisplaySprite(base_explosion+ss5, x_explosion5,y_explosion5+13)  
        ss5=ss5+1 :If ss5=32:ss5=0:explosion5=0: EndIf
        EndIf 
        If   explosion6=1  
                DisplaySprite(base_explosion+ss6, x_explosion6,y_explosion6+13)  
        ss6=ss6+1 :If ss6=32:ss6=0:explosion6=0: EndIf
        EndIf 
        If   explosion7=1  
                DisplaySprite(base_explosion+ss7, x_explosion7,y_explosion7+13)  
        ss7=ss7+1 :If ss7=32:ss7=0:explosion7=0: EndIf
        EndIf 
        
        For jjj=0 To 50  ; on examine les 50 missiles du joueur
                If   explosion_j(jjj)=1  
                        DisplaySprite(base_explosion+ss8, x_explosion(jjj),y_explosion(jjj)+13)  
                ss8=ss8+1 :If ss8=32:ss8=0:explosion_j(jjj)=0: EndIf
                EndIf 
                
                ; If   explosion9=1  
                        ; DisplaySprite(base_explosion+ss9, x_explosion9,y_explosion9+13)  
                ; ss9=ss9+1 :If ss9=32:ss9=0:explosion9=0: EndIf
                ; EndIf 
                ; If   explosion10=1  
                        ; DisplaySprite(base_explosion+ss10, x_explosion10,y_explosion10+13)  
                ; ss10=ss10+1 :If ss10=32:ss10=0:explosion10=0: EndIf
                ; EndIf 
        Next jjj

        
        Return
        ;}
         
   ;{; lit_chemin:
    lit_chemin: 
    ; Resultat = OpenFile(1, "chemin.ini")
    ; While Eof(1)=0 :; tant que fin de fichier pas atteinte  
            ; coord= ReadWord() :;lit la coordonee x
            ; chemin1(ind)= coord 
            ; ind=ind+1
    ; Wend 
    Return
    
   ;}
     
   ;{; collision
    collision:
    For ddcol=0 To 10 ; il y a 10 missile par ennemi et aussi 10 ennemi par type (1 ou 2 ou 3)
            ; collision  vaisseau joueur avec vaisseau ennemi1  
            If  SpritePixelCollision(sprite_joueur, joueur(1)\x, joueur(1)\y, 510+ddcol, ennemi1(ddcol)\x, ennemi1(ddcol)\y) <>0 And ennemi1(ddcol)\y>0;touche le sprite joueur  
                    explosion1=1 ; active l'explosion
                    x_explosion1=ennemi1(ddcol)\x ; recupere les coordonées de l'ennemi pour afficher l'explosion
                    y_explosion1=ennemi1(ddcol)\y   ; au bon endroits
                    ennemi1(ddcol)\x=Random(2000) ; vire le sprite (ses coordonées)
                    ennemi1(ddcol)\y=-Random(2000) ; en dehors de l'ecran
                    ennemi1(ddcol)\vie=0 ; tue le sprite qui a touché le joueur 
                    joueur(1)\vie=joueur(1)\vie-1 ;retire une vie au joueur 
                     PlaySound(1)
            EndIf
; 
            ; collision  vaisseau joueur avec vaisseau ennemi2 
            If  SpritePixelCollision(sprite_joueur, joueur(1)\x, joueur(1)\y, ddcol+530, ennemi2(ddcol)\x, ennemi2(ddcol)\y)<>0 And ennemi2(ddcol)\y>0;touche le sprite joueur  
                    explosion2=1 ; active l'explosion
                    x_explosion2=ennemi2(ddcol)\x ; recupere les coordonées de l'ennemi pour afficher l'explosion
                    y_explosion2=ennemi2(ddcol)\y   ; au bon endroits
                    ennemi2(ddcol)\x=Random(2000)  ; vire le sprite (ses coordonées)
                    ennemi2(ddcol)\y=-Random(2000) ; en dehors de l'ecran (pour plus qu'il le considere dans la collision) .. (And ennemi2(ddcol)\y>0)
                    ennemi2(ddcol)\vie=0 ; tue le sprite qui a touché le joueur 
                    joueur(1)\vie=joueur(1)\vie-1 ;retire une vie au joueur
                     PlaySound(1)
            EndIf
   
            ; collision  vaisseau joueur avec vaisseau ennemi3 
            If  SpritePixelCollision(sprite_joueur, joueur(1)\x, joueur(1)\y, ddcol+550, ennemi3(ddcol)\x, ennemi3(ddcol)\y)<>0 And ennemi3(ddcol)\y>0 ;touche le sprite joueur  
                    explosion3=1 ; active l'explosion
                    x_explosion3=ennemi3(ddcol)\x ; recupere les coordonées de l'ennemi pour afficher l'explosion
                    y_explosion3=ennemi3(ddcol)\y   ; au bon endroits
                    ennemi3(ddcol)\x=Random(2000) ; vire le sprite (ses coordonées)
                    ennemi3(ddcol)\y=-Random(2000) ; en dehors de l'ecran
                    ennemi3(ddcol)\vie=0 ; tue le sprite qui a touché le joueur 
                    joueur(1)\vie=joueur(1)\vie-1 ;retire une vie au joueur
                     PlaySound(1)
            EndIf
            
            
             ;collision  vaisseau joueur avec gellulle vie
            If  SpritePixelCollision(sprite_joueur, joueur(1)\x, joueur(1)\y,sprite_gellule_vie, gellule_vie(1)\x, gellule_vie(1)\y)<>0 And gellule_vie(1)\y>0 ;touche le sprite joueur  
                    gellule_vie(1)\vie=0 
                    joueur(1)\vie=joueur(1)\vie+5 ;ajoute 5 vies au joueur
                    PlaySound(3)
            EndIf 
            
            ; collision   vaisseau joueur avec missile_ennemi1  
            If  SpritePixelCollision(sprite_joueur, joueur(1)\x, joueur(1)\y, ddcol+570, missile_ennemi1(ddcol)\x, missile_ennemi1(ddcol)\y)<>0 And missile_ennemi1(ddcol)\y>0 ;touche le sprite joueur 
                    explosion5=1 ; active l'explosion
                    x_explosion5=joueur(1)\x ; recupere les coordonée pour afficher l'explosion
                    y_explosion5=joueur(1)\y   ; au bon endroits
                    missile_ennemi1(ddcol)\x=0 ; envoi le missile en dehors de l'ecran (ses coordonées)
                    missile_ennemi1(ddcol)\y=-Random(2000)
                    joueur(1)\vie=joueur(1)\vie-1 ;retire une vie au joueur
                     PlaySound(1)
            EndIf
            
            ; collision  vaisseau joueur avec missile_ennemi2  
            If  SpritePixelCollision(sprite_joueur, joueur(1)\x, joueur(1)\y, ddcol+590, missile_ennemi2(ddcol)\x, missile_ennemi2(ddcol)\y)<>0 And missile_ennemi2(ddcol)\y>0;touche le sprite joueur 
                    explosion6=1 ; active l'explosion
                    x_explosion6=joueur(1)\x ; recupere les coordonée pour afficher l'explosion
                    y_explosion6=joueur(1)\y   ; au bon endroits
                    missile_ennemi2(ddcol)\x=0 ; envoi le missile en dehors de l'ecran (ses coordonées)
                    missile_ennemi2(ddcol)\y=-Random(2000)
                    joueur(1)\vie=joueur(1)\vie-1 ;retire une vie au joueur
                     PlaySound(1)
            EndIf
            
            ; collision  vaisseau joueur avec missile_ennemi3  
            If  SpritePixelCollision(sprite_joueur, joueur(1)\x, joueur(1)\y, ddcol+590, missile_ennemi3(ddcol)\x, missile_ennemi3(ddcol)\y)<>0 And missile_ennemi3(ddcol)\y>0;touche le sprite joueur 
                    explosion7=1 ; active l'explosion
                    x_explosion7=joueur(1)\x ; recupere les coordonée pour afficher l'explosion
                    y_explosion7=joueur(1)\y   ; au bon endroits
                    missile_ennemi3(ddcol)\x=0 ; envoi le missile en dehors de l'ecran (ses coordonées)
                    missile_ennemi3(ddcol)\y=-Random(2000)
                    joueur(1)\vie=joueur(1)\vie-1 ;retire une vie au joueur
                     PlaySound(1)
            EndIf 
            
            
            For zzz=0 To 50 ; on examine les 50 missiles du joueur
                    ; missile joueur avec collision ennemi1
                    If  SpritePixelCollision(missile_base+zzz, missile_joueur(zzz)\x, missile_joueur(zzz)\y, ddcol+510, ennemi1(ddcol)\x, ennemi1(ddcol)\y)<>0 And ennemi1(ddcol)\y>0;a t'on touché le sprite ennemi ?
                            explosion_j(zzz)=1 ; alors on active l'explosion
                            x_explosion(zzz)=ennemi1(ddcol)\x ; recupere les coordonée pour afficher l'explosion
                            y_explosion(zzz)=ennemi1(ddcol)\y   ; au bon endroits
                            ennemi1(ddcol)\x=Random(2000)
                            ennemi1(ddcol)\y=-Random(2000)
                            ennemi1(ddcol)\vie=0 
                            missile_joueur(zzz)\vie=0
                            missile_joueur(zzz)\y=-Random(2000)
                             PlaySound(1)
                    EndIf 
                    
                   ; missile joueur avec collision ennemi2
                    If  SpritePixelCollision(missile_base+zzz, missile_joueur(zzz)\x, missile_joueur(zzz)\y, ddcol+510, ennemi2(ddcol)\x, ennemi2(ddcol)\y)<>0 And ennemi2(ddcol)\y>0 ;a t'on touché le sprite ennemi ?
                            explosion_j(zzz)=1 ; active l'explosion
                            x_explosion(zzz)=ennemi2(ddcol)\x ; recupere les coordonée pour afficher l'explosion
                            y_explosion(zzz)=ennemi2(ddcol)\y   ; au bon endroits
                            ennemi2(ddcol)\x=Random(2000)
                            ennemi2(ddcol)\y=-Random(2000)
                            ennemi2(ddcol)\vie=0 
                            missile_joueur(zzz)\vie=0
                            missile_joueur(zzz)\y=-Random(2000)
                             PlaySound(1)
                    EndIf 
                    
                   ; missile joueur avec collision ennemi3
                    If  SpritePixelCollision(missile_base+zzz, missile_joueur(zzz)\x, missile_joueur(zzz)\y, ddcol+510, ennemi3(ddcol)\x, ennemi3(ddcol)\y)<>0 And ennemi3(ddcol)\y>0;a t'on touché le sprite ennemi ?
                            explosion_j(zzz)=1 ; active l'explosion
                            x_explosion(zzz)=ennemi3(ddcol)\x ; recupere les coordonée pour afficher l'explosion
                            y_explosion(zzz)=ennemi3(ddcol)\y   ; au bon endroits
                            ennemi3(ddcol)\x=Random(2000)
                            ennemi3(ddcol)\y=-Random(2000)
                            ennemi3(ddcol)\vie=0 
                            missile_joueur(zzz)\vie=0
                            missile_joueur(zzz)\y=Random(2000)
                             PlaySound(1)
                    EndIf 
                    
                    ; missile joueur avec collision gellule_vie
                    If  SpritePixelCollision(missile_base+zzz, missile_joueur(zzz)\x, missile_joueur(zzz)\y, sprite_gellule_vie, gellule_vie(1)\x, gellule_vie(1)\y)<>0 And gellule_vie(1)\y>0 ;a t'on touché le sprite ennemi ?
                            gellule_vie(1)\vie=Random(2000)   
                            gellule_vie(1)\y=-Random(2000)
                            missile_joueur(zzz)\vie=0
                            missile_joueur(zzz)\y=-Random(2000)
                             PlaySound(1)
                    EndIf  
            Next zzz 
;    ddcol=ddcol+1:If ddcol>10:ddcol=0:EndIf 
    Next ddcol
            Return
    ;}
     
   ;{;  hazard:
            hazard:
            ; tire au hasard une colonne pour les sprites disparus !!
            For uu=0 To 10
                    If ennemi1(uu)\vie=0
                            ennemi1(uu)\x=64+Random(EcranX-128)-64 ; test
                    EndIf
                    If ennemi2(uu)\vie=0
                            ennemi2(uu)\x=64+Random(EcranX-128)-64 ; test
                    EndIf
                    If ennemi3(uu)\vie=0
                            ennemi3(uu)\x=64+Random(EcranX-128)-64 ; test
                    EndIf 
            Next uu
            If gellule_vie(1)\vie=0
                    gellule_vie(1)\x=64+Random(EcranX-128) -64
                    gellule_vie(1)\y=-64
            EndIf 
            Return
            ;}
  
    ;{; affiche_gellule_vie
            affiche_gellule_vie:
                    If gellule_vie(1)\vie=1 ; gellule est activé
                            DisplaySprite(sprite_gellule_vie, gellule_vie(1)\x, gellule_vie(1)\y)  ; on l'affiche
                            gellule_vie(1)\y=gellule_vie(1)\y+8 ; elle descend
                            If gellule_vie(1)\y>EcranY; si elle est sorti de l'ecran
                                    gellule_vie(1)\vie=0 ; on la desactive
                                    gellule_vie(1)\y=EcranY+64 ; on la met hors ecran
                            EndIf
                            
                    EndIf
            Return
    ;}
             
    ;}
    ; *************************** fin sous program *************************************
      
   
    
    Procedure TimerProc(hwnd.l, uMsg.l, idEvent.l, dwTime.l)
        Shared  iip2,x_ennemi1,y_ennemi1,x_ennemi2,y_ennemi2,x_ennemi3,y_ennemi3,ennemi_vie,iipa,iipb,iipc
        Shared vittx_missile3,vitt3,x_joueur,y_joueur,vitty_missile3,x_dist2,x_dist3
        
        Select uMsg
            Case #WM_TIMER
                Select idEvent
                    Case 1  
                     
                          ;{;  ; Ici, le tir automatique de l' ennemi 1 (si ennemi vivant !!) 
                        ttyy1=Random(10)
                        ;ttyy=1  ; ennemi numero 1 tir 
                        If  ennemi1(ttyy1)\vie =1 ; si un ennemi est vivant 
                                iipa=iipa+1 :If iipa>10:iipa=1:EndIf
                                missile_ennemi1(iipa)\x=ennemi1(ttyy1)\x+16 ; releve la position X de l'ennemi 1
                                missile_ennemi1(iipa)\y=ennemi1(ttyy1)\y ; releve la position Y de l'ennemi 1
                                If   missile_ennemi1(iipa)\vie=0 ;verifie que le missile n'existe pas deja 
                                        missile_ennemi1(iipa)\vie=1   ; active le missile
                                    Else ; si le missile existe
                                iipa=iipa+1 :If iipa>10:iipa=1:EndIf ; augmente le numero de missile
                                        missile_ennemi1(iipa)\vie=1   ; active le missile
                                EndIf  
                                PlaySound(4)
                        EndIf  
                        ;}
                    Case 2
                        ;{; ***************** active un ennemis ***************** 
                        
                        ;  ennemi_vie1=1 ; determine quel sprite ennemi est actif ( ennemi_vie1,2,3)  
                        de1_s=Random(3) ; determine quel type de sprite ennemi est actif (1,2,3) Random(3) est tres dur a jouer !!
                        de1_n=Random(10) ; numero du sprite 1
                        de2_n=Random(10) ; numero du sprite 2
                        de3_n=Random(10) ; numero du sprite 3
                       ; de1_s=3 ; on force le sprite 1 (test) 
                        If de1_s=1
                                If  ennemi1(de1_n)\vie=0 ; verifie que le sprite n'existe pas deja 
                                        ennemi1(de1_n)\vie=1
                                        ennemi1(de1_n)\y=0 ; place l'ennemi en haut de l'ecran  
                                EndIf
                        EndIf
                        If de1_s=2
                                If  ennemi2(de2_n)\vie=0 ; verifie que le sprite n'existe pas deja 
                                        ennemi2(de2_n)\vie=1
                                        ennemi2(de2_n)\y=0 ; place l'ennemi en haut de l'ecran 
                                EndIf
                        EndIf
                        If de1_s=3
                                If  ennemi3(de3_n)\vie=0 ; verifie que le sprite n'existe pas deja 
                                        ennemi3(de3_n)\vie=1
                                        ennemi3(de3_n)\y=0 ; place l'ennemi en haut de l'ecran 
                                EndIf
                        EndIf
                        ;}
                        ; ************************************************************  
                    Case 3
                          ;{;  ; Ici, le tir automatique de l' ennemi 2 (si ennemi vivant !!) 
                        ttyy2=Random(10)
                        ;ttyy2=1  ; ennemi numero 1 (de type 2)  tir 
                        If  ennemi2(ttyy2)\vie =1 ; si un ennemi (de type 2) est vivant 
                                iipb=iipb+1 :If iipb>10:iipb=1:EndIf
                                missile_ennemi2(iipb)\x=ennemi2(ttyy2)\x+16 ; releve la position X de l'ennemi 2
                                missile_ennemi2(iipb)\y=ennemi2(ttyy2)\y ; releve la position Y de l'ennemi 2
                                
                                ;{; ****** change le sens x ou  y du missile2 ********
                                If  missile_ennemi2(iipb)\x>joueur(1)\x ; si le missile est a droite du joueur  
                                        x_dist2=missile_ennemi2(iipb)\x-joueur(1)\x  
                                        missile_ennemi2(iipb)\vittx=0-x_dist2/10  ; change le sens x du missile (tir vers la gauche) 
                                EndIf
                                
                                ; la variable  "vittx_missile2" contient le sens du deplacement du missile en X
                                
                                If  missile_ennemi2(iipb)\x<joueur(1)\x ; si le missile est a gauche du joueur 
                                        x_dist2=joueur(1)\x -missile_ennemi2(iipb)\x
                                       missile_ennemi2(iipb)\vittx=x_dist2/10  ; change le sens x du missile (tir vers la droite)
                                EndIf 
                                
                                
                                ; ****** change le sens y du missile ********
                                If  missile_ennemi2(iipb)\y>joueur(1)\y ; si le missile est au dessus du joueur
                                        missile_ennemi2(iipb)\vitty=0-vitt2*3  ; change le sens y du missile (tir vers le bas)
                                EndIf
                                
                                ; la variable  "vitty_missile2" contient le sens du deplacement du missile en Y
                                
                                If  missile_ennemi2(iipb)\y<joueur(1)\y ; si le missile est au dessous du joueur
                                         missile_ennemi2(iipb)\vitty=vitt2*3  ; change le sens y du missile (tir vers le haut)
                                EndIf 
                                
                                ; **********************************************
                                ;}
                                
                                If   missile_ennemi2(iipb)\vie=0 ;verifie que le missile n'existe pas deja 
                                        missile_ennemi2(iipb)\vie=1   ; active le missile
                                    Else ; si le missile existe
                                     iipb=iipb+1 :If iipb>10:iipb=1:EndIf ; augmente le numero de missile
                                        missile_ennemi2(iipb)\vie=1   ; active le missile
                                EndIf  
                                 PlaySound(5)
                        EndIf  
                        ;}
                    Case 4
                        ;{;  ; Ici, le tir automatique de l' ennemi 3 (si ennemi vivant !!) 
                        ttyy3=Random(10)
                        ;ttyy3=1  ; ennemi numero 1 (de type 3)  tir 
                        If  ennemi3(ttyy3)\vie =1 ; si un ennemi (de type 3) est vivant 
                        iipc=iipc+1 :If iipc>10:iipc=1:EndIf
                                missile_ennemi3(iipc)\x=ennemi3(ttyy3)\x+16 ; releve la position X de l'ennemi 3
                                missile_ennemi3(iipc)\y=ennemi3(ttyy3)\y ; releve la position Y de l'ennemi 3
                                
                                ;{; ****** change le sens x ou  y du missile3 ********
                                If  missile_ennemi3(iipc)\x>joueur(1)\x ; si le missile est a droite du joueur  
                                        x_dist3=missile_ennemi3(iipc)\x-joueur(1)\x   
                                        missile_ennemi3(iipc)\vittx=0-x_dist3/10  ; change le sens x du missile (tir vers la gauche) 
                                EndIf
                                
                                ; la variacle  "vittx_missile3" contient le sens du deplacement du missile en X
                                
                                If  missile_ennemi3(iipc)\x<joueur(1)\x ; si le missile est a gauche du joueur 
                                        x_dist3=joueur(1)\x -missile_ennemi3(iipc)\x
                                        missile_ennemi3(iipc)\vittx=x_dist3/10  ; change le sens x du missile (tir vers la droite)
                                EndIf 
                                
                                
                                ; ****** change le sens y du missile ********
                                If  missile_ennemi3(iipc)\y>joueur(1)\y ; si le missile est au dessus du joueur
                                        missile_ennemi3(iipc)\vitty=0-vitt3*3  ; change le sens y du missile (tir vers le bas)
                                EndIf
                                
                                ; la variable  "vitty_missile3" contient le sens du deplacement du missile en Y
                                
                                If  missile_ennemi3(iipc)\y<joueur(1)\y ; si le missile est au dessous du joueur
                                        missile_ennemi3(iipc)\vitty=vitt3*3  ; change le sens y du missile (tir vers le haut)
                                EndIf 
                                
                                ; **********************************************
                                ;}
                                
                                If   missile_ennemi3(iipc)\vie=0 ;verifie que le missile n'existe pas deja 
                                        missile_ennemi3(iipc)\vie=1   ; active le missile
                                    Else ; si le missile existe
                                iipc=iipc+1 :If iipc>10:iipc=1:EndIf ; augmente le numero de missile
                                        missile_ennemi3(iipc)\vie=1   ; active le missile
                                EndIf  
                                 PlaySound(6)
                        EndIf  
                        ;}
                        
                    Case 5
                        ;{; active la gellule de vie
                        gellule_vie(1)\vie=1 
                        ;}
                EndSelect
        EndSelect
    EndProcedure
     
    Procedure Ondulation(Texte.s,r,v,b) 
        ; procedure realisé par OLIV
        StartDrawing(ScreenOutput()) ; Pour pouvoir utiliser les commandes des dessin 2D.
                DrawingMode(1) ; On selectionne le mode pour ne pas avoir de fond derrière les lettres.
                FrontColor(r,v, b) ; On change la couleur.
                DrawingFont(FontID()) ; On change la police
                
                Angle + #VitesseAngle ; Angle de départ de la sinusoide en radian
                
                If Angle >= 2 * #pi
                        Angle = 0
                EndIf
                
                ; On affiche toute les lettres
                PosX = 10 ; Position du caractère
                For n = 1 To Len(Texte) ; Pour chaque lettre du texte
                        
                        Lettre.s = Mid(Texte, n, 1) ; on récupère la lettre à la position n
                        
                        PosY = 50 + #HauteurSin * Sin(Angle + PosX / #LargeurSin) ; on calcul la position en Y de la lettre
                        ; On part du centre de l'image (50) puis on ajoute un sin
                        ; #HauteurSin fait varier l'amplitude du mouvement
                        ; l'angle mis dans le sinus est d'abord composé de l'angle de départ d'affichage du texte (Angle)
                        ; puis on augmente l'angle au fur et à mesure que l'on affiche des lettres avec le coefficient #LargeurSin qui permet de faire varier la largeur de la sinusoide
                        
                        Locate(PosX, PosY)
                        DrawText(Lettre)
                        
                        PosX + TextLength(Lettre)
                        
                Next
                
        StopDrawing() ; On signife que l'on arrête les fonctions dessin 2D.
    EndProcedure

:D
Dernière modification par Backup le sam. 19/mars/2005 16:06, modifié 1 fois.
bernard13
Messages : 1221
Inscription : mer. 05/janv./2005 21:30

Message par bernard13 »

merci dobro
mais j'ai pas le temps d'etudier ton code
je boss sur mon application de gestion de mot de passes
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

pas de problem !! :D
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

Amusant ;)

Petit prob avec le joystick, j'en ai pas et ça plante le programme :?
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)]
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Le Soldat Inconnu a écrit :Amusant ;)

Petit prob avec le joystick, j'en ai pas et ça plante le programme :?

ben oui j'ai pas fait de verif
en fait je programme comme un sauvage

je tappe toujours

Code : Tout sélectionner

 InitModule() = 0       
au lieu de

Code : Tout sélectionner

If InitModule() = 0
        MessageRequester("Error", "MIDAS11.dll pas present !") : End
EndIf
mais tu as raison ! vu que je m'adresse en particulier aux debutants
je devrai faire plus attention !! :D

je vais corriger cela !!
une prochaine version a venir !!

tu remarque que je fait l'effort d'utiliser les structures
ma premiere version etait toute qu'avec des tableaux simple !! :lol:

d'ailleur je profite pour signaler que la fonction
" Resultat = JoystickButton(NumeroBouton) "

ne fonctionne pas avec la version 3.93

elle marche avec Resultat = JoystickButton(1)

mais pas avec Resultat = JoystickButton(2)
JoystickButton(3)
JoystickButton(4)
JoystickButton(5)
ect ..



:D
Répondre