FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  RechercherRechercher  Dernières imagesDernières images  S'enregistrerS'enregistrer  MembresMembres  Connexion  
Derniers sujets
» Editeur EliP 6 : Le Tiny éditeur avec 25 onglets de travail
Extension de la commande DELETE Emptypar papydall Aujourd'hui à 16:57

» PANORAMIC V 1
Extension de la commande DELETE Emptypar papydall Aujourd'hui à 3:22

» select intégrés [résolu]
Extension de la commande DELETE Emptypar jjn4 Hier à 17:00

» number_mouse_up
Extension de la commande DELETE Emptypar jjn4 Hier à 11:59

» Aide de PANORAMIC
Extension de la commande DELETE Emptypar jjn4 Hier à 11:16

» trop de fichiers en cours
Extension de la commande DELETE Emptypar lepetitmarocain Hier à 10:43

» Je teste PANORAMIC V 1 beta 1
Extension de la commande DELETE Emptypar papydall Hier à 4:17

» bouton dans autre form que 0
Extension de la commande DELETE Emptypar leclode Lun 6 Mai 2024 - 13:59

» KGF_dll - nouvelles versions
Extension de la commande DELETE Emptypar Klaus Lun 6 Mai 2024 - 11:41

» Gestion d'un système client-serveur.
Extension de la commande DELETE Emptypar Klaus Lun 6 Mai 2024 - 10:23

» @Jack
Extension de la commande DELETE Emptypar Jack Mar 30 Avr 2024 - 20:40

» Une calculatrice en une ligne de programme
Extension de la commande DELETE Emptypar jean_debord Dim 28 Avr 2024 - 8:47

» Form(résolu)
Extension de la commande DELETE Emptypar leclode Sam 27 Avr 2024 - 17:59

» Bataille navale SM
Extension de la commande DELETE Emptypar jjn4 Ven 26 Avr 2024 - 17:39

» Les maths du crocodile
Extension de la commande DELETE Emptypar jean_debord Jeu 25 Avr 2024 - 10:37

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Mai 2024
LunMarMerJeuVenSamDim
  12345
6789101112
13141516171819
20212223242526
2728293031  
CalendrierCalendrier
Le Deal du moment : -45%
WHIRLPOOL OWFC3C26X – Lave-vaisselle pose libre ...
Voir le deal
339 €

 

 Extension de la commande DELETE

Aller en bas 
5 participants
AuteurMessage
Klaus

Klaus


Nombre de messages : 12295
Age : 74
Localisation : Ile de France
Date d'inscription : 29/12/2009

Extension de la commande DELETE Empty
MessageSujet: Extension de la commande DELETE   Extension de la commande DELETE EmptyMer 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é ?
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
papydall

papydall


Nombre de messages : 7008
Age : 73
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

Extension de la commande DELETE Empty
MessageSujet: Re: Extension de la commande DELETE   Extension de la commande DELETE EmptyJeu 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 ?!
Revenir en haut Aller en bas
http://papydall-panoramic.forumarabia.com/
Klaus

Klaus


Nombre de messages : 12295
Age : 74
Localisation : Ile de France
Date d'inscription : 29/12/2009

Extension de la commande DELETE Empty
MessageSujet: Re: Extension de la commande DELETE   Extension de la commande DELETE EmptyJeu 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.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
bignono

bignono


Nombre de messages : 1127
Age : 66
Localisation : Val de Marne
Date d'inscription : 13/11/2011

Extension de la commande DELETE Empty
MessageSujet: Re: Extension de la commande DELETE   Extension de la commande DELETE EmptyJeu 7 Fév 2013 - 6:22

bonjour Klaus, Smile
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+ Wink Wink Wink
Revenir en haut Aller en bas
Klaus

Klaus


Nombre de messages : 12295
Age : 74
Localisation : Ile de France
Date d'inscription : 29/12/2009

Extension de la commande DELETE Empty
MessageSujet: Re: Extension de la commande DELETE   Extension de la commande DELETE EmptyJeu 7 Fév 2013 - 8:20

Super ! Merci beaucoup !
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Klaus

Klaus


Nombre de messages : 12295
Age : 74
Localisation : Ile de France
Date d'inscription : 29/12/2009

Extension de la commande DELETE Empty
MessageSujet: Re: Extension de la commande DELETE   Extension de la commande DELETE EmptyJeu 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
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
bignono

bignono


Nombre de messages : 1127
Age : 66
Localisation : Val de Marne
Date d'inscription : 13/11/2011

Extension de la commande DELETE Empty
MessageSujet: Re: Extension de la commande DELETE   Extension de la commande DELETE EmptyJeu 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!
Revenir en haut Aller en bas
bignono

bignono


Nombre de messages : 1127
Age : 66
Localisation : Val de Marne
Date d'inscription : 13/11/2011

Extension de la commande DELETE Empty
MessageSujet: Re: Extension de la commande DELETE   Extension de la commande DELETE EmptyJeu 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.
Revenir en haut Aller en bas
Klaus

Klaus


Nombre de messages : 12295
Age : 74
Localisation : Ile de France
Date d'inscription : 29/12/2009

Extension de la commande DELETE Empty
MessageSujet: Re: Extension de la commande DELETE   Extension de la commande DELETE EmptyJeu 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.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Jack
Admin
Jack


Nombre de messages : 2386
Date d'inscription : 28/05/2007

Extension de la commande DELETE Empty
MessageSujet: Re: Extension de la commande DELETE   Extension de la commande DELETE EmptyJeu 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.
Revenir en haut Aller en bas
https://panoramic.1fr1.net
Klaus

Klaus


Nombre de messages : 12295
Age : 74
Localisation : Ile de France
Date d'inscription : 29/12/2009

Extension de la commande DELETE Empty
MessageSujet: Re: Extension de la commande DELETE   Extension de la commande DELETE EmptyJeu 7 Fév 2013 - 21:57

Ah, merci, Jack ! C'est très encourageant !
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Jack
Admin
Jack


Nombre de messages : 2386
Date d'inscription : 28/05/2007

Extension de la commande DELETE Empty
MessageSujet: Re: Extension de la commande DELETE   Extension de la commande DELETE EmptyVen 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.
Revenir en haut Aller en bas
https://panoramic.1fr1.net
Klaus

Klaus


Nombre de messages : 12295
Age : 74
Localisation : Ile de France
Date d'inscription : 29/12/2009

Extension de la commande DELETE Empty
MessageSujet: Re: Extension de la commande DELETE   Extension de la commande DELETE EmptyVen 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 ?
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Jack
Admin
Jack


Nombre de messages : 2386
Date d'inscription : 28/05/2007

Extension de la commande DELETE Empty
MessageSujet: Re: Extension de la commande DELETE   Extension de la commande DELETE EmptyVen 8 Fév 2013 - 21:40

Je viens de mettre au téléchargement la version instantanée PANORAMIC V 0.9.24i8

http://panoramic-language.pagesperso-orange.fr/PANORAMIC_EDITOR.zip

Concernant 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

Revenir en haut Aller en bas
https://panoramic.1fr1.net
Klaus

Klaus


Nombre de messages : 12295
Age : 74
Localisation : Ile de France
Date d'inscription : 29/12/2009

Extension de la commande DELETE Empty
MessageSujet: Re: Extension de la commande DELETE   Extension de la commande DELETE EmptyVen 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...
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
papydall

papydall


Nombre de messages : 7008
Age : 73
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

Extension de la commande DELETE Empty
MessageSujet: Re: Extension de la commande DELETE   Extension de la commande DELETE EmptyVen 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 !

Revenir en haut Aller en bas
http://papydall-panoramic.forumarabia.com/
Yannick




Nombre de messages : 8610
Age : 53
Localisation : Bretagne
Date d'inscription : 15/02/2010

Extension de la commande DELETE Empty
MessageSujet: re   Extension de la commande DELETE EmptySam 9 Fév 2013 - 1:12

A Voté !.....pour Laughing


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 tongue .
Revenir en haut Aller en bas
Klaus

Klaus


Nombre de messages : 12295
Age : 74
Localisation : Ile de France
Date d'inscription : 29/12/2009

Extension de la commande DELETE Empty
MessageSujet: Re: Extension de la commande DELETE   Extension de la commande DELETE EmptySam 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.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Contenu sponsorisé





Extension de la commande DELETE Empty
MessageSujet: Re: Extension de la commande DELETE   Extension de la commande DELETE Empty

Revenir en haut Aller en bas
 
Extension de la commande DELETE
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Diverses propositions
» Extension de Checked(N)
» Delete Main_menu
» Extension de PEEK et POKE
» V2.75 du 21/01/2014 - extension de la toolbar

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: PANORAMIC :: Vos souhaits d'amélioration de Panoramic-
Sauter vers: