Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Chasseur d'astéroïdes (PANGINE2D) Jeu 5 Avr 2018 - 8:28 | |
| Comme promis, voici le code. ATTENTION: Ce code ne fonctionne que dans l'éditeur PANGINE2D. - Code:
-
' AsterV4.1.bas (Jean Claude, Jicehel, Papydall, Bignono, Klaus) (JUIN 2015)
rem ============================================================================
dim n%,i%,at% dim pi : pi = acos(-1) : ' mémorise la valeur pi dim x%,y%,vit_vai% : ' position et vitesse du vaisseau dim d : d = pi/2 : ' direction (c'est le cap) de départ du vaisseau (vers le haut) dim Nb_tirs%,Cpt_tirs% : Nb_tirs%=5 : ' Nombre de tirs autorisés et compteur de tirs actifs dim tir$,tir%(Nb_tirs%), tir_x(Nb_tirs%),tir_y(Nb_tirs%),tir_d(Nb_tirs%),vit_mis% : ' Resultat du tir, Tir actif ou non, coord en x et en y du tir et mémoristion de la direction et vitesse dim Nb_Asteroides%,Cpt_asteroides% : Nb_Asteroides% = 3 : ' Nombre d'Asteroides actifs dim xA%(Nb_Asteroides%),yA%(Nb_Asteroides%) : ' Position des asteroides dim vit_ast_x%(Nb_Asteroides%), vit_ast_y%(Nb_Asteroides%) : ' Vitesse des asteroides dim SpriteV% :' Pour savoir quelle image du vaisseau ami est en service (car d change dans la sub move) dim score% :' Pour le score dim cpt_t_asteroide :' ralentisseur pour les mouvements de l'asteroid dim niveau% :' Niveau du jeu dim xE%,yE% :' Position de l'ennemi dim vit_E%,vit_E_max%,vit_E_min% :' Vitesse de l'ennemi et son maximum et minimum dim tirE% :' Tir ennemi dim SpriteVE% :' Pour savoir quelle image du vaisseau Ennemi est en service dim num_wav% :' Pour définir les morceaux de musique à jouer dim touche% :' Pour mémoriser la touche enfoncée
' Déclaration des étiquettes label touche,boucle_principale,fin,Attente,Repart,Musique,time_ennemi
' fichiers audios sound 197 :' musique d'ambiance sound 198 : file_load 198,"audio/explosion_vaisseau.wav": ' explosion du vaisseau sound 199 : file_load 199,"audio/explosion_aster.wav" : ' explosion des asteroides
SPRITE_CREATE_HIDE
' création des vaisseaux amis SPRITE 1 : SPRITE_FILE_LOAD 1,"image/VBG.bmp" SPRITE 2 : SPRITE_FILE_LOAD 2,"image/VB.bmp" SPRITE 3 : SPRITE_FILE_LOAD 3,"image/VBD.bmp" SPRITE 4 : SPRITE_FILE_LOAD 4,"image/VG.bmp" SPRITE 5 : SPRITE_FILE_LOAD 5,"image/VD.bmp" SPRITE 6 : SPRITE_FILE_LOAD 6,"image/VHG.bmp" SPRITE 7 : SPRITE_FILE_LOAD 7,"image/VH.bmp" SPRITE 8 : SPRITE_FILE_LOAD 8,"image/VHD.bmp"
SPRITE_ANIMATED 11 : SPRITE_ANIMATED_FILE_LOAD 11,5,5,"image/meteore.bmp" : ' explosion astéroide SPRITE_ANIMATED 12 : SPRITE_ANIMATED_FILE_LOAD 12,5,5,"image/meteore2.bmp" : ' explosion vaisseau
FOR n% = 1 TO Nb_Asteroides% SPRITE_ANIMATED 29 + n% : ' Créé un sprite pour un astéroide SPRITE_ANIMATED_FILE_LOAD 29 + n% ,1,8,"image/rock8.bmp" : ' Charge le sprite animé correspondant à l'astéroide new_asteroide(n%) : SPRITE_SHOW 29 + n% : ' Créé l'astéroid initial NEXT n% Cpt_asteroides% = Nb_Asteroides%
FOR n% = 1 TO Nb_tirs% SPRITE 39 + n% : SPRITE_FILE_LOAD 39 + n%,"image/balle.bmp" tir%(n%) = 0 : ' Au début pas de tir actif NEXT n%
' Sprites pour le générique. SPRITE 51 : SPRITE_FILE_LOAD 51,"image/gen3.bmp" : SPRITE_POSITION 51,(screen_x/2)-350,screen_y+200 SPRITE 50 : SPRITE_FILE_LOAD 50,"image/gen1.bmp" : SPRITE_POSITION 50,(screen_x/2)-350,screen_y-40
' création des vaisseaux ennemis SPRITE 61 : SPRITE_FILE_LOAD 61,"image/VEBG.bmp" SPRITE 62 : SPRITE_FILE_LOAD 62,"image/VEB.bmp" SPRITE 63 : SPRITE_FILE_LOAD 63,"image/VEBD.bmp" SPRITE 64 : SPRITE_FILE_LOAD 64,"image/VEG.bmp" SPRITE 65 : SPRITE_FILE_LOAD 65,"image/VED.bmp" SPRITE 66 : SPRITE_FILE_LOAD 66,"image/VEHG.bmp" SPRITE 67 : SPRITE_FILE_LOAD 67,"image/VEH.bmp" SPRITE 68 : SPRITE_FILE_LOAD 68,"image/VEHD.bmp" ' boulet ennemi SPRITE 69 : SPRITE_FILE_LOAD 69,"image/balleE.bmp"
' scene2D BACKGND_LOAD "image/espace.bmp"
niveau%=1 : niveau() : cpt_t_asteroide = 0 : Cpt_tirs% = 0
file_load 197,"audio/music18.wav" : play 197 SPRITE_SHOW 51 : SPRITE_SHOW 50 generique(): 'démarrage du programme par le générique
' init x%=(screen_x/2)+32 : y%=700 : sprite_position 7,x%,y% : SpriteV% = 7 : SPRITE_SHOW 7 scene2d_interval 80 affiscore()
' Gestion du jeu: activation des 3 timer timer 2 : timer_interval 2,8 : on_timer 2,boucle_principale : ' Activation du timer qui activera les tours de jeu timer 3 : timer_interval 3,105500 : on_timer 3,Musique : ' Musique d'ambiance (recommence toutes les minutes) timer 4 : timer_interval 4,8 : on_timer 4,time_ennemi : ' Activation de la boucle pour les mouvements ennemis
END :' FIN DE LA MISE EN PLACE ' ============================================================================== ' CI-DESSOUS: Les sous_programmes rem ================================ Musique =================================== Musique: off_key_down num_wav%=num_wav%+1 if num_wav%>18 then num_wav%=1 file_load 197,"audio/music"+str$(num_wav%)+".wav" on_key_down touche play 197 RETURN
rem ================================= PAUSE ==================================== Attente: timer_off 2 : timer_off 3 on_key_down Repart RETURN
Repart: timer_on 3 : timer_on 2 : on_key_down touche RETURN
rem =============================== Générique ================================== SUB generique() DIM_LOCAL X1,Y1,X2,Y2,Y3,Y4 scene2d_interval 20 : scene2d_on X1=0 : Y1=0 : X2=2184 : Y2=1167 : view X1,Y1,X2,Y2 Y2=600 : Y3=70 : Y4=screen_y+100 SPRITE_POSITION 50,(screen_x/2)-350,Y3 REPEAT Y1=Y1+1 : Y2=Y2+1 : view X1,Y1,X2,Y2 Y4=Y4-2 : SPRITE_POSITION 51,(screen_x/2)-350,Y4 scene2d_off : pause 50 UNTIL y2>1000 or scancode<>0 pause 2000 X1=0 : Y1=0 : X2=screen_x : Y2=screen_y : view X1,Y1,X2,Y2 SPRITE_HIDE 50 : SPRITE_HIDE 51 END_SUB
rem ========================== Réglage des Niveaux ============================= SUB niveau() if niveau%>10 then niveau%=10 if niveau%=1 then vit_vai%=8 : vit_mis%=20 if niveau%=2 then vit_vai%=9 : vit_mis%=22 if niveau%=3 then vit_vai%=10 : vit_mis%=24 : vit_E_max%=8 : vit_E_min%=3 if niveau%=4 then vit_vai%=11 : vit_mis%=26 : vit_E_max%=9 : vit_E_min%=4 if niveau%=5 then vit_vai%=12 : vit_mis%=28 : vit_E_max%=10 : vit_E_min%=5 if niveau%=6 then vit_vai%=13 : vit_mis%=30 : vit_E_max%=11 : vit_E_min%=6 if niveau%=7 then vit_vai%=14 : vit_mis%=32 : vit_E_max%=12 : vit_E_min%=7 if niveau%=8 then vit_vai%=15 : vit_mis%=34 : vit_E_max%=13 : vit_E_min%=8 if niveau%=9 then vit_vai%=16 : vit_mis%=36 : vit_E_max%=14 : vit_E_min%=9 if niveau%=10 then vit_vai%=17 : vit_mis%=38 : vit_E_max%=15 : vit_E_min%=10
' réglages ' vit_vai% = 8 :' + => plus rapide ' vit_mis%=20 :' + => plus rapide ' vit_E_min%=2 : ' vitesse ennemi: minimum 2 ' vit_E_max%=12 :' vitesse ennemi: + => plus rapide (mais aléatoire >vit_E_min%)
END_SUB
rem ============== Score et réglage des paliers pour les niveaux =============== SUB affiscore() ' affichage du score et progression du niveau par paliers if score%=1 then niveau%=niveau%+1 :' 2 if score%=2 then niveau%=niveau% :' 2 if score%=3 then niveau%=niveau%+1 :' 3 if score%=4 then niveau%=niveau% :' 3 if score%>4 and score%<10 then niveau%=niveau%+1 :' 4 if score%>9 and score%<15 then niveau%=niveau%+1 :' 5 if score%>14 and score%<20 then niveau%=niveau%+1 :' 6 if score%>19 and score%<25 then niveau%=niveau%+1 :' 7 if score%>24 and score%<30 then niveau%=niveau%+1 :' 8 if score%>29 and score%<35 then niveau%=niveau%+1 :' 9 if score%>34 then niveau%=10 caption "CHASSEUR D'ASTEROIDES - Score: "+str$(score%) niveau() END_SUB
rem ================== Attribution des touches du clavier ====================== touche: ' Touches du pavé numérique if KEY_DOWN_CODE = 97 then touche% = 1 : ' 1 End if KEY_DOWN_CODE = 40 or KEY_DOWN_CODE = 98 then touche% = 2 : ' 2 Bas if KEY_DOWN_CODE = 99 then touche% = 3 : ' 3 PgDn if KEY_DOWN_CODE = 37 or KEY_DOWN_CODE = 100 then touche% = 4 : ' 4 gauche if KEY_DOWN_CODE = 39 or KEY_DOWN_CODE = 102 then touche% = 5 : ' 5 droite if KEY_DOWN_CODE = 103 then touche% = 6 : ' 6 Home if KEY_DOWN_CODE = 38 or KEY_DOWN_CODE = 104 then touche% = 7 : ' 7 haut if KEY_DOWN_CODE = 105 then touche% = 8 : ' 8 PgUp if KEY_DOWN_CODE = 27 then gosub fin : ' Echap if KEY_DOWN_CODE = 80 then gosub Attente : RETURN if KEY_DOWN_CODE = 83 then timer_off 3 if KEY_DOWN_CODE = 77 then timer_on 3 : play 197 if KEY_DOWN_CODE = 32 then touche% = 32 : ' Fin du traitement d'un appuie sur espace RETURN
rem ================ Boucle des ennemis ======================================== time_ennemi: timer_off 4 if niveau%>2 ' on gére le vaisseau ennemi pour ce tour if SpriteVE%=0 then new_ennemi() ennemi() end_if cpt_t_asteroide = cpt_t_asteroide + 1 if cpt_t_asteroide = 1 then asteroide(1) : asteroide(3) if cpt_t_asteroide = 2 then asteroide(2) : asteroide(3) if cpt_t_asteroide = 3 then asteroide(3) : asteroide(2) : cpt_t_asteroide = 0 : ' On gère notre asteroid pour ce tour FOR i% = 1 TO Nb_Asteroides% Test_collision_vaisseau(i%) next i% timer_on 2 : on_key_down touche RETURN
rem ==================== Boucle_principale (tour) ============================== boucle_principale: timer_off 2 : off_key_down SELECT touche% case 1 : move(1) : ' touche 1 du pavé numérique End case 2 : move(2) : ' 2 Bas case 3 : move(3) : ' 3 PgDn (flèche de pagination vers le bas du pavé numérique) case 4 : move(4) : ' 4 gauche case 5 : move(5) : ' 6 droite case 6 : move(6) : ' 7 Home (touche début du pavé numérique) case 7 : move(7) : ' 8 haut case 8 : move(8) : ' 9 PgUp (flèche de pagination vers le haut du pavé numérique) case 32 IF Cpt_tirs% < Nb_tirs% Cpt_tirs% = Cpt_tirs% + 1 tir%(Cpt_tirs%) = 1 : tir_d(Cpt_tirs%) = d : ' On mémorise qu'un tir est actif et la direction de ce tir ' On ajuste la position initale du tir en fonction de la direction du vaisseau if d = 5*pi/4 then tir_x(Cpt_tirs%) = x% + 11 : tir_y(Cpt_tirs%) = y% + 33 if d = 3*pi/2 then tir_x(Cpt_tirs%) = x% + 22 : tir_y(Cpt_tirs%) = y% + 44 if d = 7*pi/4 then tir_x(Cpt_tirs%) = x% + 33 : tir_y(Cpt_tirs%) = y% + 33 if d = pi then tir_x(Cpt_tirs%) = x% : tir_y(Cpt_tirs%) = y% + 22 if d = 0 then tir_x(Cpt_tirs%) = x% + 44 : tir_y(Cpt_tirs%) = y% + 22 if d = 3*pi/4 then tir_x(Cpt_tirs%) = x% + 11 : tir_y(Cpt_tirs%) = y% + 11 if d = pi/2 then tir_x(Cpt_tirs%) = x% + 22 : tir_y(Cpt_tirs%) = y% if d = pi/4 then tir_x(Cpt_tirs%) = x% + 33 : tir_y(Cpt_tirs%) = y% + 11 sprite_position 39+Cpt_tirs%,tir_x(Cpt_tirs%), tir_y(Cpt_tirs%) : SPRITE_SHOW 39+Cpt_tirs% END_IF : ' Fin du traitement d'un appuie sur espace END_SELECT touche% = 0 if Cpt_tirs% > 0 for i% = 1 to Cpt_tirs% if tir%(i%) = 1 then tir(i%) : ' Si un tir est actif, on gère son tour next i% end_if timer_on 4 : on_key_down touche RETURN
rem ============================================================================ SUB vaisseau_detruit(Aster%) ' animation de la destruction de la cible off_key_down sprite_position 29 + Aster%,xA%(Aster%)+20,yA%(Aster%)+20 : SPRITE_HIDE SpriteV% scene2d_interval 250 : scene2d_on sprite_position 12,(xA%(Aster%) - 60),(yA%(Aster%) - 60) : SPRITE_SHOW 12 : sprite_animated_frames 12,8,14 pause 2400 : SPRITE_HIDE 12 scene2d_off END_SUB
rem ============================================================================ SUB Test_collision_vaisseau(Aster%) Collision_AABB(xA%(Aster%),yA%(Aster%),22,24,x%,y%,32,32) :' vérifier si le vaisseau ami n'est pas en collision avec l'astéroide if tir$="OK" play 198 : ' explosion vaisseau vaisseau_detruit(Aster%) : message "Votre vaisseau est détruit!"+chr$(13)+chr$(13)+"Votre score: "+str$(score%) :' fin de partie gosub fin : EXIT_SUB end_if ' test collision VE avec Astéroïde IF SpriteVE%<>0 Collision_AABB(xA%(Aster%),yA%(Aster%),16,16,xE%,yE%,28,28) :' vérifier si le vaisseau ennemi n'est pas en collision avec l'astéroide If tir$="OK" play 198 : ' explosion vaisseau ' animation de la destruction du vaisseau ennemi par un astéroïde off_key_down SPRITE_HIDE SpriteVE% scene2d_interval 250 : scene2d_on sprite_position 12,xE%-60,yE%-60 : SPRITE_SHOW 12 : sprite_animated_frames 12,8,14 pause 400 : SPRITE_HIDE 12 : scene2d_off SpriteVE%=0 : tirE%=0 End_if END_IF END_SUB
rem ============================================================================ ' New_astéroide SUB new_asteroide(Aster%) scene2d_interval 500 : scene2d_on vit_ast_x%(Aster%)= 0 : vit_ast_y%(Aster%)= 0 : ' On initialise le compteur pour un lancé aléatoire WHILE (abs(vit_ast_x%(Aster%)) + abs(vit_ast_y%(Aster%))) < 10 : ' On fixe une vitesse minimale en dessous vit_ast_x%(Aster%)=rnd(30) - 15 : vit_ast_y%(Aster%)=rnd(30) - 15 : ' de laquelle on n'accepte pas le tirage END_WHILE : ' la vitesse peut être positive ou négative xA%(Aster%) = screen_x + 10 : yA%(Aster%) = screen_y + 10 : ' on fixe la position de départ de l'astéroid en bas à droite if vit_ast_x%(Aster%) > 0 then xA%(Aster%)=-10 : ' si la vitesse en x est positive, on change le point de départ à gauche if vit_ast_y%(Aster%) > 0 then yA%(Aster%)=-10 : ' si la vitesse en y est positive, on change le point de départ en haut sprite_position 29 + Aster%,xA%(Aster%),yA%(Aster%) : ' on positionne notre asteroide END_SUB
rem ============================================================================ ' astéroide SUB asteroide(Aster%) if ((xA%(Aster%) < (0-10)) and (vit_ast_x%(Aster%) < 0)) then new_asteroide(Aster%) if ((xA%(Aster%) > (screen_x + 10)) and (vit_ast_x%(Aster%) > 0)) then new_asteroide(Aster%) if ((yA%(Aster%) < (0-10)) and (vit_ast_y%(Aster%) < 0)) then new_asteroide(Aster%) if ((yA%(Aster%) > (screen_y + 10)) and (vit_ast_y%(Aster%) > 0)) then new_asteroide(Aster%) xA%(Aster%)=xA%(Aster%)+vit_ast_x%(Aster%) : yA%(Aster%)=yA%(Aster%)+vit_ast_y%(Aster%) sprite_position 29 + Aster%,xA%(Aster%),yA%(Aster%) Test_collision_vaisseau(Aster%) scene2d_off END_SUB
rem ============================================================================ ' libère un tir SUB Annule_tir(N_t%) tir_d(N_t%) = tir_d(Cpt_tirs%) : tir_x(N_t%) = tir_x(Cpt_tirs%) : tir_y(N_t%) = tir_y(Cpt_tirs%) SPRITE_POSITION 39 + N_t%,tir_x(N_t%), tir_y(N_t%) : SPRITE_HIDE 39 + Cpt_tirs% tir%(Cpt_tirs%) = 0 : Cpt_tirs% = Cpt_tirs% - 1 END_SUB
rem ============================================================================ ' Tirer une balle dans l'une des 8 directions possibles du sprite SUB tir(N_t%) dim_local pxbe%,pybe%,pxve%,pyve% tir_x(N_t%) = tir_x(N_t%) + cos(tir_d(N_t%))* vit_mis% : tir_y(N_t%) = tir_y(N_t%) - sin(tir_d(N_t%)) * vit_mis% if (cos(tir_d(N_t%)) > 0 and tir_x(N_t%) > screen_x) or (cos(tir_d(N_t%)) < 0 and tir_x(N_t%) < 0 ) or (sin(tir_d(N_t%)) < 0 and tir_y(N_t%) > screen_y) or (sin(tir_d(N_t%)) > 0 and tir_y(N_t%) < 0 ) Annule_tir(N_t%) end_if sprite_position 39+N_t%,tir_x(N_t%), tir_y(N_t%) : ' Mouvement de la balle du tir FOR n% = 1 TO Nb_Asteroides% Collision_AABB(tir_x(N_t%),tir_y(N_t%),16,16,xA%(n%),yA%(n%), 22,24) if tir$="OK" then tir_ok(N_t%,n%) NEXT n% ' verif si collision avec vaisseau ennemi IF SpriteVE%<>0 pxbe%=sprite_x_position(39+N_t%) : pybe%=sprite_y_position(39+N_t%) pxve%=sprite_x_position(SpriteVE%) : pyve%=sprite_y_position(SpriteVE%) Collision_AABB(pxbe%,pybe%,10,10,pxve%,pyve%,40,40) if tir$="OK" off_key_down Annule_tir(N_t%) play 198 : ' explosion vaisseau ' animation de la destruction du vaisseau ami par un ennemi SPRITE_HIDE SpriteVE% : tirE%=0 : SPRITE_HIDE 69 scene2d_interval 250 : scene2d_on sprite_position 12,pxbe%-60,pybe%-60 : SPRITE_SHOW 12 : sprite_animated_frames 12,8,14 pause 400 : SPRITE_HIDE 12 : SpriteVE%=0 on_key_down touche scene2d_off : score%=score%+1 : affiscore() end_if END_IF END_SUB
rem ============================================================================ SUB tir_ok(N_t%,N_a%) ' animation de la destruction de la cible play 199 :' explosion_aster off_key_down Annule_tir(N_t%) sprite_position 11,(xA%(N_a%) - 40),(yA%(N_a%) - 40) : SPRITE_SHOW 11 : sprite_animated_frames 11,8,14 pause 100 : SPRITE_HIDE 29 + N_a% : SPRITE_HIDE 11 on_key_down touche score%=score%+2 : affiscore() new_asteroide(N_a%): SPRITE_SHOW 29 + N_a% END_SUB
rem ============================================================================ SUB Collision_AABB(r1_x%,r1_y%,r1_width,r1_height,r2_x%,r2_y%, r2_width,r2_height) Tir$="OK" IF ((r2_x% >= (r1_x% + r1_width)) OR ((r2_x% + r2_width) <= r1_x%) OR (r2_y% >= (r1_y% + r1_height)) OR ((r2_y% + r2_height) <= r1_y%)) THEN Tir$="" END_SUB
rem ============================================================================ ' d est la direction (le cap) que prendra le sprite SUB move(nsp%) select nsp% case 1 : x% = x% - vit_vai% : y% = y% + vit_vai% : d = 5*pi/4 case 2 : y% = y% + vit_vai% : d = 3*pi/2 case 3 : x% = x% + vit_vai% : y% = y% + vit_vai% : d = 7*pi/4 case 4 : x% = x% - vit_vai% : d = pi case 5 : x% = x% + vit_vai% : d = 0 case 6 : x% = x% - vit_vai% : y% = y% - vit_vai% : d = 3*pi/4 case 7 : y% = y% - vit_vai% : d = pi/2 case 8 : x% = x% + vit_vai% : y% = y% - vit_vai% : d = pi/4 end_select ' caption str$(nsp%) + ":" + str$(SpriteV%) if nsp% <> SpriteV% sprite_hide SpriteV% : SpriteV% = nsp% : sprite_position nsp%,x%,y% :sprite_show nsp% else sprite_position nsp%,x%,y% end_if ' Le mode ENROULE : si le sprite sort de la zone , il réapparait de l'autre côté if x% < 0 then x% = screen_x if x% > screen_x then x% = 0 if y% < 0 then y% = screen_y if y% > screen_y then y% = 0 END_SUB rem ============================================================================ SUB ennemi() SPRITE_SHOW SpriteVE% ' bouger le vaisseau if SpriteVE%=63 then xE%=xE%+vit_E% : yE%=yE%+vit_E% : Test_collision_vaisseau_E(SpriteVE%) if SpriteVE%=62 then yE%=yE%+vit_E% : Test_collision_vaisseau_E(SpriteVE%) if SpriteVE%=61 then xE%=xE%-vit_E% : yE%=yE%+vit_E% : Test_collision_vaisseau_E(SpriteVE%) if SpriteVE%=64 then xE%=xE%-vit_E% : Test_collision_vaisseau_E(SpriteVE%) if SpriteVE%=66 then xE%=xE%-vit_E% : yE%=yE%-vit_E% : Test_collision_vaisseau_E(SpriteVE%) if SpriteVE%=67 then yE%=yE%-vit_E% : Test_collision_vaisseau_E(SpriteVE%) if SpriteVE%=68 then xE%=xE%+vit_E% : yE%=yE%-vit_E% : Test_collision_vaisseau_E(SpriteVE%) if SpriteVE%=65 then xE%=xE%+vit_E% : Test_collision_vaisseau_E(SpriteVE%) sprite_position SpriteVE%,xE%,yE% ' Pas de collision donc ' si en dehors du cadre SpriteVE%=0 if xE%<(0-64) or xE%>(screen_x+64) or yE%<(0-64) or yE%>(screen_y+64) SpriteVE%=0 : tirE%=0 : SPRITE_HIDE 69 else ' faire un tir ou pas if xE%>128 and xE%<(screen_x-128) and yE%>128 and yE%<(screen_y-128) if tirE%=0 init_tir_ennemi() : tir_ennemi() else tir_ennemi() end_if end_if end_if END_SUB
rem ============================================================================ SUB tir_ennemi() dim_local pxbe%,pybe% pxbe%=sprite_x_position(69) : pybe%=sprite_y_position(69) ' vérifier si la balle est sortie if SpriteVE%=63 then pxbe%=pxbe%+(vit_E%*2) : pybe%=pybe%+(vit_E%*2) :' (VEBD) Vaisseau Ennemi Bas Droit if SpriteVE%=62 then pybe%=pybe%+(vit_E%*2) :' (VEB) if SpriteVE%=61 then pxbe%=pxbe%-(vit_E%*2) : pybe%=pybe%+(vit_E%*2) :' (VEBG) if SpriteVE%=64 then pxbe%=pxbe%-(vit_E%*2) :' (VEG) if SpriteVE%=66 then pxbe%=pxbe%-(vit_E%*2) : pybe%=pybe%-(vit_E%*2) :' (VEHG) if SpriteVE%=67 then pybe%=pybe%-(vit_E%*2) :' (VEH) if SpriteVE%=68 then pxbe%=pxbe%+(vit_E%*2) : pybe%=pybe%-(vit_E%*2) :' (VEHD) if SpriteVE%=65 then pxbe%=pxbe%+(vit_E%*2) :' (VED) sprite_position 69,pxbe%,pybe% Collision_AABB(pxbe%,pybe%,32,32,x%,y%,32,32) if tir$="OK" tirE%=0 : vaisseau_detruit_par_E(69) message "Vos ennemis sont d'excellent tireur ! c'est terminé pour vous"+chr$(13)+chr$(13)+"Votre score: "+str$(score%) gosub fin end_if END_SUB
rem ============================================================================ SUB init_tir_ennemi() dim_local pxbe%,pybe% tirE%=tirE%+1 ' position de départ if SpriteVE%=63 then pxbe%=xE%+45 : pybe%=yE%+45 if SpriteVE%=62 then pxbe%=xE%+25 : pybe%=yE%+55 if SpriteVE%=61 then pxbe%=xE%+2 : pybe%=yE%+48 if SpriteVE%=64 then pxbe%=xE%-7 : pybe%=yE%+24 if SpriteVE%=66 then pxbe%=xE% : pybe%=yE% if SpriteVE%=67 then pxbe%=xE%+24 : pybe%=yE%-12 if SpriteVE%=68 then pxbe%=xE%+47 : pybe%=yE% if SpriteVE%=65 then pxbe%=xE%+56 : pybe%=yE%+24 SPRITE_SHOW 69 : sprite_position 69,pxbe%,pybe% END_SUB
rem ============================================================================ SUB Test_collision_vaisseau_E(nspE%) ' test collision entre vaisseaux Collision_AABB(x%,y%,28,28,xE%,yE%,28,28) if tir$="OK" play 198 : ' explosion vaisseau vaisseau_detruit_par_E(nspE%) message "HA ! HA ! Il y a des kamikazes, chez vos ennemis !"+chr$(13)+chr$(13)+"Votre score: "+str$(score%): ' fin de partie gosub fin : EXIT_SUB end_if END_SUB rem ============================================================================ SUB vaisseau_detruit_par_E(NE%) dim_local px%,py% px%=sprite_x_position(SpriteV%) : py%=sprite_y_position(SpriteV%) ' animation de la destruction du vaisseau ami par un ennemi play 198 : ' explosion vaisseau off_key_down : tirE%=0 : SPRITE_HIDE 69 SPRITE_HIDE SpriteV% : SPRITE_HIDE NE% :' les deux sont détruit scene2d_interval 250 : scene2d_on sprite_position 12,px%-60,py%-60 : SPRITE_SHOW 12 : sprite_animated_frames 12,8,14 pause 2400 : SPRITE_HIDE 12 scene2d_off END_SUB
rem ============================================================================ ' nouveau vaisseau ennemi SUB new_ennemi() dim_local pde% ' choix aléatoire du vaisseau repeat : pde%=rnd(9): until pde%>0 and pde%<9 if pde%<1 or pde%>8 then message "Echec choix aléatoire pde%="+str$(pde%) : terminate ' positionner (aléatoirement) le vaisseau en dehors de l'écran suivant le choix if pde%=1 then SpriteVE%=63 : xE%=-64 : yE%=-64 :' Coin HG (VEBD) if pde%=2 then SpriteVE%=62 : xE%=rnd(screen_x) : yE%=-64 :' Haut (VEB) if pde%=3 then SpriteVE%=61 : xE%=screen_x+64 : yE%=-64 :' Coin HD (VEBG) if pde%=4 then SpriteVE%=64 : xE%=screen_x+64 : yE%=rnd(screen_y) :' Droite (VEG) if pde%=5 then SpriteVE%=66 : xE%=screen_x+64 : yE%=screen_y+64 :' Coin BD (VEHG) if pde%=6 then SpriteVE%=67 : xE%=rnd(screen_x) : yE%=screen_y+64 :' Bas (VEH) if pde%=7 then SpriteVE%=68 : xE%=-64 : yE%=screen_y+64 :' Coin BG (VEHD) if pde%=8 then SpriteVE%=65 : xE%=-64 : yE%=rnd(screen_y) :' Gauche (VED) sprite_position SpriteVE%,xE%,yE% ' déterminer une vitesse aléatoire repeat : vit_E%=rnd(vit_E_max%) : until vit_E%>vit_E_min% END_SUB
rem ============================================================================
fin: terminate RETURN A+
Dernière édition par Jean Claude le Ven 6 Avr 2018 - 7:54, édité 1 fois | |
|