Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | Calendrier |
|
|
| Extension de la commande DELETE | |
| | Auteur | Message |
---|
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Extension de la commande DELETE Mer 6 Fév 2013 - 22:52 | |
| Lorsque l'on supprime une FORM ou une SCENE3D par la commande DELETE, tous les objets contenus sont également supprimés, automatiquement. Ceci n'est pas vrai pour un SCENE2D. Les SPRITE contenus ne sont pas supprimés. Exemple: - Code:
-
picture 1 : top 1,10 : left 1,10 : width 1,50 : height 1,50 color 1,255,0,0
scene2d 2 : top 2,100 : left 2,10 : width 2,300 : height 2,300 color 2,220,220,220
image 3 : clipboard_copy 1 : clipboard_paste 3
sprite 1 : sprite_image_load 1,3 : sprite_position 1,10,10 sprite 2 : sprite_image_load 2,3 : sprite_position 2,110,110
message "On supprime la scene2d..." delete 2
message "On recrée la scene2d..." scene2d 2 : top 2,100 : left 2,10 : width 2,300 : height 2,300 color 2,220,220,220
message "On recrée le sprite 1..." sprite 1 : sprite_image_load 1,3 : sprite_position 1,10,10 : ' <=== cette commande provoque une erreir !
Est-il possible d'étendre la fonction de la commande DELETE de sorte à supprimer tous les SPRITE d'un SCENE2D qui est supprimé ? | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Extension de la commande DELETE Jeu 7 Fév 2013 - 0:04 | |
| Si on met - Code:
-
message sprite_exists(1) avant la ligne 20, on remarque que SPRITE 1 existe bel et bien mais il est devenu invisible ! Si on remplace la ligne 20 par - Code:
-
sprite 3 : sprite_image_load 3,3 : sprite_position 3,10,10 : ' <=== cette commande ne provoque plus d’erreur !
il n'y a plus d'erreur. Mais est-ce logique ?! | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Extension de la commande DELETE Jeu 7 Fév 2013 - 0:25 | |
| Non, justement. Ce n'est pas logique. On a alors deux sprites existants mais inutilisables, et il faut en créer d'autres.
je suis tombé sur ce problème avec mon jeu de bulles à éclater. Chaque bulle est un sprite. Et si je veux faire "Nouveau jeu", il ne suffit pas de supprimer la scene2d et de tout recréer, car les sprites continuent à exister. Il faut faire explicitement SPRITE_DELETE pour chaque sprite avant de faire DELETE de la scene2d. Ca marche, mais quelle lourdeur... On avait le même problème auparavent en supprimant une form ou un container, et Jack résolu le problème en supprimant automatiquement tout ce que ces objets contiennent. De même pour scene3d. Saus pour scene2d, et c'est dommage. | |
| | | bignono
Nombre de messages : 1127 Age : 67 Localisation : Val de Marne Date d'inscription : 13/11/2011
| Sujet: Re: Extension de la commande DELETE Jeu 7 Fév 2013 - 6:22 | |
| bonjour Klaus, Dans le manuel de référence, tu as la commande sprite_delete_all qui te permet de supprimer tous les sprites! C'est même mieux, car tu n'es pas obligé de supprimer ton scene_2d. J'ai repris ton exemple et j'ai rajouté cette commande, et il n'y a plus d'erreur. - Code:
-
picture 1 : top 1,10 : left 1,10 : width 1,50 : height 1,50 color 1,255,0,0 scene2d 2 : top 2,100 : left 2,10 : width 2,300 : height 2,300 color 2,220,220,220 image 3 : clipboard_copy 1 : clipboard_paste 3 sprite 1 : sprite_image_load 1,3 : sprite_position 1,10,10 sprite 2 : sprite_image_load 2,3 : sprite_position 2,110,110
message "On supprime les sprites": ' <== C'EST ICI sprite_delete_all : ' <== QUE ÇA SE PASSE! message "On supprime la scene2d..." delete 2
message "On recrée la scene2d..." scene2d 2 : top 2,100 : left 2,10 : width 2,300 : height 2,300 color 2,220,220,220 message "On recrée le sprite 1..." sprite 1 : sprite_image_load 1,3 : sprite_position 1,10,10 : ' <=== cette commande ne provoque plus d'erreur !
A+ | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Extension de la commande DELETE Jeu 7 Fév 2013 - 8:20 | |
| | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Extension de la commande DELETE Jeu 7 Fév 2013 - 8:29 | |
| DOMMAGE ! J'ai une violation d'accès sur la commande SPRITE_DELETE_ALL !Voici mon programme de bulles; avec cette commande dans la fonction "Rejouer": - Code:
-
' bulles.bas
labels() constantes() donnees() variables() form0() GUI() initialisations()
end
sub labels() label click, fermer, rejouer, rejouer1 end_sub
sub constantes() dim dossier$ : dossier$ = ".\" dim sz% : sz% = 40 : ' taille des sprite dim boules_ligne% : boules_ligne% = 25 dim speed% : speed% = 10 dim aff_lignes% : aff_lignes% = 10 dim maxlin% : maxlin% = 17 end_sub
sub donnees() data 204,4,8 data 13,78,229 data 9,234,39 data 216,237,18 data 113,201,179 data 248,236,248 data 40,35,30,25,20,15,12,10,8,7 end_sub
sub variables() dim no%, no1%, no2%, i%, j%, k%, k1%, s$, s1$, ns%, deltax%, deltay% dim x%, y%, dx, dy, xp, yp, contact%, l_contact%, c_contact% dim d_contact1, d_contact2, score%, w2d%, bonus%, highscore%, player$ dim x0%, y0%, l%, sx, sy, m%, spx, spy, lim, sx1, sy1, c%, dd% dim couleurs%(6,3), clrx%(20,boules_ligne%), clr%(2), plein%(20,boules_ligne%) dim posx%(20*boules_ligne%), posy%(20*boules_ligne%) dim coups%, difficulte%, difftab%(10) for i%=1 to 6 read couleurs%(i%,1) read couleurs%(i%,2) read couleurs%(i%,3) next i% for i%=1 to 10 read difftab%(i%) next i% end_sub
sub form0() caption 0,"Eclater les bulles !" w2d% = sz%*(boules_ligne%+0.5) width 0,w2d% + 200 height 0,640 end_sub
sub GUI() ' *** créer le panneau d'information alpha 10 : top 10,10 : left 10,w2d% + 10 : caption 10,"Score:" font_size 10,14 : font_bold 10 alpha 11 : top 11,10 : left 11,left(10)+90 font_size 11,14 : font_bold 11 : font_color 11,255,0,0 alpha 12 : top 12,40 : left 12,w2d% + 10 : caption 12,"Record:" font_size 12,14 : font_bold 12 alpha 13 : top 13,40 : left 13,left(10)+90 font_size 13,14 : font_bold 13 : font_color 13,255,0,0 alpha 14 : top 14,70 : left 14,w2d% + 10 : caption 14,"Joueur:" font_size 14,14 : font_bold 14 alpha 15 : top 15,70 : left 15,left(10)+90 font_size 15,14 : font_bold 15 : font_color 15,255,0,0 alpha 16 : top 16,100 : left 16,w2d% + 10 : caption 16,"Difficulté:" font_size 16,14 : font_bold 16 combo 17 : top 17,100 : left 17,left(10)+90 : width 17,60 for i%=1 to 10 item_add 17,str$(i%) next i% alpha 18 : top 18,130 : left 18,w2d% + 10 : caption 18,"Progressif:" font_size 18,14 : font_bold 18 check 19 : top 19,135 : left 19,left(10)+110 : width 19,30 button 20 : top 20,180 : left 20,w2d% + 10 : caption 20,"Fermer" font_size 20,14 : font_bold 20 on_click 20,fermer button 21 : top 21,230 : left 21,w2d% + 10 : caption 21,"Rejouer" font_size 21,14 : font_bold 21 on_click 21,rejouer image 3 scene2d 1 : width 1,w2d% : height 1,600 : ' full_s: pace 1 color 1,185,238,240 : sprite_target_is 1 on_click 1,click dessiner_terrain() end_sub
sub dessiner_terrain() ' *** créer le terrain de jeu coups% = 0 active 17 active 19 text 17,item_read$(17,1) mark_on 19 ' scene2d 1 : width 1,w2d% : height 1,600 : ' full_s: pace 1 ' color 1,185,238,240 : sprite_target_is 1 ' on_click 1,click x0% = (width(1)-sz%)/2 : y0% = height(1)-sz% ' *** dessiner la flèche en bas picture 2 : hide 2 : width 2,200 : height 2,50 : color 2,0,0,0 2d_target_is 2 : 2d_fill_color 255,255,255 : 2d_pen_color 0,0,200 2d_pen_dash : 2d_pen_width 3 2d_line 2,sz%/2,198,sz%/2 2d_line 2,sz%/2,12,sz%/2-10 2d_line 2,sz%/2,12,sz%/2+10 2d_image_copy 3,0,0,200,sz% 2d_pen_solid : 2d_pen_width 1 sprite 3 : sprite_image_load 3,3 : sprite_position 3,x0%+sz%,y0% 2d_target_is 0 : delete 2 ' *** dessiner les deux bulles de prévisualisation en bas picture 2 : hide 2 : width 2,sz% : height 2,sz% : color 2,0,0,0 2d_target_is 2 : 2d_fill_color 255,255,255 : 2d_pen_color 0,0,200 2d_circle sz%/2,sz%/2,sz%/2 2d_image_copy 3,0,0,sz%,sz% k% = rnd(6) + 0.5 clr%(1) = k% 2d_fill_color couleurs%(k%,1),couleurs%(k%,2),couleurs%(k%,3) 2d_circle sz%/2,sz%/2,sz%/2 2d_image_copy 3,0,0,sz%,sz% sprite 1 : sprite_image_load 1,3 : sprite_position 1,x0%,y0% k% = rnd(6) + 0.5 clr%(2) = k% 2d_fill_color couleurs%(k%,1),couleurs%(k%,2),couleurs%(k%,3) 2d_circle sz%/2,sz%/2,sz%/2 2d_image_copy 3,0,0,sz%,sz% sprite 2 : sprite_image_load 2,3 : sprite_position 2,x0%+250,y0% ' *** créer les emplacements de toutes leZ bulles ns% = 100 deltax% = sz% deltay% = sz%*1.67 l% = 0 while l%<aff_lignes% l% = l% + 1 for j%=1 to boules_ligne% ns% = ns% + 1 k% = rnd(6) + 0.5 clrx%(l%,j%) = k% plein%(l%,j%) = 1 2d_fill_color couleurs%(k%,1),couleurs%(k%,2),couleurs%(k%,3) 2d_circle sz%/2,sz%/2,sz%/2 2d_image_copy 3,0,0,sz%,sz% sprite ns% : sprite_image_load ns%,3 sprite_position ns%,(j%-1)*deltax%,((l%+1)/2-1)*deltay% ' if (j%=1) then message "y="+str$(sprite_y_position(ns%)) posx%(ns%-100) = (j%-1)*deltax%+sz%/2 posy%(ns%-100) = ((l%+1)/2-1)*deltay%+sz%/2 next j% l% = l% + 1 for j%=1 to boules_ligne% ns% = ns% + 1 k% = rnd(6) + 0.5 clrx%(l%,j%) = k% plein%(l%,j%) = 1 2d_fill_color couleurs%(k%,1),couleurs%(k%,2),couleurs%(k%,3) 2d_circle sz%/2,sz%/2,sz%/2 2d_image_copy 3,0,0,sz%,sz% sprite ns% : sprite_image_load ns%,3 sprite_position ns%,(j%-1)*deltax%+deltax%/2,(l%/2-1)*deltay%+deltay%/2 ' if (j%=1) then message "y="+str$(sprite_y_position(ns%)) posx%(ns%-100) = (j%-1)*deltax%+deltax%/2+sz%/2 posy%(ns%-100) = (l%/2-1)*deltay%+deltay%/2+sz%/2 next j% end_while for l%=aff_lignes%+1 to 20 for j%=1 to boules_ligne% clrx%(l%,j%) = 0 plein%(l%,j%) = 0 next j% next l% end_sub
sub initialisations() if file_exists(dossier$+"bulles.ini")=0 file_open_write 1,dossier$+"bulles.ini" file_writeln 1,"Score=0" file_writeln 1,"Joueur=inconnu" file_close 1 end_if caption 11,"0" file_open_read 1,dossier$+"bulles.ini" file_readln 1,s$ highscore% = val(mid$(s$,instr(s$,"=")+1,len(s$))) caption 13,str$(highscore%) file_readln 1,s$ player$ = mid$(s$,instr(s$,"=")+1,len(s$)) caption 15,player$ file_close 1 end_sub
fermer: if message_confirmation_yes_no("Voulez-vous vraiment sortir du jeu ?")<>1 then return if score%>highscore% s$ = message_input$("Vous êtes le champion !","Donnez votre nom:",player$) player$ = s$ file_open_write 1,dossier$+"bulles.ini" file_writeln 1,"Score="+str$(score%) file_writeln 1,"Joueur="+player$ file_close 1 end_if terminate rejouer: if message_confirmation_yes_no("Voulez-vous vraiment écarter pa partie actuelle ?")<>1 then return rejouer1: ' 2d_target_is 0 ' for i%=1 to 3 ' sprite_delete i% ' next i% ' for i%=1 to 20 ' for j%=1 to boules_ligne% ' if plein%(i%,j%)=1 then sprite_delete 100+(i%-1)*boules_ligne% + j% ' next j% ' next i% ' delete 1 : delete 2 message "avant SPRITE_DELETE_ALL" sprite_delete_all : ' <=== violation d'accès ici ! message "apès SPRITE_DELETE_ALL" score% = 0 bonus% = 0 caption 11,str$(score%) dessiner_terrain() return
click: inactive 17 inactive 19 difficulte% = val(text$(17)) off_click 1 off_click 20 off_click 21 coups% = coups% + 1 x% = mouse_x_left_down(1) - sz%/2 y% = mouse_y_left_down(1) - sz%/2 dx = x% - x0% dy = y% - y0% if abs(dx)>speed% dy = dy*speed%/abs(dx) dx = speed%*sgn(dx) end_if if abs(dy)>speed% dx = dx*speed%/abs(dy) dy = speed%*sgn(dy) end_if k% = clr%(1) 2d_fill_color couleurs%(k%,1),couleurs%(k%,2),couleurs%(k%,3) 2d_circle sz%/2,sz%/2,sz%/2 2d_image_copy 3,0,0,sz%,sz% sprite 20 : sprite_image_load 20,3 sprite_position 20,x0%,y0% lim = sz%*0.95 sx = x0% sy = y0%
repeat : ' boucle infinie sx = sx + dx : sy = sy + dy if sx>width(1)-sz% sx = width(1)-sz% dx = 0 -dx bonus% = bonus% + 50 end_if if sy>height(1)-sz% sy = height(1)-sz% dy = 0 -dy bonus% = bonus% + 50 end_if if sx<1 sx = 1 dx = 0 -dx bonus% = bonus% + 50 end_if if sy<1 sy = 1 dy = 0 -dy bonus% = bonus% + 50 end_if sprite_position 20,sx,sy sx1 = sx + sz%/2 sy1 = sy + sz%/2 ns% = 0 l% = int((sy1+deltay%/2-1)/int(deltay%/2)) if l%<1 then l% = 1 if l%>20 then l%=20 if bin_and(l%,1)=1 c% = int((sx1+sz%-1)/sz%) if c%<1 then c% = 1 if c%>boules_ligne% then c%=boules_ligne% dd% = 1 contact(sx1,sy1,l%,c%,dd%) else c% = int((sx1+sz%/2-1)/sz%) if c%<1 then c% = 1 if c%>boules_ligne% then c%=boules_ligne% dd% = 0 contact(sx1,sy1,l%,c%,dd%) end_if select contact% case 1 ' message "G "+str$(l_contact%)+","+str$(c_contact%) case 2 ' message "D "+str$(l_contact%)+","+str$(c_contact%) case 3 ' message "HG "+str$(l_contact%)+","+str$(c_contact%) if c_contact%<boules_ligne% if plein%(l_contact%,c_contact%+1)=0 l% = l_contact% : c% = c_contact% + 1 end_if end_if case 4 ' message "HD "+str$(l_contact%)+","+str$(c_contact%) if c_contact%>1 if plein%(l_contact%,c_contact%-1)=0 l% = l_contact% : c% = c_contact% - 1 end_if end_if case 5 ' message "BG "+str$(l_contact%)+","+str$(c_contact%) if plein%(l_contact%,c_contact%+1)=0 l% = l_contact% : c% = c_contact% + 1 end_if case 6 ' message "BD "+str$(l_contact%)+","+str$(c_contact%) if c_contact%>1 if plein%(l_contact%,c_contact%-1)=0 l% = l_contact% : c% = c_contact% - 1 end_if end_if end_select if contact%>0 then passer_porte(l%,c%,dd%) if contact%>0 if l%=maxlin% if message_confirmation_yes_no("Dommage ! Vous avez perdu ! Rejouer ?")<>1 then terminate gosub rejouer1 return end_if placer(l%,c%,dd%) purger(l%,c%,dd%) if coups%>difftab%(difficulte%) for j%=1 to boules_ligne% for l%=1 to 20 if plein%(l%,j%)=0 if l%>=maxlin% if message_confirmation_yes_no("Dommage ! Vous avez perdu ! Rejouer ?")<>1 then terminate gosub rejouer1 return end_if ajouter(l%,j%) coups% = 0 exit_for end_if next l% next j% if checked(19)=1 if difficulte%<10 then difficulte% = difficulte% + 1 text 17,str$(difficulte%) end_if end_if suivant() sprite_delete 20 on_click 1,click on_click 20,fermer on_click 21,rejouer return end_if until 1=2 : ' fin boucle infinie return sub contact(ssx,ssy,ll%,cc%,d%) ' if ll%<12 ' message str$(ssx)+","+str$(ssy)+": "+str$(ll%)+","+str$(cc%)+"+"+str$(d%) ' end_if contact% = 0 d_contact1 = 2*sz% d_contact2 = 2*sz%
if cc%>1 if plein%(ll%,cc%-1)=1 : ' G ' message str$(ll%)+","+str$(cc%)+": G "+str$(d%) if abs(ssx-posx%((ll%-1)*boules_ligne%+cc%-1))<lim if abs(ssy-posy%((ll%-1)*boules_ligne%+cc%-1))<lim contact% = 1 l_contact% = ll% c_contact% = cc% - 1 exit_sub end_if end_if end_if end_if if cc%<boules_ligne% if plein%(ll%,cc%+1)=1 : ' D ' message str$(ll%)+","+str$(cc%)+": D "+str$(d%) if abs(ssx-posx%((ll%-1)*boules_ligne%+cc%+1))<lim if abs(ssy-posy%((ll%-1)*boules_ligne%+cc%+1))<lim contact% = 2 l_contact% = ll% c_contact% = cc% + 1 exit_sub end_if end_if end_if end_if
if (ll%>1) and ((cc%-d%)>0) if plein%(ll%-1,cc%-d%)=1 : ' HG ' message str$(ll%)+","+str$(cc%)+": HG "+str$(d%) if abs(ssx-posx%((ll%-2)*boules_ligne%+cc%-d%))<lim if abs(ssy-posy%((ll%-2)*boules_ligne%+cc%-d%))<lim d_contact1 = sqr( (ssx-posx%((ll%-2)*boules_ligne%+cc%-d%))*(ssx-posx%((ll%-2)*boules_ligne%+cc%-d%)) + (ssy-posy%((ll%-2)*boules_ligne%+cc%-d%))*(ssy-posy%((ll%-2)*boules_ligne%+cc%-d%)) ) contact% = 3 end_if end_if end_if end_if if (ll%>1) and ((cc%-d%+1)<=boules_ligne%) if plein%(ll%-1,cc%-d%+1)=1 : ' HD ' message str$(ll%)+","+str$(cc%)+": HD "+str$(d%) if abs(ssx-posx%((ll%-2)*boules_ligne%+cc%-d%+1))<lim if abs(ssy-posy%((ll%-2)*boules_ligne%+cc%-d%+1))<lim d_contact2 = sqr( (ssx-posx%((ll%-2)*boules_ligne%+cc%-d%+1))*(ssx-posx%((ll%-2)*boules_ligne%+cc%-d%+1)) + (ssy-posy%((ll%-2)*boules_ligne%+cc%-d%+1))*(ssy-posy%((ll%-2)*boules_ligne%+cc%-d%+1)) ) contact% = 4 end_if end_if end_if end_if if contact%>0 if d_contact1<d_contact2 ' message "G" contact% = 3 l_contact% = ll% - 1 c_contact% = cc% - d% if c_contact%<boules_ligne% ' message "monter droite "+str$(ll%)+","+str$(cc%)+" "+str$(plein%(l_contact%,c_contact%+1)) if dx>sz%/2 and plein%(l_contact%,c_contact%+1)=0 then contact% = 0 end_if else ' message "D" contact% = 4 l_contact% = ll% - 1 c_contact% = cc% - d% + 1 if c_contact%>1 ' message "monter gauche "+str$(ll%)+","+str$(cc%)+" "+str$(plein%(l_contact%,c_contact%+1)) if dx<(0-sz%/2) and plein%(l_contact%,c_contact%-1)=0 then contact% = 0 end_if end_if if contact%>0 if c_contact%<1 then c_contact% = 1 if c_contact%>boules_ligne% then c_contact% = boules_ligne% end_if exit_sub end_if if (ll%<10) and ((cc%-d%)>0) if plein%(ll%+1,cc%-d%)=1 : ' BG ' message str$(ll%)+","+str$(cc%)+": BG "+str$(d%) if abs(ssx-posx%((ll%)*boules_ligne%+cc%-d%))<lim if abs(ssy-posy%((ll%)*boules_ligne%+cc%-d%))<lim d_contact1 = sqr( (ssy-posy%((ll%)*boules_ligne%+cc%-d%))*(ssy-posy%((ll%)*boules_ligne%+cc%-d%)) + (ssy-posy%((ll%)*boules_ligne%+cc%-d%))*(ssy-posy%((ll%)*boules_ligne%+cc%-d%)) ) contact% = 5 l_contact% = ll% + 1 c_contact% = cc% - d% exit_sub end_if end_if end_if end_if if (ll%<20) and ((cc%-d%+1)<boules_ligne%) if plein%(ll%+1,cc%-d%+1)=1 : ' BD ' message str$(ll%)+","+str$(cc%)+": BD "+str$(d%) if abs(ssx-posx%((ll%)*boules_ligne%+cc%-d%+1))<lim if abs(ssy-posy%((ll%)*boules_ligne%+cc%-d%+1))<lim d_contact2 = sqr( (ssx-posx%((ll%)*boules_ligne%+cc%-d%+1))*(ssx-posx%((ll%)*boules_ligne%+cc%-d%+1)) + (ssy-posy%((ll%)*boules_ligne%+cc%-d%+1))*(ssy-posy%((ll%)*boules_ligne%+cc%-d%+1)) ) contact% = 6 l_contact% = ll% + 1 c_contact% = cc% - d% + 1 end_if end_if end_if end_if if contact%>0 if d_contact1<d_contact2 contact% = 5 l_contact% = ll% + 1 c_contact% = cc% - d% if c_contact%<boules_ligne% if plein%(l_contact%,c_contact%+1)=0 then contact% = 0 end_if else contact% = 6 l_contact% = ll% + 1 c_contact% = cc% - d% + 1 if c_contact%>1 if plein%(l_contact%,c_contact%-1)=0 then contact% = 0 end_if end_if if contact%>0 if c_contact%<1 then c_contact% = 1 if c_contact%>boules_ligne% then c_contact% = boules_ligne% end_if exit_sub end_if end_sub
sub placer(ll%,cc%,d%) ' if plein%(ll%,cc%)=1 then message "Oups... "+str$(ll%)+","+str$(cc%) plein%(ll%,cc%) = 1 if bin_and(ll%,1)=1 posx%((ll%-1)*boules_ligne%+cc%) = (cc%-1)*deltax%+sz%/2 posy%((ll%-1)*boules_ligne%+cc%) = ((ll%+1)/2-1)*deltay%+sz%/2 else posx%((ll%-1)*boules_ligne%+cc%) = (cc%-1)*deltax%+deltax%/2+sz%/2 posy%((ll%-1)*boules_ligne%+cc%) = (ll%/2-1)*deltay%+deltay%/2+sz%/2 end_if k1% = clr%(1) clrx%(ll%,cc%) = k1% 2d_fill_color couleurs%(k1%,1),couleurs%(k1%,2),couleurs%(k1%,3) 2d_circle sz%/2,sz%/2,sz%/2 2d_image_copy 3,0,0,sz%,sz% k1% = 100+(ll%-1)*boules_ligne%+cc% sprite k1% : sprite_image_load k1%,3 : sprite_position k1%,posx%(k1%-100)-sz%/2,posy%(k1%-100)-sz%/2 end_sub
sub passer_porte(ll%,cc%,d%) if dx<0 if dy<0 if ll%>1 ' en haut à gauche ' message "porte HG: "+str$(ll%)+","+str$(cc%)+" "+str$(d%) if (cc%+d%)<=boules_ligne% if (cc%+d%-2)>0 if (plein%(ll%,cc%+d%-2)=0) or (plein%(ll%,cc%+d%)=0) then exit_sub if (cc%+d%-1)>0 if plein%(ll%-1,cc%+d%-1)=0 contact%=0 sx = (cc%+d%-2)*deltax% sy = ((ll%-2)/2)*deltay% sx1 = sx + sz%/2 sy1 = sy + sz%/2 bonus% = bonus% + 20*difficulte% sprite_position 20,sx,sy ' message "passé "+str$(contact%) end_if end_if end_if end_if end_if else ' en bas à gauche if ll%<20 ' message "porte BG: "+str$(ll%)+","+str$(cc%)+" "+str$(d%) if cc%+d%<=bules_ligne% if (cc%+d%-1)>0 if (plein%(ll%,cc%+d%-2)=0) or (plein%(ll%,cc%+d%)=0) then exit_sub if (cc%+d%-1)>0 if plein%(ll%+1,cc%+d%-1)=0 contact%=0 sx = (cc%+d%-2)*deltax% sy = ((ll%+2)/2)*deltay% sx1 = sx + sz%/2 sy1 = sy + sz%/2 bonus% = bonus% + 20*difficulte% sprite_position 20,sx,sy ' message "passé "+str$(contact%) end_if end_if end_if end_if end_if end_if else if dy<0 ' en haut à droite ' message "porte HD: "+str$(ll%)+","+str$(cc%)+" "+str$(d%) if ll%>1 if (cc%+d%-2)>0 if cc%+d%<=boules_ligne% if (plein%(ll%,cc%+d%-2)=0) or (plein%(ll%,cc%+d%)=0) then exit_sub if (cc%+d%)<=boules_ligne% if plein%(ll%-1,cc%+d%)=0 contact%=0 sx = (cc%+d%-1)*deltax% sy = ((ll%-2)/2)*deltay% sx1 = sx + sz%/2 sy1 = sy + sz%/2 bonus% = bonus% + 20*difficulte% sprite_position 20,sx,sy ' message "passé "+str$(contact%) end_if end_if end_if end_if end_if else ' en bas à droite ' message "porte BD: "+str$(ll%)+","+str$(cc%)+" "+str$(d%) if ll%<20 if (cc%+d%-2)>0 if cc%+d%<=boules_ligne% if (plein%(ll%,cc%+d%-2)=0) or (plein%(ll%,cc%+d%)=0) then exit_sub if (cc%+d%)<=boules_ligne% if plein%(ll%-1,cc%+d%)=0 contact%=0 sx = (cc%+d%-1)*deltax% sy = ((ll%+2)/2)*deltay% sx1 = sx + sz%/2 sy1 = sy + sz%/2 bonus% = bonus% + 20*difficulte% sprite_position 20,sx,sy ' message "passé "+str$(contact%) end_if end_if end_if end_if end_if end_if end_if end_sub
sub ajouter(ll%,cc%) plein%(ll%,cc%) = 1 if bin_and(ll%,1)=1 posx%((ll%-1)*boules_ligne%+cc%) = (cc%-1)*deltax%+sz%/2 posy%((ll%-1)*boules_ligne%+cc%) = ((ll%+1)/2-1)*deltay%+sz%/2 else posx%((ll%-1)*boules_ligne%+cc%) = (cc%-1)*deltax%+deltax%/2+sz%/2 posy%((ll%-1)*boules_ligne%+cc%) = (ll%/2-1)*deltay%+deltay%/2+sz%/2 end_if k1% = rnd(6) clrx%(ll%,cc%) = k1% 2d_fill_color couleurs%(k1%,1),couleurs%(k1%,2),couleurs%(k1%,3) 2d_circle sz%/2,sz%/2,sz%/2 2d_image_copy 3,0,0,sz%,sz% k1% = 100+(ll%-1)*boules_ligne%+cc% ' message "Ajout: "+str$(ll%)+","+str$(cc%) sprite k1% : sprite_image_load k1%,3 : sprite_position k1%,posx%(k1%-100)-sz%/2,posy%(k1%-100)-sz%/2 end_sub
sub purger(ll%,cc%,d%) dim_local p%, i%, ld%, cd%, nd%, npurge%, ll1%, cc1%, temp% dlist 30 : dlist 31 : ' memoriser les lignes et colonnes des sprites à supprimer item_add 30,str$(ll%) : item_add 31,str$(cc%) k% = clrx%(ll%,cc%) purger_1(ll%,cc%,k%) npurge% = 0 while npurge%<count(30) temp% = count(30) for i%=npurge%+1 to temp% ll1% = val(item_read$(30,i%)) cc1% = val(item_read$(31,i%)) purger_1(ll1%,cc1%,k%) next i% npurge% = temp% end_while if count(30)>2 for i%=1 to count(30) ld% = val(item_read$(30,i%)) cd% = val(item_read$(31,i%)) nd% = 100 + (ld%-1)*boules_ligne% + cd% clrx%(ld%,cd%) = 0 plein%(ld%,cd%) = 0 sprite_delete nd% score% = score% + (10 + bonus%)*difficulte% caption 11,str$(score%) next i% end_if delete 30 : delete 31 bonus% = 0 end_sub
sub purger_1(ll%,cc%,k%) purger_sprite(ll%,cc%-1,k%) purger_sprite(ll%,cc%+1,k%) if bin_and(ll%,1)=1 purger_sprite(ll%-1,cc%-1,k%) purger_sprite(ll%-1,cc%,k%) purger_sprite(ll%+1,cc%-1,k%) purger_sprite(ll%+1,cc%,k%) else purger_sprite(ll%-1,cc%,k%) purger_sprite(ll%-1,cc%+1,k%) purger_sprite(ll%+1,cc%,k%) purger_sprite(ll%+1,cc%+1,k%) end_if end_sub
sub purger_sprite(ll%,cc%,kk%) dim_local i% if ll%<1 then exit_sub if cc%<1 then exit_sub if ll%>20 then exit_sub if cc%>boules_ligne% then exit_sub if plein%(ll%,cc%)=1 if clrx%(ll%,cc%)=kk% for i%=1 to count(30) if (item_read$(30,i%)=str$(ll%)) and (item_read$(31,i%)=str$(cc%)) then exit_sub next i% item_add 30,str$(ll%) item_add 31,str$(cc%) end_if end_if end_sub
sub suivant() k1% = clr%(2) clr%(1) = k1% 2d_fill_color couleurs%(k1%,1),couleurs%(k1%,2),couleurs%(k1%,3) 2d_circle sz%/2,sz%/2,sz%/2 2d_image_copy 3,0,0,sz%,sz% sprite_image_load 1,3 : sprite_position 1,x0%,y0% k1% = rnd(6) + 0.5 clr%(2) = k1% 2d_fill_color couleurs%(k1%,1),couleurs%(k1%,2),couleurs%(k1%,3) 2d_circle sz%/2,sz%/2,sz%/2 2d_image_copy 3,0,0,sz%,sz% sprite_image_load 2,3 : sprite_position 2,x0%+250,y0% end_sub
| |
| | | bignono
Nombre de messages : 1127 Age : 67 Localisation : Val de Marne Date d'inscription : 13/11/2011
| Sujet: Re: Extension de la commande DELETE Jeu 7 Fév 2013 - 9:21 | |
| Désolé, mais je ne vois pas pourquoi il y a une violation. J'ai déjà remarqué ce genre de problème depuis les sub avec 3d_delete_all et timer_off_all et dans certains autres cas que je ne me souviens pas. Il doit y avoir conflit de mémoire quelque part! C'est pour cela que j'utilise très peu les sub, je préfère encore le mode évènementiel quand j'ai un gros programme à développer. Les sub je les utilise pour un petit programme où j'ai besoin d'une fonction précise ou d'un calcul itératif. Mais je peux me tromper! | |
| | | bignono
Nombre de messages : 1127 Age : 67 Localisation : Val de Marne Date d'inscription : 13/11/2011
| Sujet: Re: Extension de la commande DELETE Jeu 7 Fév 2013 - 9:41 | |
| C'est vraiment bizarre que la commande sprite_delete_all ne réagisse pas si je met ceci dans ta procédure rejouer: - Code:
-
message "avant SPRITE_DELETE_ALL" ' sprite_target_is 1 sprite_delete 3 pause 1000 sprite_delete 2 pause 1000 sprite_delete 1 pause 1000 sprite_delete 101 pause 1000 sprite_delete 350 pause 1000 sprite_delete_all : ' <=== violation d'accès ici ! pause 1000 message "apès SPRITE_DELETE_ALL" score% = 0 bonus% = 0 caption 11,str$(score%) dessiner_terrain() return
Je commence par supprimer les 3 sprites en bas, les 2 bulles et la flèche, puis la première bulle en haut à gauche et la dernière en bas à droite! Il doit y avoir un bug quelque part. Jack doit vérifier cette commande et son comportement avec les boucles et sub. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Extension de la commande DELETE Jeu 7 Fév 2013 - 9:57 | |
| J'ai mis une exécution conditionnelle, gérée par la variable xxx% définie en ligne 18. Avec la valeur 0, cela marche comme avant, avec un SPRITE_DELETE explicite pour chaque sprite. Avec la valeur 1, le programme utilise SPRITE_DELETE_ALL et crashe: - Code:
-
' bulles.bas
labels() constantes() donnees() variables() form0() GUI() initialisations()
end
sub labels() label click, fermer, rejouer, rejouer1 end_sub
sub constantes() dim xxx% : xxx% = 0 dim dossier$ : dossier$ = ".\" dim sz% : sz% = 40 : ' taille des sprite dim boules_ligne% : boules_ligne% = 25 dim speed% : speed% = 10 dim aff_lignes% : aff_lignes% = 10 dim maxlin% : maxlin% = 17 end_sub
sub donnees() data 204,4,8 data 13,78,229 data 9,234,39 data 216,237,18 data 113,201,179 data 248,236,248 data 40,35,30,25,20,15,12,10,8,7 end_sub
sub variables() dim no%, no1%, no2%, i%, j%, k%, k1%, s$, s1$, ns%, deltax%, deltay% dim x%, y%, dx, dy, xp, yp, contact%, l_contact%, c_contact%, fpurge% dim d_contact1, d_contact2, score%, w2d%, bonus%, highscore%, player$ dim x0%, y0%, l%, sx, sy, m%, spx, spy, lim, sx1, sy1, c%, dd% dim couleurs%(6,3), clrx%(20,boules_ligne%), clr%(2), plein%(20,boules_ligne%) dim posx%(20*boules_ligne%), posy%(20*boules_ligne%) dim coups%, difficulte%, difftab%(10) dim tableau%(20,50) dim p%, c$, ndlist%, flag% for i%=1 to 6 read couleurs%(i%,1) read couleurs%(i%,2) read couleurs%(i%,3) next i% for i%=1 to 10 read difftab%(i%) next i% end_sub
sub form0() caption 0,"Eclater les bulles !" w2d% = sz%*(boules_ligne%+0.5) width 0,w2d% + 200 height 0,640 end_sub
sub GUI() ' *** créer le panneau d'information alpha 10 : top 10,10 : left 10,w2d% + 10 : caption 10,"Score:" font_size 10,14 : font_bold 10 alpha 11 : top 11,10 : left 11,left(10)+90 font_size 11,14 : font_bold 11 : font_color 11,255,0,0 alpha 12 : top 12,40 : left 12,w2d% + 10 : caption 12,"Record:" font_size 12,14 : font_bold 12 alpha 13 : top 13,40 : left 13,left(10)+90 font_size 13,14 : font_bold 13 : font_color 13,255,0,0 alpha 14 : top 14,70 : left 14,w2d% + 10 : caption 14,"Joueur:" font_size 14,14 : font_bold 14 alpha 15 : top 15,70 : left 15,left(10)+90 font_size 15,14 : font_bold 15 : font_color 15,255,0,0 alpha 16 : top 16,100 : left 16,w2d% + 10 : caption 16,"Difficulté:" font_size 16,14 : font_bold 16 combo 17 : top 17,100 : left 17,left(10)+90 : width 17,60 for i%=1 to 10 item_add 17,str$(i%) next i% alpha 18 : top 18,130 : left 18,w2d% + 10 : caption 18,"Progressif:" font_size 18,14 : font_bold 18 check 19 : top 19,135 : left 19,left(10)+110 : width 19,30 button 20 : top 20,180 : left 20,w2d% + 10 : caption 20,"Fermer" font_size 20,14 : font_bold 20 on_click 20,fermer button 21 : top 21,230 : left 21,w2d% + 10 : caption 21,"Rejouer" font_size 21,14 : font_bold 21 on_click 21,rejouer image 3 if xxx%=1 scene2d 1 : width 1,w2d% : height 1,600 : ' full_s: pace 1 color 1,185,238,240 : sprite_target_is 1 on_click 1,click end_if dessiner_terrain() end_sub
sub dessiner_terrain() ' *** créer le terrain de jeu coups% = 0 active 17 active 19 text 17,item_read$(17,1) mark_on 19 if xxx%=0 scene2d 1 : width 1,w2d% : height 1,600 : ' full_s: pace 1 color 1,185,238,240 : sprite_target_is 1 on_click 1,click end_if x0% = (width(1)-sz%)/2 : y0% = height(1)-sz% ' *** dessiner la flèche en bas picture 2 : hide 2 : width 2,200 : height 2,50 : color 2,0,0,0 2d_target_is 2 : 2d_fill_color 255,255,255 : 2d_pen_color 0,0,200 2d_pen_dash : 2d_pen_width 3 2d_line 2,sz%/2,198,sz%/2 2d_line 2,sz%/2,12,sz%/2-10 2d_line 2,sz%/2,12,sz%/2+10 2d_image_copy 3,0,0,200,sz% 2d_pen_solid : 2d_pen_width 1 sprite 3 : sprite_image_load 3,3 : sprite_position 3,x0%+sz%,y0% 2d_target_is 0 : delete 2 ' *** dessiner les deux bulles de prévisualisation en bas picture 2 : hide 2 : width 2,sz% : height 2,sz% : color 2,0,0,0 2d_target_is 2 : 2d_fill_color 255,255,255 : 2d_pen_color 0,0,200 2d_circle sz%/2,sz%/2,sz%/2 2d_image_copy 3,0,0,sz%,sz% k% = rnd(6) + 0.5 clr%(1) = k% 2d_fill_color couleurs%(k%,1),couleurs%(k%,2),couleurs%(k%,3) 2d_circle sz%/2,sz%/2,sz%/2 2d_image_copy 3,0,0,sz%,sz% sprite 1 : sprite_image_load 1,3 : sprite_position 1,x0%,y0% k% = rnd(6) + 0.5 clr%(2) = k% 2d_fill_color couleurs%(k%,1),couleurs%(k%,2),couleurs%(k%,3) 2d_circle sz%/2,sz%/2,sz%/2 2d_image_copy 3,0,0,sz%,sz% sprite 2 : sprite_image_load 2,3 : sprite_position 2,x0%+250,y0% ' *** créer les emplacements de toutes leZ bulles ns% = 100 deltax% = sz% deltay% = sz%*1.67 l% = 0 while l%<aff_lignes% l% = l% + 1 for j%=1 to boules_ligne% ns% = ns% + 1 k% = rnd(6) + 0.5 clrx%(l%,j%) = k% plein%(l%,j%) = 1 2d_fill_color couleurs%(k%,1),couleurs%(k%,2),couleurs%(k%,3) 2d_circle sz%/2,sz%/2,sz%/2 2d_image_copy 3,0,0,sz%,sz% sprite ns% : sprite_image_load ns%,3 sprite_position ns%,(j%-1)*deltax%,((l%+1)/2-1)*deltay% ' if (j%=1) then message "y="+str$(sprite_y_position(ns%)) posx%(ns%-100) = (j%-1)*deltax%+sz%/2 posy%(ns%-100) = ((l%+1)/2-1)*deltay%+sz%/2 next j% l% = l% + 1 for j%=1 to boules_ligne% ns% = ns% + 1 k% = rnd(6) + 0.5 clrx%(l%,j%) = k% plein%(l%,j%) = 1 2d_fill_color couleurs%(k%,1),couleurs%(k%,2),couleurs%(k%,3) 2d_circle sz%/2,sz%/2,sz%/2 2d_image_copy 3,0,0,sz%,sz% sprite ns% : sprite_image_load ns%,3 sprite_position ns%,(j%-1)*deltax%+deltax%/2,(l%/2-1)*deltay%+deltay%/2 ' if (j%=1) then message "y="+str$(sprite_y_position(ns%)) posx%(ns%-100) = (j%-1)*deltax%+deltax%/2+sz%/2 posy%(ns%-100) = (l%/2-1)*deltay%+deltay%/2+sz%/2 next j% end_while for l%=aff_lignes%+1 to 20 for j%=1 to boules_ligne% clrx%(l%,j%) = 0 plein%(l%,j%) = 0 next j% next l% end_sub
sub initialisations() if file_exists(dossier$+"bulles.ini")=0 file_open_write 1,dossier$+"bulles.ini" file_writeln 1,"Score=0" file_writeln 1,"Joueur=inconnu" file_close 1 end_if caption 11,"0" file_open_read 1,dossier$+"bulles.ini" file_readln 1,s$ highscore% = val(mid$(s$,instr(s$,"=")+1,len(s$))) caption 13,str$(highscore%) file_readln 1,s$ player$ = mid$(s$,instr(s$,"=")+1,len(s$)) caption 15,player$ file_close 1 for i%=1 to 20 for j%=1 to 50 step 2 tableau%(i%,j%) = 0 - bin_and(i%+1,1) tableau%(i%,j%+1) = 0 - bin_and(i%,1) next j% next i% end_sub
fermer: if message_confirmation_yes_no("Voulez-vous vraiment sortir du jeu ?")<>1 then return if score%>highscore% s$ = message_input$("Vous êtes le champion !","Donnez votre nom:",player$) player$ = s$ file_open_write 1,dossier$+"bulles.ini" file_writeln 1,"Score="+str$(score%) file_writeln 1,"Joueur="+player$ file_close 1 end_if terminate rejouer: if message_confirmation_yes_no("Voulez-vous vraiment écarter pa partie actuelle ?")<>1 then return rejouer1: if xxx%=0 2d_target_is 0 for i%=1 to 3 sprite_delete i% next i% for i%=1 to 20 for j%=1 to boules_ligne% if plein%(i%,j%)=1 then sprite_delete 100+(i%-1)*boules_ligne% + j% next j% next i% delete 1 : delete 2 else message "avant SPRITE_DELETE_ALL" sprite_delete_all message "après SPRITE_DELETE_ALL" end_if score% = 0 bonus% = 0 caption 11,str$(score%) dessiner_terrain() return
click: inactive 17 inactive 19 difficulte% = val(text$(17)) off_click 1 off_click 20 off_click 21 coups% = coups% + 1 x% = mouse_x_left_down(1) - sz%/2 y% = mouse_y_left_down(1) - sz%/2 dx = x% - x0% dy = y% - y0% if abs(dx)>speed% dy = dy*speed%/abs(dx) dx = speed%*sgn(dx) end_if if abs(dy)>speed% dx = dx*speed%/abs(dy) dy = speed%*sgn(dy) end_if k% = clr%(1) 2d_fill_color couleurs%(k%,1),couleurs%(k%,2),couleurs%(k%,3) 2d_circle sz%/2,sz%/2,sz%/2 2d_image_copy 3,0,0,sz%,sz% sprite 20 : sprite_image_load 20,3 sprite_position 20,x0%,y0% lim = sz%*0.95 sx = x0% sy = y0%
repeat : ' boucle infinie sx = sx + dx : sy = sy + dy if sx>width(1)-sz% sx = width(1)-sz% dx = 0 -dx bonus% = bonus% + 50 end_if if sy>height(1)-sz% sy = height(1)-sz% dy = 0 -dy bonus% = bonus% + 50 end_if if sx<1 sx = 1 dx = 0 -dx bonus% = bonus% + 50 end_if if sy<1 sy = 1 dy = 0 -dy bonus% = bonus% + 50 end_if sprite_position 20,sx,sy sx1 = sx + sz%/2 sy1 = sy + sz%/2 ns% = 0 l% = int((sy1+deltay%/2-1)/int(deltay%/2)) if l%<1 then l% = 1 if l%>20 then l%=20 if bin_and(l%,1)=1 c% = int((sx1+sz%-1)/sz%) if c%<1 then c% = 1 if c%>boules_ligne% then c%=boules_ligne% dd% = 1 contact(sx1,sy1,l%,c%,dd%) else c% = int((sx1+sz%/2-1)/sz%) if c%<1 then c% = 1 if c%>boules_ligne% then c%=boules_ligne% dd% = 0 contact(sx1,sy1,l%,c%,dd%) end_if select contact% case 1 ' message "G "+str$(l_contact%)+","+str$(c_contact%) case 2 ' message "D "+str$(l_contact%)+","+str$(c_contact%) case 3 ' message "HG "+str$(l_contact%)+","+str$(c_contact%) if c_contact%<boules_ligne% if plein%(l_contact%,c_contact%+1)=0 l% = l_contact% : c% = c_contact% + 1 end_if end_if case 4 ' message "HD "+str$(l_contact%)+","+str$(c_contact%) if c_contact%>1 if plein%(l_contact%,c_contact%-1)=0 l% = l_contact% : c% = c_contact% - 1 end_if end_if case 5 ' message "BG "+str$(l_contact%)+","+str$(c_contact%) if plein%(l_contact%,c_contact%+1)=0 l% = l_contact% : c% = c_contact% + 1 end_if case 6 ' message "BD "+str$(l_contact%)+","+str$(c_contact%) if c_contact%>1 if plein%(l_contact%,c_contact%-1)=0 l% = l_contact% : c% = c_contact% - 1 end_if end_if end_select if contact%>0 then passer_porte(l%,c%,dd%) if contact%>0 if l%=maxlin% if message_confirmation_yes_no("Dommage ! Vous avez perdu ! Rejouer ?")<>1 then terminate gosub rejouer1 return end_if placer(l%,c%,dd%) purger(l%,c%,dd%) ' *** en cours d'écriture if fpurge%=1 then orphelins() if coups%>difftab%(difficulte%) for j%=1 to boules_ligne% for l%=1 to 20 if plein%(l%,j%)=0 if l%>=maxlin% if message_confirmation_yes_no("Dommage ! Vous avez perdu ! Rejouer ?")<>1 then terminate gosub rejouer1 return end_if ajouter(l%,j%) coups% = 0 exit_for end_if next l% next j% if checked(19)=1 if difficulte%<10 then difficulte% = difficulte% + 1 text 17,str$(difficulte%) end_if end_if suivant() sprite_delete 20 on_click 1,click on_click 20,fermer on_click 21,rejouer return end_if until 1=2 : ' fin boucle infinie return sub contact(ssx,ssy,ll%,cc%,d%) ' if ll%<12 ' message str$(ssx)+","+str$(ssy)+": "+str$(ll%)+","+str$(cc%)+"+"+str$(d%) ' end_if contact% = 0 d_contact1 = 2*sz% d_contact2 = 2*sz%
if cc%>1 if plein%(ll%,cc%-1)=1 : ' G ' message str$(ll%)+","+str$(cc%)+": G "+str$(d%) if abs(ssx-posx%((ll%-1)*boules_ligne%+cc%-1))<lim if abs(ssy-posy%((ll%-1)*boules_ligne%+cc%-1))<lim contact% = 1 l_contact% = ll% c_contact% = cc% - 1 exit_sub end_if end_if end_if end_if if cc%<boules_ligne% if plein%(ll%,cc%+1)=1 : ' D ' message str$(ll%)+","+str$(cc%)+": D "+str$(d%) if abs(ssx-posx%((ll%-1)*boules_ligne%+cc%+1))<lim if abs(ssy-posy%((ll%-1)*boules_ligne%+cc%+1))<lim contact% = 2 l_contact% = ll% c_contact% = cc% + 1 exit_sub end_if end_if end_if end_if
if (ll%>1) and ((cc%-d%)>0) if plein%(ll%-1,cc%-d%)=1 : ' HG ' message str$(ll%)+","+str$(cc%)+": HG "+str$(d%) if abs(ssx-posx%((ll%-2)*boules_ligne%+cc%-d%))<lim if abs(ssy-posy%((ll%-2)*boules_ligne%+cc%-d%))<lim d_contact1 = sqr( (ssx-posx%((ll%-2)*boules_ligne%+cc%-d%))*(ssx-posx%((ll%-2)*boules_ligne%+cc%-d%)) + (ssy-posy%((ll%-2)*boules_ligne%+cc%-d%))*(ssy-posy%((ll%-2)*boules_ligne%+cc%-d%)) ) contact% = 3 end_if end_if end_if end_if if (ll%>1) and ((cc%-d%+1)<=boules_ligne%) if plein%(ll%-1,cc%-d%+1)=1 : ' HD ' message str$(ll%)+","+str$(cc%)+": HD "+str$(d%) if abs(ssx-posx%((ll%-2)*boules_ligne%+cc%-d%+1))<lim if abs(ssy-posy%((ll%-2)*boules_ligne%+cc%-d%+1))<lim d_contact2 = sqr( (ssx-posx%((ll%-2)*boules_ligne%+cc%-d%+1))*(ssx-posx%((ll%-2)*boules_ligne%+cc%-d%+1)) + (ssy-posy%((ll%-2)*boules_ligne%+cc%-d%+1))*(ssy-posy%((ll%-2)*boules_ligne%+cc%-d%+1)) ) contact% = 4 end_if end_if end_if end_if if contact%>0 if d_contact1<d_contact2 ' message "G" contact% = 3 l_contact% = ll% - 1 c_contact% = cc% - d% if c_contact%<boules_ligne% ' message "monter droite "+str$(ll%)+","+str$(cc%)+" "+str$(plein%(l_contact%,c_contact%+1)) if dx>sz%/2 and plein%(l_contact%,c_contact%+1)=0 then contact% = 0 end_if else ' message "D" contact% = 4 l_contact% = ll% - 1 c_contact% = cc% - d% + 1 if c_contact%>1 ' message "monter gauche "+str$(ll%)+","+str$(cc%)+" "+str$(plein%(l_contact%,c_contact%+1)) if dx<(0-sz%/2) and plein%(l_contact%,c_contact%-1)=0 then contact% = 0 end_if end_if if contact%>0 if c_contact%<1 then c_contact% = 1 if c_contact%>boules_ligne% then c_contact% = boules_ligne% end_if exit_sub end_if if (ll%<10) and ((cc%-d%)>0) if plein%(ll%+1,cc%-d%)=1 : ' BG ' message str$(ll%)+","+str$(cc%)+": BG "+str$(d%) if abs(ssx-posx%((ll%)*boules_ligne%+cc%-d%))<lim if abs(ssy-posy%((ll%)*boules_ligne%+cc%-d%))<lim d_contact1 = sqr( (ssy-posy%((ll%)*boules_ligne%+cc%-d%))*(ssy-posy%((ll%)*boules_ligne%+cc%-d%)) + (ssy-posy%((ll%)*boules_ligne%+cc%-d%))*(ssy-posy%((ll%)*boules_ligne%+cc%-d%)) ) contact% = 5 l_contact% = ll% + 1 c_contact% = cc% - d% exit_sub end_if end_if end_if end_if if (ll%<20) and ((cc%-d%+1)<boules_ligne%) if plein%(ll%+1,cc%-d%+1)=1 : ' BD ' message str$(ll%)+","+str$(cc%)+": BD "+str$(d%) if abs(ssx-posx%((ll%)*boules_ligne%+cc%-d%+1))<lim if abs(ssy-posy%((ll%)*boules_ligne%+cc%-d%+1))<lim d_contact2 = sqr( (ssx-posx%((ll%)*boules_ligne%+cc%-d%+1))*(ssx-posx%((ll%)*boules_ligne%+cc%-d%+1)) + (ssy-posy%((ll%)*boules_ligne%+cc%-d%+1))*(ssy-posy%((ll%)*boules_ligne%+cc%-d%+1)) ) contact% = 6 l_contact% = ll% + 1 c_contact% = cc% - d% + 1 end_if end_if end_if end_if if contact%>0 if d_contact1<d_contact2 contact% = 5 l_contact% = ll% + 1 c_contact% = cc% - d% if c_contact%<boules_ligne% if plein%(l_contact%,c_contact%+1)=0 then contact% = 0 end_if else contact% = 6 l_contact% = ll% + 1 c_contact% = cc% - d% + 1 if c_contact%>1 if plein%(l_contact%,c_contact%-1)=0 then contact% = 0 end_if end_if if contact%>0 if c_contact%<1 then c_contact% = 1 if c_contact%>boules_ligne% then c_contact% = boules_ligne% end_if exit_sub end_if end_sub
sub placer(ll%,cc%,d%) ' if plein%(ll%,cc%)=1 then message "Oups... "+str$(ll%)+","+str$(cc%) plein%(ll%,cc%) = 1 if bin_and(ll%,1)=1 posx%((ll%-1)*boules_ligne%+cc%) = (cc%-1)*deltax%+sz%/2 posy%((ll%-1)*boules_ligne%+cc%) = ((ll%+1)/2-1)*deltay%+sz%/2 else posx%((ll%-1)*boules_ligne%+cc%) = (cc%-1)*deltax%+deltax%/2+sz%/2 posy%((ll%-1)*boules_ligne%+cc%) = (ll%/2-1)*deltay%+deltay%/2+sz%/2 end_if k1% = clr%(1) clrx%(ll%,cc%) = k1% 2d_fill_color couleurs%(k1%,1),couleurs%(k1%,2),couleurs%(k1%,3) 2d_circle sz%/2,sz%/2,sz%/2 2d_image_copy 3,0,0,sz%,sz% k1% = 100+(ll%-1)*boules_ligne%+cc% sprite k1% : sprite_image_load k1%,3 : sprite_position k1%,posx%(k1%-100)-sz%/2,posy%(k1%-100)-sz%/2 end_sub
sub passer_porte(ll%,cc%,d%) if dx<0 if dy<0 if ll%>1 ' en haut à gauche ' message "porte HG: "+str$(ll%)+","+str$(cc%)+" "+str$(d%) if (cc%+d%)<=boules_ligne% if (cc%+d%-2)>0 if (plein%(ll%,cc%+d%-2)=0) or (plein%(ll%,cc%+d%)=0) then exit_sub if (cc%+d%-1)>0 if plein%(ll%-1,cc%+d%-1)=0 contact%=0 sx = (cc%+d%-2)*deltax% sy = ((ll%-2)/2)*deltay% sx1 = sx + sz%/2 sy1 = sy + sz%/2 bonus% = bonus% + 20*difficulte% sprite_position 20,sx,sy ' message "passé "+str$(contact%) end_if end_if end_if end_if end_if else ' en bas à gauche if ll%<20 ' message "porte BG: "+str$(ll%)+","+str$(cc%)+" "+str$(d%) if cc%+d%<=bules_ligne% if (cc%+d%-1)>0 if (plein%(ll%,cc%+d%-2)=0) or (plein%(ll%,cc%+d%)=0) then exit_sub if (cc%+d%-1)>0 if plein%(ll%+1,cc%+d%-1)=0 contact%=0 sx = (cc%+d%-2)*deltax% sy = ((ll%+2)/2)*deltay% sx1 = sx + sz%/2 sy1 = sy + sz%/2 bonus% = bonus% + 20*difficulte% sprite_position 20,sx,sy ' message "passé "+str$(contact%) end_if end_if end_if end_if end_if end_if else if dy<0 ' en haut à droite ' message "porte HD: "+str$(ll%)+","+str$(cc%)+" "+str$(d%) if ll%>1 if (cc%+d%-2)>0 if cc%+d%<=boules_ligne% if (plein%(ll%,cc%+d%-2)=0) or (plein%(ll%,cc%+d%)=0) then exit_sub if (cc%+d%)<=boules_ligne% if plein%(ll%-1,cc%+d%)=0 contact%=0 sx = (cc%+d%-1)*deltax% sy = ((ll%-2)/2)*deltay% sx1 = sx + sz%/2 sy1 = sy + sz%/2 bonus% = bonus% + 20*difficulte% sprite_position 20,sx,sy ' message "passé "+str$(contact%) end_if end_if end_if end_if end_if else ' en bas à droite ' message "porte BD: "+str$(ll%)+","+str$(cc%)+" "+str$(d%) if ll%<20 if (cc%+d%-2)>0 if cc%+d%<=boules_ligne% if (plein%(ll%,cc%+d%-2)=0) or (plein%(ll%,cc%+d%)=0) then exit_sub if (cc%+d%)<=boules_ligne% if plein%(ll%-1,cc%+d%)=0 contact%=0 sx = (cc%+d%-1)*deltax% sy = ((ll%+2)/2)*deltay% sx1 = sx + sz%/2 sy1 = sy + sz%/2 bonus% = bonus% + 20*difficulte% sprite_position 20,sx,sy ' message "passé "+str$(contact%) end_if end_if end_if end_if end_if end_if end_if end_sub
sub ajouter(ll%,cc%) plein%(ll%,cc%) = 1 if bin_and(ll%,1)=1 posx%((ll%-1)*boules_ligne%+cc%) = (cc%-1)*deltax%+sz%/2 posy%((ll%-1)*boules_ligne%+cc%) = ((ll%+1)/2-1)*deltay%+sz%/2 else posx%((ll%-1)*boules_ligne%+cc%) = (cc%-1)*deltax%+deltax%/2+sz%/2 posy%((ll%-1)*boules_ligne%+cc%) = (ll%/2-1)*deltay%+deltay%/2+sz%/2 end_if k1% = rnd(6) clrx%(ll%,cc%) = k1% 2d_fill_color couleurs%(k1%,1),couleurs%(k1%,2),couleurs%(k1%,3) 2d_circle sz%/2,sz%/2,sz%/2 2d_image_copy 3,0,0,sz%,sz% k1% = 100+(ll%-1)*boules_ligne%+cc% ' message "Ajout: "+str$(ll%)+","+str$(cc%) sprite k1% : sprite_image_load k1%,3 : sprite_position k1%,posx%(k1%-100)-sz%/2,posy%(k1%-100)-sz%/2 end_sub
sub purger(ll%,cc%,d%) dim_local p%, i%, ld%, cd%, nd%, npurge%, ll1%, cc1%, temp% fpurge% = 0 dlist 30 : dlist 31 : ' memoriser les lignes et colonnes des sprites à supprimer item_add 30,str$(ll%) : item_add 31,str$(cc%) k% = clrx%(ll%,cc%) purger_1(ll%,cc%,k%) npurge% = 0 while npurge%<count(30) temp% = count(30) for i%=npurge%+1 to temp% ll1% = val(item_read$(30,i%)) cc1% = val(item_read$(31,i%)) purger_1(ll1%,cc1%,k%) next i% npurge% = temp% end_while if count(30)>2 for i%=1 to count(30) ld% = val(item_read$(30,i%)) cd% = val(item_read$(31,i%)) nd% = 100 + (ld%-1)*boules_ligne% + cd% clrx%(ld%,cd%) = 0 plein%(ld%,cd%) = 0 sprite_delete nd% score% = score% + (10 + bonus%)*difficulte% caption 11,str$(score%) next i% fpurge% = 1 end_if delete 30 : delete 31 bonus% = 0 end_sub
sub purger_1(ll%,cc%,k%) purger_sprite(ll%,cc%-1,k%) purger_sprite(ll%,cc%+1,k%) if bin_and(ll%,1)=1 purger_sprite(ll%-1,cc%-1,k%) purger_sprite(ll%-1,cc%,k%) purger_sprite(ll%+1,cc%-1,k%) purger_sprite(ll%+1,cc%,k%) else purger_sprite(ll%-1,cc%,k%) purger_sprite(ll%-1,cc%+1,k%) purger_sprite(ll%+1,cc%,k%) purger_sprite(ll%+1,cc%+1,k%) end_if end_sub
sub purger_sprite(ll%,cc%,kk%) dim_local i% if ll%<1 then exit_sub if cc%<1 then exit_sub if ll%>20 then exit_sub if cc%>boules_ligne% then exit_sub if plein%(ll%,cc%)=1 if clrx%(ll%,cc%)=kk% for i%=1 to count(30) if (item_read$(30,i%)=str$(ll%)) and (item_read$(31,i%)=str$(cc%)) then exit_sub next i% item_add 30,str$(ll%) item_add 31,str$(cc%) end_if end_if end_sub
sub orphelins() for i%=1 to 20 step 2 for j%=1 to boules_ligne% tableau%(i%, j%*2-1) = plein%(i%, j%) tableau%(i%+1,j%*2) = plein%(i%+1,j%) next j% next i% chercher() end_sub
sub chercher() dim_local i%,j% ndlist% = 1000 for i%=1 to 20 for j%=1 to 50 if tableau%(i%,j%)>0 then chercher_bis(i%,j%) next j% next i% message "Fini. "+str$(ndlist%) if ndlist%=1000 then exit_sub for i%=1001 to ndlist% flag% = 1 for j%=1 to count(i%) if left$(item_read$(i%,j%),2)="1," flag% = 0 exit_for end_if next j% if flag%=1 show 1000+i% : left 1000+i%,(i%-1)*200 end_if next i% end_sub
sub chercher_bis(l%,c%) dim_local p%, n%, k%, s$, xl%, xc%, v%, i%, j% s$ = str$(l%)+","+str$(c%) if ndlist%>1000 for i%=1001 to ndlist% for j%=1 to count(i%) if item_read$(i%,j%)=s$ then exit_sub next j% next i% end_if flag% = 0 ndlist% = ndlist% + 1 ' dlist ndlist% list ndlist% : ' hide ndlist% item_add ndlist%,s$ p% = 1 chercher_voisins(l%,c%) n% = count(ndlist%) while p%<n% for k%=p%+1 to n% s$ = item_read$(ndlist%,k%) v% = instr(s$,",") xl% = val(left$(s$,v%-1)) xc% = val(mid$(s$,v%+1,len(s$))) chercher_voisins(xl%,xc%) next k% p% = n% n% = count(ndlist%) end_while if flag% = 1 delete ndlist% ndlist% = ndlist% - 1 end_if end_sub
sub chercher_voisins(l%,c%) if c%>2 : if tableau%(l%,c%-2)>0 then tester(l%,c%-2) : end_if if c%<48 : if tableau%(l%,c%+2)>0 then tester(l%,c%+2) : end_if if l%>1 if c%>1 : if tableau%(l%-1,c%-1)>0 then tester(l%-1,c%-1) : end_if if c%<49 : if tableau%(l%-1,c%+1)>0 then tester(l%-1,c%+1) : end_if end_if if l%<20 if c%>1 : if tableau%(l%+1,c%-1)>0 then tester(l%+1,c%-1) : end_if if c%<49 : if tableau%(l%+1,c%+1)>0 then tester(l%+1,c%+1) : end_if end_if end_sub
sub tester(l%,c%) dim_local i%, s$ s$ = str$(l%)+","+str$(c%) for i%=1 to count(ndlist%) if item_read$(ndlist%,i%)=s$ then exit_sub next i% item_add ndlist%,s$ if l%=1 then flag% = 1 end_sub
sub suivant() k1% = clr%(2) clr%(1) = k1% 2d_fill_color couleurs%(k1%,1),couleurs%(k1%,2),couleurs%(k1%,3) 2d_circle sz%/2,sz%/2,sz%/2 2d_image_copy 3,0,0,sz%,sz% sprite_image_load 1,3 : sprite_position 1,x0%,y0% k1% = rnd(6) + 0.5 clr%(2) = k1% 2d_fill_color couleurs%(k1%,1),couleurs%(k1%,2),couleurs%(k1%,3) 2d_circle sz%/2,sz%/2,sz%/2 2d_image_copy 3,0,0,sz%,sz% sprite_image_load 2,3 : sprite_position 2,x0%+250,y0% end_sub
Comme ça, il est facile de voir le crash. Il suffit de cliquer sur le bouton "Rejouer". Dans la version postée, cela passe bien. Mais change la valeur de xxx% à la ligne 18 de 0 à 1 et refais le test --> crash. | |
| | | Jack Admin
Nombre de messages : 2394 Date d'inscription : 28/05/2007
| Sujet: Re: Extension de la commande DELETE Jeu 7 Fév 2013 - 20:24 | |
| Tout d'abord, félicitations pour ton jeu, dont je suis de près l'évolution.
Il y avait effectivement un bug dans la commande SPRITE_DELETE_ALL. Il est corrigé et je vais sortir une nouvelle version instantanée.
Lors de la destruction d'un SCENE2D, je vais également coder une destruction de tous les SPRITEs qu'il contient. Merci d'avoir trouvé ce bug. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Extension de la commande DELETE Jeu 7 Fév 2013 - 21:57 | |
| Ah, merci, Jack ! C'est très encourageant ! | |
| | | Jack Admin
Nombre de messages : 2394 Date d'inscription : 28/05/2007
| Sujet: Re: Extension de la commande DELETE Ven 8 Fév 2013 - 8:05 | |
| @ Klaus :
Il y a quelque temps, on m'avait fait la remarque que lors de sa création, un SPRITE était visible, et comme il est positionné en (0,0), c'est à dire en haut et à gauche, cela pouvait être gênant.
Comme je dois retoucher le moteur 2D de gestion des SPRITEs pour modifier SPRITE_DELETE_ALL (moteur qui est intégré à PANORAMIC et qui gère un SCENE2D), je me suis demandé si je n'allais pas passer aussi cette modification: un SPRITE serait invisible à sa création, tout en étant positionné en (0,0). On peut alors le positionner où on veut, puis le rendre visible. Qu'en penses tu ? Cela t'obligerait à faire SPRITE_SHOW N à chaque fois.
Je pourrais aussi coder: SPRITE_SHOW_ALL qui te permettrait de créer tes SPRITEs, de les positionner puis de les rendre tous visibles d'un coup. On ne verrait pas se construire les bulles une par une. Il y aurait bien évidemment aussi SPRITE_HIDE_ALL pour les rendre tous invisibles. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Extension de la commande DELETE Ven 8 Fév 2013 - 9:23 | |
| Perdsonnellement, la seconde proposition (SPITE_SHOW_ALL et SPRITE_HIDE_ALL) combinée avec la propriété "invisible" d'un sprite à sa création, me tente bien ! Mais il n'y aurait pas un problème de compatibilité ascendante ? Les programmes existants devraient peut-être revus pour afficher les sprite.
Est-ce que, en plus de cette fonction intéressante que tu proposes, tu pourrais prévoir une commande du type SPRITE_VISIBLE_ON_CREATION ON/OFF Avec la valeur par défaut étant ON. Ainsi, les programmes existants tourneraient sans modification, et je pourrait placer SPRITE_VISIBLE_PN_CREATE OFF au début de mon programme. Qu'en penses-tu ? | |
| | | Jack Admin
Nombre de messages : 2394 Date d'inscription : 28/05/2007
| Sujet: Re: Extension de la commande DELETE Ven 8 Fév 2013 - 21:40 | |
| Je viens de mettre au téléchargement la version instantanée PANORAMIC V 0.9.24i8http://panoramic-language.pagesperso-orange.fr/PANORAMIC_EDITOR.zipConcernant les SPRITEs (et donc ton jeu): Le bug dans SPRITE_DELETE_ALL est corrigé, Un DELETE sur un SCENE2D détruit tous les SPRITEs qu'il contenait Il y a 2 nouvelles commandes: SPRITE_SHOW_ALL : visualise tous les SPRITEs SPRITE_HIDE_ALL : cache tous les SPRITEs | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Extension de la commande DELETE Ven 8 Fév 2013 - 21:53 | |
| Un grand MERCI, Jack ! Je vais adapter cela tout de suite !
Je vais oser une petite demande supplémentaire: est-ce que, dans les versions futures instantanées, tu pourrais prévoir une variable système du type text$ = PANORAMIC_VERSION$ On pourrait ainsi avertir l'utilisateur de mettre à jour sa version s'il veut utiliser un programme qui en a besoin... | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Extension de la commande DELETE Ven 8 Fév 2013 - 23:50 | |
| Je soutiens la demande de Klaus. On pourrait faire (par exemple) : - Code:
-
IF PANORAMIC_VERSION$ = "0.9.24i8" SPRITE_HIDE_ALL ELSE FOR i% = deb to fin : SPRITE_HIDE i% : next i% END_IF
On trouvera des exemples d'utilisation de cette fonction plus intelligentes ! | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Sam 9 Fév 2013 - 1:12 | |
| A Voté !.....pour heu...une parenthèse, il ne faut pas oublier qu'un utilisateur tiers ( non Panoramicien ) se servira d'une version compilé et pas de l'éditeur . | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Extension de la commande DELETE Sam 9 Fév 2013 - 10:56 | |
| Certes. Mais j'ose espérer que celui qui compile un programme, le connaît et et le fera marcher avant de le compiler. Et il verra ainsi qu'il n'a pas la bonne version de Panoramic pour compiler tel programme. Et si c'est bon, le programme compilé contiendra le bon noyau de Panoramic. | |
| | | Contenu sponsorisé
| Sujet: Re: Extension de la commande DELETE | |
| |
| | | | Extension de la commande DELETE | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |