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
» Logiciel de planétarium.
Des procédures pour la 2D  - Page 4 Emptypar Pedro Aujourd'hui à 10:37

» Un autre pense-bête...
Des procédures pour la 2D  - Page 4 Emptypar Froggy One Jeu 21 Nov 2024 - 15:54

» Récupération du contenu d'une page html.
Des procédures pour la 2D  - Page 4 Emptypar Pedro Sam 16 Nov 2024 - 14:04

» Décompilation
Des procédures pour la 2D  - Page 4 Emptypar JL35 Mar 12 Nov 2024 - 19:57

» Un album photos comme du temps des grands-mères
Des procédures pour la 2D  - Page 4 Emptypar jjn4 Mar 12 Nov 2024 - 17:23

» traitement d'une feuille excel
Des procédures pour la 2D  - Page 4 Emptypar jjn4 Jeu 7 Nov 2024 - 3:52

» Aide-mémoire mensuel
Des procédures pour la 2D  - Page 4 Emptypar jjn4 Lun 4 Nov 2024 - 18:56

» Des incomprèhension avec Timer
Des procédures pour la 2D  - Page 4 Emptypar Klaus Mer 30 Oct 2024 - 18:26

» KGF_dll - nouvelles versions
Des procédures pour la 2D  - Page 4 Emptypar Klaus Mar 29 Oct 2024 - 17:58

» instructions panoramic
Des procédures pour la 2D  - Page 4 Emptypar maelilou Lun 28 Oct 2024 - 19:51

» Figures fractales
Des procédures pour la 2D  - Page 4 Emptypar Marc Ven 25 Oct 2024 - 12:18

» Panoramic et Scanette
Des procédures pour la 2D  - Page 4 Emptypar Yannick Mer 25 Sep 2024 - 22:16

» Editeur d étiquette avec QR évolutif
Des procédures pour la 2D  - Page 4 Emptypar JL35 Lun 23 Sep 2024 - 22:40

» BUG QR Code DelphiZXingQRCode
Des procédures pour la 2D  - Page 4 Emptypar Yannick Dim 22 Sep 2024 - 11:40

» fichier.exe
Des procédures pour la 2D  - Page 4 Emptypar leclode Ven 20 Sep 2024 - 19:02

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Novembre 2024
LunMarMerJeuVenSamDim
    123
45678910
11121314151617
18192021222324
252627282930 
CalendrierCalendrier
Le Deal du moment : -28%
-28% Machine à café avec broyeur ...
Voir le deal
229.99 €

 

 Des procédures pour la 2D

Aller en bas 
+2
Jicehel
Jean Claude
6 participants
Aller à la page : Précédent  1, 2, 3, 4, 5  Suivant
AuteurMessage
Klaus

Klaus


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

Des procédures pour la 2D  - Page 4 Empty
MessageSujet: Re: Des procédures pour la 2D    Des procédures pour la 2D  - Page 4 EmptyMer 27 Mai 2015 - 22:49

Voici une version qui semble marcher.

Il y a toujours 2 sprites. Les sprites 1 et 2 sont impénétrables, et séparément configurables en carré de couleur ou en Andoid. Le sprite 3 est un carré jaune pénétrable.

Les lignes 5 et 7 contiennent le paramétrage des sprites 1 et 2, respectivement. Les commentaires sont explicites.

La ligne 30 contient un paramétrage pour afficher une trace des processus de calcul, en cas de besoin. Par défaut, la variable est positionné à 0 ce qui inhibe la trace.

Le sprite 2 (carré bleu ou Android) peut être dirigé par les 4 flèches. En cas de collision avec le sprite 1, le programme affiche les numéros des sprites concernés, ainsi que les numéros et les noms des tunes si le cas se présente, pour un Android.

A l'aide des paramétrages des lignes 5 et 7, on peut tester les collisions entre:
- 2 sprites simples (un carré rouge comme sprite fixe et un carré bleu comme sprite mobile)
- 1 sprite simple (carré bleu fixe) contre 1 sprite à tunes (Android)
- 1 sprite à tunes fixe (Andoid) contre 1 sprite simple (carré bleu)
- 1 sprite à tunes fixe (Andoid) contre 1 sprite à tunes mobile (Andoid)

Voici le code:
Code:
' 2d_utilities.bas

label clic, key

dim selection_sprite_1% : selection_sprite_1% = 1  : ' 0=carré rouge impénétrable
                                                  : ' 1=Android impénétrable
dim selection_sprite_2% : selection_sprite_2% = 2  : ' 0=carré bleu impénétrable
                                                  : ' 1=Android impénétrable

dim sprites(500,7)        : ' jusqu'à 500 sprites
                          : ' ,0)=largeur  ,1)=hauteur
                          : ' ,2)=visible/invisible ,3)=impénétrable
                          : ' ,4)=coordonnée x  ,5)=coordonnée y
                          : ' ,6)=numéro d'objet DLIST contenant les tunes
                          : ' ,6)=transformé en index dans tunes(..,..)
                          : ' ,7)=nombre de tunes
dim ntunes%                : ' nombre de tunes dans tunes(..,..)
dim tunes(3000,4)          : ' jusqu'à 3000 tunes
                          : ' ,0)=sprite  ,1)=coordonnée x  ,2)=coordonnée y
                          : ' ,3)=largeur  ,4)=hauteur
dim tnames$(3000)          : ' noms des tunes
dim nsprite%              : ' dernier numéro de sprite créé
dim sprite_trouve%        : ' numéro du sprite trouvé par un clic (ou 0 si non trouvé)
dim sprite_collision%      : ' numéro du sprite touché par une collision
dim tune_collision%        : ' numéro du tune fixe touché (ou 0 si non trouvé)
dim tune_collision_mobile% : ' numéro du tune mobile touché (ou 0 si non trouvé)
dim name_collision$        : ' nom du tune fixe touché
dim name_collision_mobile$ : ' nom du tune mobile touché
dim scene_2d%              : ' numéro d'objet du scene2d
dim trace% : trace% = 0    : ' mettre 1 pour afficher une trace des calculs
dim i%, j%, d%, dx%, dy%, s$, sm$

scene_2d% = 17            : ' juste un exemple
scene2d scene_2d%          : ' créer le scene2d
sprite_target_is scene_2d%    :  ' assurer du bon ciblage
on_click scene_2d%,clic

dlist 101                  : ' pour recevoir la liste des tunes pour sprite 1
if trace%=1 then list 102 : top 102,500 : width 102,1000 : height 102,200

full_space 0
full_space scene_2d%
picture 10 : hide 10 : width 10,200 : height 10,200
image 11
2d_target_is 10

if selection_sprite_1%=0
  color 10,255,0,0
  2d_image_copy 11,0,0,200,200
  creer_sprite(50,50,11,1)          : ' sprite rouge impénétrable
else
  file_load 10,"Android.bmp"
  2d_image_copy 11,0,0,200,200
  file_load 101,"Android_mask_tuned_list.txt"
  creer_sprite_avec_tunes(50,50,11,1,101)  : ' sprite "Android" impénétrable, avec tunes
end_if

if selection_sprite_2%=0
  color 10,0,0,255
  2d_image_copy 11,0,0,200,200      : ' sprite bleu impénétrable
  creer_sprite(400,120,11,1)
else
  file_load 10,"Android.bmp"
  2d_image_copy 11,0,0,200,200
  file_load 101,"Android_mask_tuned_list.txt"  : ' déjà chargé
  creer_sprite_avec_tunes(400,130,11,1,101)  : ' sprite "Android" impénétrable, avec tunes
end_if

color 10,255,255,0
2d_image_copy 11,0,0,200,200      : ' sprite jaune pénétrable
creer_sprite(280,180,11,0)

on_key_down 0,key

end

' ***** frappe d'une touche au clavier
key:
  d% = key_down_code
  if d%=37 : ' gauche
        dx% = 0 - 1
        dy% = 0
  end_if
  if d%=38 : ' haut
        dx% = 0
        dy% = 0 - 1
  end_if
  if d%=39 : ' droite
        dx% = 1
        dy% = 0
  end_if
  if d%=40 : ' bas
        dx% = 0
        dy% = 1
  end_if
  for i%=1 to 30                        : ' pas de 30 pixels par frappe d'une flèche
    deplacer_sprite(2,1,dx%,dy%)        : ' déplacement relatif
    tester_si_collision(2,1)            : ' suivi du test de collision
    s$ = ""
    if sprite_collision%>0              : ' une collision a eu lieu ?
      s$ = "collision avec sprite "+str$(sprite_collision%)+"  tune "+str$(tune_collision%)+"=["+name_collision$
      sm$ = "]  touché par sprite 2 tune "+str$(tune_collision_mobile%)+"=["+name_collision_mobile$+"]"
      message s$ + sm$
      deplacer_sprite(2,1,0-dx%,0-dy%)  : ' annuler le déplacement en cas de collision
      exit_for                          : ' et arrêter le déplacement
    end_if                              : ' fin test si collision
  next i%                              : ' fin boucle de déplacement
return

' ***** reste du programme initial, à conserver pour le moment...
for i%=399 to 0 step -1
  deplacer_sprite(2,0,i%,sprites(2,5))  : ' déplacer horizontalement en absolu
  display
  tester_si_collision(2,1)
  if sprite_collision%>0
    message "collision avec sprite "+str$(sprite_collision%)+"  tune "+str$(tune_collision%)+"  touché par sprite 2 tune "+str$(tune_collision_mobile%)
    exit_for
  end_if
next i%

for i%=sprites(2,4) to 400
  deplacer_sprite(2,0,i%,sprites(2,5))  : ' déplacer horizontalement en absolu
  display
next i%

end
' ***** fin reste du programme initial

' ***** clic dans la scene2d
clic:
  chercher_sprite_selon_clic()
  if sprite_trouve%>0
    message "clic sur sprite "+str$(sprite_trouve%)
  else
    message "aucun sprite cliqué"
  end_if
  return
 
 
 

sub creer_sprite(x%,y%,img%,dur%)
  nsprite% = nsprite% + 1        : ' passer au numéro de sprite suivant
  sprite nsprite%                : ' créer le sprite
  sprites(nsprite%,0) = 200      : ' mémoriser sa largeur
  sprites(nsprite%,1) = 200      : ' et sa hauteur
  sprites(nsprite%,2) = 1        : ' marquer "visible"
  sprites(nsprite%,3) = dur%    : ' marquer 0="pénétrable" ou 1="impénétrable"
  sprites(nsprite%,4) = x%      : ' position horizontale du sprite
  sprites(nsprite%,5) = y%      : ' position verticale du sprite
  sprites(nsprite%,6) = 0        : ' pas de tunes
  sprites(nsprite%,7) = 0        : ' pas de tunes
  if img%>0 then sprite_image_load nsprite%,img%  : ' copier une image dans le sprite
  sprite_position nsprite%,x%,y% : ' positionner le sprite à l'endroit voulu
  display
end_sub

sub creer_sprite_avec_tunes(x%,y%,img%,dur%,dl%)
  dim_local t%, s$, p%, n%
  if object_exists(dl%)=0 then exit_sub  : ' impossible si l'objet n'existe pas
  if object_type(dl%)<>26 then exit_sub  : ' impossible si l'objet n'est pas une DLIST
  if count(dl%)=0 then exit_sub          : ' impossible si la liste des tunes est vide
  nsprite% = nsprite% + 1          : ' passer au numéro de sprite suivant
  sprite nsprite%                  : ' créer le sprite
  sprites(nsprite%,0) = 200        : ' mémoriser sa largeur
  sprites(nsprite%,1) = 200        : ' et sa hauteur
  sprites(nsprite%,2) = 1          : ' marquer "visible"
  sprites(nsprite%,3) = dur%      : ' marquer 0="pénétrable" ou 1="impénétrable"
  sprites(nsprite%,4) = x%        : ' position horizontale du sprite
  sprites(nsprite%,5) = y%        : ' position verticale du sprite
  sprites(nsprite%,6) = ntunes%+1  : ' indice dans la liste des tunes
  sprites(nsprite%,7) = count(dl%) : ' nombre de tunes
  for t%=1 to count(dl%)          : ' boucle sur les lignes des tunes
    ntunes% = ntunes% + 1          : ' compter le nouveau tune
    tunes(ntunes%,0) = nsprite%    : ' mémoriser le numéro du sprite pour ce tune
    s$ = item_read$(dl%,t%)+","    : ' lire un eligne de tunes
    p% = instr(s$,",")
    n% = val(left$(s$,p%-1))      : ' garder le numéro du tune
    s$ = mid$(s$,p%+1,100)        : ' dépasser le numéro de tune
    p% = instr(s$,",")
    tunes(ntunes%,1) = val(left$(s$,p%-1)) : ' mémoriser coordonnée x du tune
    s$ = mid$(s$,p%+1,100)        : ' dépasser la coordonnée x du tune
    p% = instr(s$,",")
    tunes(ntunes%,2) = val(left$(s$,p%-1)) : ' mémoriser coordonnée y du tune
    s$ = mid$(s$,p%+1,100)        : ' dépasser la coordonnée y du tune
    p% = instr(s$,",")
    tunes(ntunes%,3) = val(left$(s$,p%-1)) - tunes(ntunes%,1)+1 : ' mémoriser largeur du tune
    s$ = mid$(s$,p%+1,100)        : ' dépasser la largeur du tune
    p% = instr(s$,",")
    tunes(ntunes%,4) = val(left$(s$,p%-1)) - tunes(ntunes%,2)+1 : ' mémoriser hauteur du tune
    s$ = mid$(s$,p%+1,100)        : ' dépasser la hauteur du tune
    if s$="" then s$ = "Tune "+str$(n%)
    tnames$(ntunes%) = s$
  next t%                          : ' fin boucle sur les lignes des tunes
  if img%>0 then sprite_image_load nsprite%,img%  : ' copier une image dans le sprite
  sprite_position nsprite%,x%,y%  : ' positionner le sprite à l'endroit voulu

  display
end_sub

sub deplacer_sprite(n%,rel%,x%,y%)
  if (n%<1) or (n%>nsprite%) then exit_sub  : ' sécuriser
  if rel%=1                              : ' positionnement relatif ?
    sprites(n%,4) = sprites(n%,4) + x%
    sprites(n%,5) = sprites(n%,5) + y%
  else                                  : ' positionnement absolu !
    sprites(n%,4) = x%
    sprites(n%,5) = y%
  end_if
  if sprites(nsprite%,2)=1              : ' sprite visible ?
    sprite_position n%,sprites(n%,4),sprites(n%,5) : ' positionner le sprite visible à l'endroit voulu
  else                                  : ' sprite caché !
    sprite_position n%,sprites(n%,4)+4000,sprites(n%,5) : ' positionner le sprite caché à l'endroit voulu
  end_if
end_sub

sub redimensionner_sprite_x(n%,c)
  if (n%<1) or (n%>nsprite%) then exit_sub  : ' sécuriser
  sprite_x_scale n%,c              : ' ajuster la largeur
  sprites(n%,0) = sprites(n%,0)*c  : ' et mémoriser
end_sub

sub redimensionner_sprite_y(n%,c)
  if (n%<1) or (n%>nsprite%) then exit_sub  : ' sécuriser
  sprite_y_scale n%,c              : ' ajuster la hauteur
  sprites(n%,1) = sprites(n%,1)*c  : ' et mémoriser
end_sub

sub redimensionner_sprite_xy(n%,cx,cy)
  if (n%<1) or (n%>nsprite%) then exit_sub  : ' sécuriser
  sprite_scale n%,cx,cy              : ' ajuster largeur et hauteur
  sprites(n%,0) = sprites(n%,0)*cx  : ' et mémoriser la largeur
  sprites(n%,1) = sprites(n%,1)*cy  : ' et mémoriser la hauteur
end_sub

sub cacher_sprite(n%)
  if (n%<1) or (n%>nsprite%) then exit_sub  : ' sécuriser
  if sprites(n%,2)=1                        : ' est-ce que le sprite est visible ?
    sprite_x_position n%,sprite_x_position(n%) + 4000    : ' déplacer hors de la vue
    sprites(n%,2) = 0                        : ' signaler "invisible"
  end_if
end_sub

sub montrer_sprite(n%)
  if (n%<1) or (n%>nsprite%) then exit_sub  : ' sécuriser
  if sprites(n%,2)=0                        : ' est-ce que le sprite est invisible ?
    sprite_x_position n%,sprite_x_position(n%) - 4000    : ' replacer dans la partie visible
    sprites(n%,2) = 1                        : ' signaler "visible"
  end_if
end_sub

sub chercher_sprite_selon_clic()
  dim_local i%, x%, y%, xs%, ys%
  sprite_trouve% = 0                  : ' supposer "sprite non trouvé"
  if number_click<>scene_2d% then exit : ' on n'a pas cliqué dans le scene2d ?
  if nsprite%=0 then exit_sub          : ' pas de sprites créés ?
  x% = mouse_x_left_down(scene_2d%)    : ' mémoriser la position horizontale du clic
  y% = mouse_y_left_down(scene_2d%)    : ' mémoriser la position verticale du clic
  for i%=nsprite% to 1 step -1        : ' boucle sur tous les sprites
    xs% = sprite_x_position(i%)        : ' mémoriser la position horizontale du sprite i%
    ys% = sprite_y_position(i%)        : ' mémoriser la position verticale dusprite i%
    if (xs%<x%)                        : ' le bord gauche du sprite est plus à gauche que l'abscisse du clic ?
      if (ys%<y%)                      : ' le bord haut du sprite est plus haute que l'ordonnée du sprite ?
        if xs%+sprites(i%,0)>=x%      : ' le bord droit du sprite est plus à droite que l'abscisse du clic ?
          if ys%+sprites(i%,1)>=y%    : ' le bord bas du sprite est plus en bas que l'ordonnée du clic ?
              sprite_trouve% = i%      : ' alors, on a trouvé le sprite
              exit_sub                : ' et on sort
          end_if                      : ' fin test sur le bord bas du sprite
        end_if                        : ' fin test sur le bord droit du sprite
      end_if                          : ' fin test sur le bord haut du sprite
    end_if                            : ' fin test sur le bord gauche du sprite
  next i%                              : ' fin boucle sur les sprites
message "a4"
end_sub

sub tester_si_collision(n%,dir%)
  dim_local i%, x%, y%, w%, h%, xs%, ys%, w, h, ws, hs, t%, nt%,
  dim_local s$, s1$, ss$, ss1$, p%, p2%, pp%, pp2%,
  dim_local ntm%, tm%, xsm%, ysm%, wsm, hsm, ind%, indm%
  sprite_collision% = 0                : ' supposer "pas de collision"
  tune_collision% = 0
  tune_collision_mobile% = 0
  if nsprite%<2 then exit_sub          : ' pas de collisions possibles ?
  if sprites(n%,2)=0 then exit_sub    : ' le sprite mobile est "invisible" ?
  if sprites(n%,3)=0 then exit_sub    : ' le sprite mobile est "pénétrable" ?
  x% = sprites(n%,4)                  : ' position horizontale du sprite en movement
  y% = sprites(n%,5)                  : ' position verticale du sprite en movement
  w = sprites(n%,0)                    : ' largeur du sprite en movement
  h = sprites(n%,1)                    : ' hauteur du sprite en movement
  for i%=nsprite% to 1 step -1        : ' boucle sur tous les sprites
    if i%<>n%                          : ' on est sur un sprite autre que celui qui bouge ?
      if sprites(i%,3)<>0              : ' sprite en dur ?
        xs% = sprites(i%,4)            : ' position horizontale du sprite à tester
        ys% = sprites(i%,5)            : ' position verticale du sprite à tester
        ws = sprites(i%,0)            : ' largeur du sprite à tester
        hs = sprites(i%,1)            : ' hauteur du sprite à tester
        select dir%                    : ' distinction par direction du mouvement
          case 1: ' gauche
            if (x%-1)<=(xs%+ws)      : ' bord droit fixe peut toucher bord gauche mobile ?
              if (x%+w)>=(xs%-1)
                if (ys%+hs)>=y%        : ' bord bas mobile plus bas que bord haut fixe ?
                  if ys%<=(y%+h)        : ' bord haut mobile plus que bord bas fixe ?
                    sprite_collision% = i%  : ' alors collision
' message "collision à gauche avec "+str$(sprite_collision%)
                  end_if
                end_if
              end_if
            end_if
          case 2: ' haut
            if (y%-1)<=(ys%+hs)      : ' bord bas fixe peut toucher bord haut mobile ?
              if (y%+h)>=(ys%-1)
                if (xs%+hs)>=x%        : ' bord droit mobile plus à gauche que bord gauche fixe ?
                  if xs%<=(x%+h)        : ' bord gauche mobile plus à gauche que bord droit fixe ?
                    sprite_collision% = i%  : ' alors collision
                  end_if
                end_if
              end_if
            end_if
          case 3: ' droite    : ' à adapter
            if (x%+w)=(xs%-1)        : ' bord gauche fixe peut toucher bord droit mobile ?
              if (ys%+hs)>=y%        : ' bord bas mobile plus bas que bord haut fixe ?
                if ys%<=(y%+h)        : ' bord haut mobile plus que bord bas fixe ?
                  sprite_collision% = i%  : ' alors collision
                end_if
              end_if
            end_if
          case 4: ' bas        : ' à adapter
            if (y%+h)=(ys%-1)        : ' bord haut fixe peut toucher bord bas mobile ?
              if (xs%+hs)>=x%        : ' bord droit mobile plus à gauche que bord gauche fixe ?
                if xs%<=(x%+h)        : ' bord gauche mobile plus à gauche que bord droit fixe ?
                  sprite_collision% = i%  : ' alors collision
                end_if
              end_if
            end_if
        end_select                    : ' fin distinction par direction
' message str$(sprite_collision%)
        if sprite_collision%>0            : ' une collision est possible ?
          if sprites(i%,6)>0              : ' le sprite a des tunes ?
if trace%=1 then clear 102
            nt% = sprites(i%,7)          : ' nombre de tunes
            ind% = sprites(i%,6)-1        : ' prendre l'indice dans tunes()
            for t%=1 to nt%              : ' boucle sur les tunes du sprite touché
              xs% = tunes(ind%+t%,1)      : ' c'est l'abscisse du coin en haut à gauche
              ys% = tunes(ind%+t%,2)      : ' c'est l'ordonnée du coin en haut à gauche
              ws = tunes(ind%+t%,3)      : ' c'est la largeur
              hs = tunes(ind%+t%,4)      : ' c'est la hauteur
              xs% = xs% + sprites(i%,4)  : ' l'adresse du tune est relative !
              ys% = ys% + sprites(i%,5)  : ' l'adresse du tune est relative !

              if sprites(n%,6)>0          : ' le sprite mobile a des tunes ?
                ntm% = sprites(n%,7)      : ' nombre de tunes du sprite mobile
                indm% = sprites(n%,6)-1  : ' prendre l'indice dans tunes()
                for tm%=1 to ntm%              : ' boucle sur les tunes du sprite mobileé
                  xsm% = tunes(indm%+tm%,1)    : ' c'est l'abscisse du coin en haut à gauche
                  ysm% = tunes(indm%+tm%,2)    : ' c'est l'ordonnée du coin en haut à gauche
                  wsm = tunes(indm%+tm%,3)      : ' c'est la largeur
                  hsm = tunes(indm%+tm%,4)      : ' c'est la hauteur
                  xsm% = xsm% + sprites(n%,4)  : ' l'adresse du tune est relative !
                  ysm% = ysm% + sprites(n%,5)  : ' l'adresse du tune est relative !
if trace%=1
  item_add 102,str$(t%)+": "+str$(xs%)+","+str$(ys%)+"/"+str$(ws)+","+str$(hs)
  item_add 102,str$(tm%)+": "+str$(xsm%)+","+str$(ysm%)+"/"+str$(wsm)+","+str$(hsm)
  item_add 102,""
end_if
                  if (xs%-1)<=(xsm%+wsm)          : ' bord gauche tune fixe plus à gauche que bord droit tune mobile ?
                    if (xs%+ws)>=(xsm%-1)        : ' bord droit tune fixe plus à droite que bord gauche tune mobile ?
                      if (ysm%+hsm)>=ys%          : ' bord bas tune mobile plus bas que bord haut tune fixe ?
                        if ysm%<=(ys%+hs)        : ' bord haut tune mobile plus haut que bord bas tune fixe ?
                          sprite_collision% = i%  : ' alors collision
                          tune_collision% = t%
                          tune_collision_mobile% = tm%
                          chercher_noms()        : ' chercher les noms des tunes
if trace%=1 then item_add 102,str$(ind%)+"  "+str$(indm%)
                          exit_sub                : ' sortie car on a trouvé une collision
                        end_if                    : ' fin test sur bord haut tune mobile
                      end_if                      : ' fin test sur bord bas tune mobile
                    end_if                        : ' fin test sur bord droit tune fixe
                  end_if                          : ' fin test sur bord gauche tune fixe

                next tm%                        : ' fin boucle sur les tune du mobile
              else                        : ' le sprite mobile n'a pas de tunes !
                  if (xs%-1)<=(x%+w)              : ' bord gauche tune fixe plus à gauche que bord droit sprite mobile ?
                    if (xs%+ws)>=(x%-1)          : ' bord droit tune fixe plus à droite que bord gauche sprite mobile ?
                      if (y%+h)>=ys%              : ' bord bas sprite mobile plus bas que bord haut tune fixe ?
                        if y%<=(ys%+hs)          : ' bord haut sprite mobile plus haut que bord bas tune fixe ?
                          sprite_collision% = i%  : ' alors collision
                          tune_collision% = t%
                          tune_collision_mobile% = 0
                          chercher_noms()        : ' chercher les noms des tunes
if trace%=1 then item_add 102,str$(ind%)+" fixe"
                          exit_sub                : ' sortie car on a trouvé une collision
                        end_if                    : ' fin test sur bord haut tune mobile
                      end_if                      : ' fin test sur bord bas tune mobile
                    end_if                        : ' fin test sur bord droit tune fixe
                  end_if                          : ' fin test sur bord gauche tune fixe
              end_if                          : ' fin sprite mobile a des tunes
             
            next t%                          : ' fin boucle sur les tunes du sprite touché
            sprite_collision% = 0            : ' aucun tune du sprite n'est touché
          else                                : ' le sprite fixe n'a pas de tunes !
            if sprites(n%,6)>0                : ' le sprite mobile a des tunes ?
              ntm% = sprites(n%,7)            : ' nombre de tunes du sprite mobile
              indm% = sprites(n%,6)-1        : ' prendre l'indice dans tunes()
              for tm%=1 to ntm%              : ' boucle sur les tunes du sprite mobileé
                xsm% = tunes(indm%+tm%,1)    : ' c'est l'abscisse du coin en haut à gauche
                ysm% = tunes(indm%+tm%,2)    : ' c'est l'ordonnée du coin en haut à gauche
                wsm = tunes(indm%+tm%,3)      : ' c'est la largeur
                hsm = tunes(indm%+tm%,4)      : ' c'est la hauteur
                xsm% = xsm% + sprites(n%,4)  : ' l'adresse du tune est relative !
                ysm% = ysm% + sprites(n%,5)  : ' l'adresse du tune est relative !
if trace%=1
  item_add 102,"fixe: "+str$(sprites(i%,4))+","+str$(sprites(i%,5))+" / "+str$(sprites(i%,0))+","+str$(sprites(i%,1))
  item_add 102,"tune: "+str$(tm%)+": "+str$(xsm%)+","+str$(ysm%)+" / "+str$(wsm)+","+str$(hsm)
  item_add 102,""
end_if
                if (sprites(i%,4)-1)<=(xsm%+wsm)            : ' bord gauche sprite fixe plus à gauche que bord droit tune mobile ?
  item_add 102,"a"
                  if (sprites(i%,4)+sprites(i%,0))>=(xsm%-1) : ' bord droit sprite fixe plus à droite que bord gauche tune mobile ?
  item_add 102,"b"
                    if (ysm%+hsm)>=sprites(i%,5)            : ' bord bas tune mobile plus bas que bord haut sprite fixe ?
  item_add 102,"c"
                      if ysm%<=(sprites(i%,5)+sprites(i%,1)) : ' bord haut tune mobile plus haut que bord bas sprite fixe ?
  item_add 102,"d"
                        sprite_collision% = i%              : ' alors collision
                        tune_collision% = 0
                        tune_collision_mobile% = tm%
                        chercher_noms()        : ' chercher les noms des tunes
if trace%=1 then item_add 102,str$(indm%)+" mobile"
                        exit_sub                : ' sortie car on a trouvé une collision
                      end_if                    : ' fin test sur bord haut tune mobile
                    end_if                      : ' fin test sur bord bas tune mobile
                  end_if                        : ' fin test sur bord droit tune fixe
                end_if                          : ' fin test sur bord gauche tune fixe
              next tm%                          : ' fin boucle sur les tunes mobile
              sprite_collision% = 0
            else                          : ' sprite mobile n'a pas de tunes !
              chercher_noms()            : ' alors, construire les noms par défaut
            end_if                        : ' fin de test sur les tunes du sprite mobile
            exit_sub                      : ' donc, sortie immédiate car colision globale
          end_if                          : ' fin test si sprite a des tunes
        end_if                            : ' fin collision possible
      end_if                              : ' fin test sprite en dur
    end_if                                : ' fin test sur sprite "autre"
  next i%                                : ' fin boucle sur les sprites
end_sub

sub chercher_noms()
      if tune_collision%>0              : ' est-ce qu'un tune a été touché ?
        for j%=1 to ntunes%                      : ' boucle de recherche du sprite concerné
          if tunes(j%,0)=sprite_collision%      : ' est-ce le sprite touché ?
            name_collision$ = tnames$(j%+tune_collision%-1)  : ' prendre le nom du tune
            exit_for                            : ' et sortir
          end_if                                : ' fin de traitement du sprite trouvé
        next j%                        : ' fin boucle sur les tunes
      else
        name_collision$ = "Sprite entier"
      end_if                            : ' fin traitement du tune touché
      if name_collision$="" then name_collision$ = "Tune "+str$(tune_collision%)      : ' nom par défaut
      if tune_collision_mobile%>0      : ' est-ce qu'un tune mobile a touché ?
        for j%=1 to ntunes%                            : ' boucle de recherche du sprite concerné
          if tunes(j%,0)=2              : ' est-ce le sprite mobile ?
            name_collision_mobile$ = tnames$(j%+tune_collision_mobile%-1) : ' prendre le nom du tune
            exit_for                                  : ' et sortir
          end_if                                      : ' fin de traitement du sprite trouvé
        next j%                        : ' fin boucle sur les tunes
      else
        name_collision_mobile$ = "Sprite entier"
      end_if                            : ' fin traitement du tune touché
      if name_collision_mobile$="" then name_collision_mobile$ = "Tune "+str$(tune_collision_mobile%)    : ' nom par défaut
end_sub

L'algorithme semble être au point. A voir...
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Klaus

Klaus


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

Des procédures pour la 2D  - Page 4 Empty
MessageSujet: Re: Des procédures pour la 2D    Des procédures pour la 2D  - Page 4 EmptyJeu 28 Mai 2015 - 0:08

Et voici une version qui contient une SUB copier_sprite. Cette SUB copie un sprite dans un nouveau sprite, avec tous ses attributs, y compris sont image, sa visibilité etc, en lui affectant sa propre position. Le programme de démo l'utilise pour copier le sprite 1. La copie devient donc le sprite 3, et le sprite 2 (mobile) peut entrer en collision, aussi bien avec le sprite 1 qu'avec le sprite 4.

Ceci est réalisé par la création d'un dossier temporaire .\Temp_Sprites, dans lequel on copie toutes les images sous forme d'un fichier sprite_xxx.bmp, xxx étant le numéro du sprite.

Code:
' 2d_utilities.bas

label clic, key, close0

dim selection_sprite_1% : selection_sprite_1% = 1  : ' 0=carré rouge impénétrable
                                                  : ' 1=Android impénétrable
dim selection_sprite_2% : selection_sprite_2% = 2  : ' 0=carré bleu impénétrable
                                                  : ' 1=Android impénétrable

dim sprites(500,7)        : ' jusqu'à 500 sprites
                          : ' ,0)=largeur  ,1)=hauteur
                          : ' ,2)=visible/invisible ,3)=impénétrable
                          : ' ,4)=coordonnée x  ,5)=coordonnée y
                          : ' ,6)=numéro d'objet DLIST contenant les tunes
                          : ' ,6)=transformé en index dans tunes(..,..)
                          : ' ,7)=nombre de tunes
dim ntunes%                : ' nombre de tunes dans tunes(..,..)
dim tunes(3000,4)          : ' jusqu'à 3000 tunes
                          : ' ,0)=sprite  ,1)=coordonnée x  ,2)=coordonnée y
                          : ' ,3)=largeur  ,4)=hauteur
dim tnames$(3000)          : ' noms des tunes
dim nsprite%              : ' dernier numéro de sprite créé
dim sprite_trouve%        : ' numéro du sprite trouvé par un clic (ou 0 si non trouvé)
dim sprite_collision%      : ' numéro du sprite touché par une collision
dim tune_collision%        : ' numéro du tune fixe touché (ou 0 si non trouvé)
dim tune_collision_mobile% : ' numéro du tune mobile touché (ou 0 si non trouvé)
dim name_collision$        : ' nom du tune fixe touché
dim name_collision_mobile$ : ' nom du tune mobile touché
dim scene_2d%              : ' numéro d'objet du scene2d
dim trace% : trace% = 0    : ' mettre 1 pour afficher une trace des calculs
dim images$                : ' nom de dossier temporaire pour copier les images des sprites
dim i%, j%, d%, dx%, dy%, s$, sm$

scene_2d% = 17            : ' juste un exemple
scene2d scene_2d%          : ' créer le scene2d
sprite_target_is scene_2d%    :  ' assurer du bon ciblage
on_click scene_2d%,clic

dlist 101                  : ' pour recevoir la liste des tunes pour sprite 1
if trace%=1 then list 102 : top 102,500 : width 102,1000 : height 102,200

full_space 0
full_space scene_2d%
picture 10 : hide 10 : width 10,200 : height 10,200
image 11
2d_target_is 10

memoriser_images()                  : ' activer la mémorisation des images des sprites

if selection_sprite_1%=0
  color 10,255,0,0
  2d_image_copy 11,0,0,200,200
  creer_sprite(50,50,11,1)          : ' sprite rouge impénétrable
else
  file_load 10,"Android.bmp"
  2d_image_copy 11,0,0,200,200
  file_load 101,"Android_mask_tuned_list.txt"
  creer_sprite_avec_tunes(50,50,11,1,101)  : ' sprite "Android" impénétrable, avec tunes
end_if

if selection_sprite_2%=0
  color 10,0,0,255
  2d_image_copy 11,0,0,200,200      : ' sprite bleu impénétrable
  creer_sprite(400,120,11,1)
else
  file_load 10,"Android.bmp"
  2d_image_copy 11,0,0,200,200
  file_load 101,"Android_mask_tuned_list.txt"  : ' déjà chargé
  creer_sprite_avec_tunes(400,130,11,1,101)  : ' sprite "Android" impénétrable, avec tunes
end_if

color 10,255,255,0
2d_image_copy 11,0,0,200,200      : ' sprite jaune pénétrable
creer_sprite(280,180,11,0)

copier_sprite(1,300,500,11)      : ' copie du sprite 1 (en sprite 4)

on_key_down 0,key
on_close 0,close0

end

' ***** frappe d'une touche au clavier
key:
  d% = key_down_code
  if d%=37 : ' gauche
        dx% = 0 - 1
        dy% = 0
  end_if
  if d%=38 : ' haut
        dx% = 0
        dy% = 0 - 1
  end_if
  if d%=39 : ' droite
        dx% = 1
        dy% = 0
  end_if
  if d%=40 : ' bas
        dx% = 0
        dy% = 1
  end_if
  for i%=1 to 30                        : ' pas de 30 pixels par frappe d'une flèche
    deplacer_sprite(2,1,dx%,dy%)        : ' déplacement relatif
    tester_si_collision(2,1)            : ' suivi du test de collision
    s$ = ""
    if sprite_collision%>0              : ' une collision a eu lieu ?
      s$ = "collision avec sprite "+str$(sprite_collision%)+"  tune "+str$(tune_collision%)+"=["+name_collision$
      sm$ = "]  touché par sprite 2 tune "+str$(tune_collision_mobile%)+"=["+name_collision_mobile$+"]"
      message s$ + sm$
      deplacer_sprite(2,1,0-dx%,0-dy%)  : ' annuler le déplacement en cas de collision
      exit_for                          : ' et arrêter le déplacement
    end_if                              : ' fin test si collision
  next i%                              : ' fin boucle de déplacement
return

' ***** reste du programme initial, à conserver pour le moment...
for i%=399 to 0 step -1
  deplacer_sprite(2,0,i%,sprites(2,5))  : ' déplacer horizontalement en absolu
  display
  tester_si_collision(2,1)
  if sprite_collision%>0
    message "collision avec sprite "+str$(sprite_collision%)+"  tune "+str$(tune_collision%)+"  touché par sprite 2 tune "+str$(tune_collision_mobile%)
    exit_for
  end_if
next i%

for i%=sprites(2,4) to 400
  deplacer_sprite(2,0,i%,sprites(2,5))  : ' déplacer horizontalement en absolu
  display
next i%

end
' ***** fin reste du programme initial

' ***** clic dans la scene2d
clic:
  chercher_sprite_selon_clic()
  if sprite_trouve%>0
    message "clic sur sprite "+str$(sprite_trouve%)
  else
    message "aucun sprite cliqué"
  end_if
  return
 
' ***** fermeture de la form 0
close0:
  effacer_images()                      : ' effacer éventuellement les images des sprites
  return
 

sub memoriser_images()
  dim_local d$
  if images$<>"" then exit_sub          : ' mémorisation déjà activé ?
  d$ = dir_current$ + "\Temp_Sprites"    : ' construire dossier temporaire des images des sprites
  if dir_exists(d$)=0                    : ' ce dossier n'existe pas ?
    dir_make d$                          : ' alors créer ce dossier
    images$ = d$                        : ' et mémoriser le chemin
  end_if                                : ' fin test existance du dossier temporaire
end_sub

sub effacer_images()
  dim_local old$, f$
  if images$="" then exit_sub            : ' le dossier temporaire n'existe pas ? Rien à faire !
  old$ = dir_current$                    : ' mémoriser l'actuel dossier courant
  dir_change images$                    : ' changer pour le dossier temporaire des images
  f$ = file_find_first$                  : ' prendre le premier nom de fichier de ce dossier
  while f$<>"_"                          : ' tout est traité ?
    if left$(f$,1)<>"." then file_delete f$  : ' détruire si c'est un vrai fichier
    f$ = file_find_next$                : ' passer au fichier suivant
  end_while                              : ' fin de boucle de traitement
  file_find_close                        : ' clore la fonction de recherche
  dir_change old$                        : ' remettre l'ancien dossier courant
  rmdir images$                          : ' supprimer le dossier des images
  images$ = ""                          : ' et "oublier" ce dossier
end_sub

sub creer_sprite(x%,y%,img%,dur%)
  nsprite% = nsprite% + 1        : ' passer au numéro de sprite suivant
  sprite nsprite%                : ' créer le sprite
  sprites(nsprite%,0) = 200      : ' mémoriser sa largeur
  sprites(nsprite%,1) = 200      : ' et sa hauteur
  sprites(nsprite%,2) = 1        : ' marquer "visible"
  sprites(nsprite%,3) = dur%    : ' marquer 0="pénétrable" ou 1="impénétrable"
  sprites(nsprite%,4) = x%      : ' position horizontale du sprite
  sprites(nsprite%,5) = y%      : ' position verticale du sprite
  sprites(nsprite%,6) = 0        : ' pas de tunes
  sprites(nsprite%,7) = 0        : ' pas de tunes
  if img%>0                      : ' une image est fournie ?
    sprite_image_load nsprite%,img%  : ' copier une image dans le sprite
    if images$<>"" then file_save img%,images$+"\sprite_"+str$(nsprite%)+".bmp" : ' et la sauver
  end_if                        : ' fin test image fournie
  sprite_position nsprite%,x%,y% : ' positionner le sprite à l'endroit voulu
  display
end_sub

sub creer_sprite_avec_tunes(x%,y%,img%,dur%,dl%)
  dim_local t%, s$, p%, n%
  if object_exists(dl%)=0 then exit_sub  : ' impossible si l'objet n'existe pas
  if object_type(dl%)<>26 then exit_sub  : ' impossible si l'objet n'est pas une DLIST
  if count(dl%)=0 then exit_sub          : ' impossible si la liste des tunes est vide
  nsprite% = nsprite% + 1          : ' passer au numéro de sprite suivant
  sprite nsprite%                  : ' créer le sprite
  sprites(nsprite%,0) = 200        : ' mémoriser sa largeur
  sprites(nsprite%,1) = 200        : ' et sa hauteur
  sprites(nsprite%,2) = 1          : ' marquer "visible"
  sprites(nsprite%,3) = dur%      : ' marquer 0="pénétrable" ou 1="impénétrable"
  sprites(nsprite%,4) = x%        : ' position horizontale du sprite
  sprites(nsprite%,5) = y%        : ' position verticale du sprite
  sprites(nsprite%,6) = ntunes%+1  : ' indice dans la liste des tunes
  sprites(nsprite%,7) = count(dl%) : ' nombre de tunes
  for t%=1 to count(dl%)          : ' boucle sur les lignes des tunes
    ntunes% = ntunes% + 1          : ' compter le nouveau tune
    tunes(ntunes%,0) = nsprite%    : ' mémoriser le numéro du sprite pour ce tune
    s$ = item_read$(dl%,t%)+","    : ' lire un eligne de tunes
    p% = instr(s$,",")
    n% = val(left$(s$,p%-1))      : ' garder le numéro du tune
    s$ = mid$(s$,p%+1,100)        : ' dépasser le numéro de tune
    p% = instr(s$,",")
    tunes(ntunes%,1) = val(left$(s$,p%-1)) : ' mémoriser coordonnée x du tune
    s$ = mid$(s$,p%+1,100)        : ' dépasser la coordonnée x du tune
    p% = instr(s$,",")
    tunes(ntunes%,2) = val(left$(s$,p%-1)) : ' mémoriser coordonnée y du tune
    s$ = mid$(s$,p%+1,100)        : ' dépasser la coordonnée y du tune
    p% = instr(s$,",")
    tunes(ntunes%,3) = val(left$(s$,p%-1)) - tunes(ntunes%,1)+1 : ' mémoriser largeur du tune
    s$ = mid$(s$,p%+1,100)        : ' dépasser la largeur du tune
    p% = instr(s$,",")
    tunes(ntunes%,4) = val(left$(s$,p%-1)) - tunes(ntunes%,2)+1 : ' mémoriser hauteur du tune
    s$ = mid$(s$,p%+1,100)        : ' dépasser la hauteur du tune
    if s$="" then s$ = "Tune "+str$(n%)
    tnames$(ntunes%) = s$
  next t%                          : ' fin boucle sur les lignes des tunes
  if img%>0                        : ' une image est fournie ?
    sprite_image_load nsprite%,img%  : ' copier une image dans le sprite
    if images$<>"" then file_save img%,images$+"\sprite_"+str$(nsprite%)+".bmp" : ' et la sauver
  end_if                          : ' fin test image fournie
  sprite_position nsprite%,x%,y%  : ' positionner le sprite à l'endroit voulu

  display
end_sub

sub copier_sprite(n%,x%,y%,img%)
  dim_local i%, nt%
  nsprite% = nsprite% + 1                : ' passer au numéro de sprite suivant
  sprite nsprite%                        : ' créer le sprite
  sprites(nsprite%,0) = sprites(n%,0)    : ' mémoriser sa largeur
  sprites(nsprite%,1) = sprites(n%,1)    : ' et sa hauteur
  sprites(nsprite%,2) = sprites(n%,2)    : ' marquer "visible"
  sprites(nsprite%,3) = sprites(n%,3)    : ' marquer 0="pénétrable" ou 1="impénétrable"
  sprites(nsprite%,4) = x%              : ' position horizontale du sprite
  if sprites(n%,3)=0 then sprites(nsprite%,4) = sprites(nsprite%,4) + 4000 : ' traitement "invisible"
  sprites(nsprite%,5) = y%              : ' position verticale du sprite
  if sprites(n%,6)=0                    : ' le sprite source n'a pas de tunes ?
    sprites(nsprite%,6) = 0              : ' pas de tunes
    sprites(nsprite%,7) = 0              : ' pas de tunes
  else                                  : ' le sprite source a des tunes
    nt% = sprites(n%,6)                  : ' alors mémoriser l'indice dans la liste des tunes
    sprites(nsprite%,6) = ntunes%+1      : ' indice dans la liste des tunes
    sprites(nsprite%,7) = sprites(n%,0)  : ' nombre de tunes
    for i%=1 to sprites(n%,0)            : ' boucle sur tous les tunes du sprite source
      ntunes% = ntunes% + 1              : ' compter le nouveau tune
      tunes(ntunes%,0) = nsprite%        : ' mémoriser le numéro du sprite pour ce tune
      tunes(ntunes%,1) = tunes(nt%+i%-1,1) : ' et copier les autres valeurs
      tunes(ntunes%,2) = tunes(nt%+i%-1,2)
      tunes(ntunes%,3) = tunes(nt%+i%-1,3)
      tunes(ntunes%,4) = tunes(nt%+i%-1,4)
      tnames$(ntunes%) = tnames$(nt%+i%-1) : ' copier le nom du tune
    next i%                              : ' fin boucle de copie des tunes
  end_if                                : ' fin traitement des tunes

  if images$<>""                        : ' les images sont mémorisées ?
    if file_exists(images$+"\sprite_"+str$(n%)+".bmp")=1
      file_load img%,images$+"\sprite_"+str$(n%)+".bmp"  : ' charger l'image dans objet IMG%
      sprite_image_load nsprite%,img%    : ' charger l'image dans le nouveau sprite
      file_save img%,images$+"\sprite_"+str$(nsprite%)+".bmp" : ' et la sauver
    end_if                              : ' fin test "image existante"
  end_if                                : ' fin test images mémorisées

  sprite_position nsprite%,x%,y%        : ' positionner le sprite à l'endroit voulu

  display
end_sub

sub deplacer_sprite(n%,rel%,x%,y%)
  if (n%<1) or (n%>nsprite%) then exit_sub  : ' sécuriser
  if rel%=1                              : ' positionnement relatif ?
    sprites(n%,4) = sprites(n%,4) + x%
    sprites(n%,5) = sprites(n%,5) + y%
  else                                  : ' positionnement absolu !
    sprites(n%,4) = x%
    sprites(n%,5) = y%
  end_if
  if sprites(nsprite%,2)=1              : ' sprite visible ?
    sprite_position n%,sprites(n%,4),sprites(n%,5) : ' positionner le sprite visible à l'endroit voulu
  else                                  : ' sprite caché !
    sprite_position n%,sprites(n%,4)+4000,sprites(n%,5) : ' positionner le sprite caché à l'endroit voulu
  end_if
end_sub

sub redimensionner_sprite_x(n%,c)
  if (n%<1) or (n%>nsprite%) then exit_sub  : ' sécuriser
  sprite_x_scale n%,c              : ' ajuster la largeur
  sprites(n%,0) = sprites(n%,0)*c  : ' et mémoriser
end_sub

sub redimensionner_sprite_y(n%,c)
  if (n%<1) or (n%>nsprite%) then exit_sub  : ' sécuriser
  sprite_y_scale n%,c              : ' ajuster la hauteur
  sprites(n%,1) = sprites(n%,1)*c  : ' et mémoriser
end_sub

sub redimensionner_sprite_xy(n%,cx,cy)
  if (n%<1) or (n%>nsprite%) then exit_sub  : ' sécuriser
  sprite_scale n%,cx,cy              : ' ajuster largeur et hauteur
  sprites(n%,0) = sprites(n%,0)*cx  : ' et mémoriser la largeur
  sprites(n%,1) = sprites(n%,1)*cy  : ' et mémoriser la hauteur
end_sub

sub cacher_sprite(n%)
  if (n%<1) or (n%>nsprite%) then exit_sub  : ' sécuriser
  if sprites(n%,2)=1                        : ' est-ce que le sprite est visible ?
    sprite_x_position n%,sprite_x_position(n%) + 4000    : ' déplacer hors de la vue
    sprites(n%,2) = 0                        : ' signaler "invisible"
  end_if
end_sub

sub montrer_sprite(n%)
  if (n%<1) or (n%>nsprite%) then exit_sub  : ' sécuriser
  if sprites(n%,2)=0                        : ' est-ce que le sprite est invisible ?
    sprite_x_position n%,sprite_x_position(n%) - 4000    : ' replacer dans la partie visible
    sprites(n%,2) = 1                        : ' signaler "visible"
  end_if
end_sub

sub chercher_sprite_selon_clic()
  dim_local i%, x%, y%, xs%, ys%
  sprite_trouve% = 0                  : ' supposer "sprite non trouvé"
  if number_click<>scene_2d% then exit : ' on n'a pas cliqué dans le scene2d ?
  if nsprite%=0 then exit_sub          : ' pas de sprites créés ?
  x% = mouse_x_left_down(scene_2d%)    : ' mémoriser la position horizontale du clic
  y% = mouse_y_left_down(scene_2d%)    : ' mémoriser la position verticale du clic
  for i%=nsprite% to 1 step -1        : ' boucle sur tous les sprites
    xs% = sprite_x_position(i%)        : ' mémoriser la position horizontale du sprite i%
    ys% = sprite_y_position(i%)        : ' mémoriser la position verticale dusprite i%
    if (xs%<x%)                        : ' le bord gauche du sprite est plus à gauche que l'abscisse du clic ?
      if (ys%<y%)                      : ' le bord haut du sprite est plus haute que l'ordonnée du sprite ?
        if xs%+sprites(i%,0)>=x%      : ' le bord droit du sprite est plus à droite que l'abscisse du clic ?
          if ys%+sprites(i%,1)>=y%    : ' le bord bas du sprite est plus en bas que l'ordonnée du clic ?
              sprite_trouve% = i%      : ' alors, on a trouvé le sprite
              exit_sub                : ' et on sort
          end_if                      : ' fin test sur le bord bas du sprite
        end_if                        : ' fin test sur le bord droit du sprite
      end_if                          : ' fin test sur le bord haut du sprite
    end_if                            : ' fin test sur le bord gauche du sprite
  next i%                              : ' fin boucle sur les sprites
message "a4"
end_sub

sub tester_si_collision(n%,dir%)
  dim_local i%, x%, y%, w%, h%, xs%, ys%, w, h, ws, hs, t%, nt%,
  dim_local s$, s1$, ss$, ss1$, p%, p2%, pp%, pp2%,
  dim_local ntm%, tm%, xsm%, ysm%, wsm, hsm, ind%, indm%
  sprite_collision% = 0                : ' supposer "pas de collision"
  tune_collision% = 0
  tune_collision_mobile% = 0
  if nsprite%<2 then exit_sub          : ' pas de collisions possibles ?
  if sprites(n%,2)=0 then exit_sub    : ' le sprite mobile est "invisible" ?
  if sprites(n%,3)=0 then exit_sub    : ' le sprite mobile est "pénétrable" ?
  x% = sprites(n%,4)                  : ' position horizontale du sprite en movement
  y% = sprites(n%,5)                  : ' position verticale du sprite en movement
  w = sprites(n%,0)                    : ' largeur du sprite en movement
  h = sprites(n%,1)                    : ' hauteur du sprite en movement
  for i%=nsprite% to 1 step -1        : ' boucle sur tous les sprites
    if i%<>n%                          : ' on est sur un sprite autre que celui qui bouge ?
      if sprites(i%,3)<>0              : ' sprite en dur ?
        xs% = sprites(i%,4)            : ' position horizontale du sprite à tester
        ys% = sprites(i%,5)            : ' position verticale du sprite à tester
        ws = sprites(i%,0)            : ' largeur du sprite à tester
        hs = sprites(i%,1)            : ' hauteur du sprite à tester
        select dir%                    : ' distinction par direction du mouvement
          case 1: ' gauche
            if (x%-1)<=(xs%+ws)      : ' bord droit fixe peut toucher bord gauche mobile ?
              if (x%+w)>=(xs%-1)
                if (ys%+hs)>=y%        : ' bord bas mobile plus bas que bord haut fixe ?
                  if ys%<=(y%+h)        : ' bord haut mobile plus que bord bas fixe ?
                    sprite_collision% = i%  : ' alors collision
' message "collision à gauche avec "+str$(sprite_collision%)
                  end_if
                end_if
              end_if
            end_if
          case 2: ' haut
            if (y%-1)<=(ys%+hs)      : ' bord bas fixe peut toucher bord haut mobile ?
              if (y%+h)>=(ys%-1)
                if (xs%+hs)>=x%        : ' bord droit mobile plus à gauche que bord gauche fixe ?
                  if xs%<=(x%+h)        : ' bord gauche mobile plus à gauche que bord droit fixe ?
                    sprite_collision% = i%  : ' alors collision
                  end_if
                end_if
              end_if
            end_if
          case 3: ' droite    : ' à adapter
            if (x%+w)=(xs%-1)        : ' bord gauche fixe peut toucher bord droit mobile ?
              if (ys%+hs)>=y%        : ' bord bas mobile plus bas que bord haut fixe ?
                if ys%<=(y%+h)        : ' bord haut mobile plus que bord bas fixe ?
                  sprite_collision% = i%  : ' alors collision
                end_if
              end_if
            end_if
          case 4: ' bas        : ' à adapter
            if (y%+h)=(ys%-1)        : ' bord haut fixe peut toucher bord bas mobile ?
              if (xs%+hs)>=x%        : ' bord droit mobile plus à gauche que bord gauche fixe ?
                if xs%<=(x%+h)        : ' bord gauche mobile plus à gauche que bord droit fixe ?
                  sprite_collision% = i%  : ' alors collision
                end_if
              end_if
            end_if
        end_select                    : ' fin distinction par direction
' message str$(sprite_collision%)
        if sprite_collision%>0            : ' une collision est possible ?
          if sprites(i%,6)>0              : ' le sprite a des tunes ?
if trace%=1 then clear 102
            nt% = sprites(i%,7)          : ' nombre de tunes
            ind% = sprites(i%,6)-1        : ' prendre l'indice dans tunes()
            for t%=1 to nt%              : ' boucle sur les tunes du sprite touché
              xs% = tunes(ind%+t%,1)      : ' c'est l'abscisse du coin en haut à gauche
              ys% = tunes(ind%+t%,2)      : ' c'est l'ordonnée du coin en haut à gauche
              ws = tunes(ind%+t%,3)      : ' c'est la largeur
              hs = tunes(ind%+t%,4)      : ' c'est la hauteur
              xs% = xs% + sprites(i%,4)  : ' l'adresse du tune est relative !
              ys% = ys% + sprites(i%,5)  : ' l'adresse du tune est relative !

              if sprites(n%,6)>0          : ' le sprite mobile a des tunes ?
                ntm% = sprites(n%,7)      : ' nombre de tunes du sprite mobile
                indm% = sprites(n%,6)-1  : ' prendre l'indice dans tunes()
                for tm%=1 to ntm%              : ' boucle sur les tunes du sprite mobileé
                  xsm% = tunes(indm%+tm%,1)    : ' c'est l'abscisse du coin en haut à gauche
                  ysm% = tunes(indm%+tm%,2)    : ' c'est l'ordonnée du coin en haut à gauche
                  wsm = tunes(indm%+tm%,3)      : ' c'est la largeur
                  hsm = tunes(indm%+tm%,4)      : ' c'est la hauteur
                  xsm% = xsm% + sprites(n%,4)  : ' l'adresse du tune est relative !
                  ysm% = ysm% + sprites(n%,5)  : ' l'adresse du tune est relative !
if trace%=1
  item_add 102,str$(t%)+": "+str$(xs%)+","+str$(ys%)+"/"+str$(ws)+","+str$(hs)
  item_add 102,str$(tm%)+": "+str$(xsm%)+","+str$(ysm%)+"/"+str$(wsm)+","+str$(hsm)
  item_add 102,""
end_if
                  if (xs%-1)<=(xsm%+wsm)          : ' bord gauche tune fixe plus à gauche que bord droit tune mobile ?
                    if (xs%+ws)>=(xsm%-1)        : ' bord droit tune fixe plus à droite que bord gauche tune mobile ?
                      if (ysm%+hsm)>=ys%          : ' bord bas tune mobile plus bas que bord haut tune fixe ?
                        if ysm%<=(ys%+hs)        : ' bord haut tune mobile plus haut que bord bas tune fixe ?
                          sprite_collision% = i%  : ' alors collision
                          tune_collision% = t%
                          tune_collision_mobile% = tm%
                          chercher_noms()        : ' chercher les noms des tunes
if trace%=1 then item_add 102,str$(ind%)+"  "+str$(indm%)
                          exit_sub                : ' sortie car on a trouvé une collision
                        end_if                    : ' fin test sur bord haut tune mobile
                      end_if                      : ' fin test sur bord bas tune mobile
                    end_if                        : ' fin test sur bord droit tune fixe
                  end_if                          : ' fin test sur bord gauche tune fixe

                next tm%                        : ' fin boucle sur les tune du mobile
              else                        : ' le sprite mobile n'a pas de tunes !
                  if (xs%-1)<=(x%+w)              : ' bord gauche tune fixe plus à gauche que bord droit sprite mobile ?
                    if (xs%+ws)>=(x%-1)          : ' bord droit tune fixe plus à droite que bord gauche sprite mobile ?
                      if (y%+h)>=ys%              : ' bord bas sprite mobile plus bas que bord haut tune fixe ?
                        if y%<=(ys%+hs)          : ' bord haut sprite mobile plus haut que bord bas tune fixe ?
                          sprite_collision% = i%  : ' alors collision
                          tune_collision% = t%
                          tune_collision_mobile% = 0
                          chercher_noms()        : ' chercher les noms des tunes
if trace%=1 then item_add 102,str$(ind%)+" fixe"
                          exit_sub                : ' sortie car on a trouvé une collision
                        end_if                    : ' fin test sur bord haut tune mobile
                      end_if                      : ' fin test sur bord bas tune mobile
                    end_if                        : ' fin test sur bord droit tune fixe
                  end_if                          : ' fin test sur bord gauche tune fixe
              end_if                          : ' fin sprite mobile a des tunes
             
            next t%                          : ' fin boucle sur les tunes du sprite touché
            sprite_collision% = 0            : ' aucun tune du sprite n'est touché
          else                                : ' le sprite fixe n'a pas de tunes !
            if sprites(n%,6)>0                : ' le sprite mobile a des tunes ?
              ntm% = sprites(n%,7)            : ' nombre de tunes du sprite mobile
              indm% = sprites(n%,6)-1        : ' prendre l'indice dans tunes()
              for tm%=1 to ntm%              : ' boucle sur les tunes du sprite mobileé
                xsm% = tunes(indm%+tm%,1)    : ' c'est l'abscisse du coin en haut à gauche
                ysm% = tunes(indm%+tm%,2)    : ' c'est l'ordonnée du coin en haut à gauche
                wsm = tunes(indm%+tm%,3)      : ' c'est la largeur
                hsm = tunes(indm%+tm%,4)      : ' c'est la hauteur
                xsm% = xsm% + sprites(n%,4)  : ' l'adresse du tune est relative !
                ysm% = ysm% + sprites(n%,5)  : ' l'adresse du tune est relative !
if trace%=1
  item_add 102,"fixe: "+str$(sprites(i%,4))+","+str$(sprites(i%,5))+" / "+str$(sprites(i%,0))+","+str$(sprites(i%,1))
  item_add 102,"tune: "+str$(tm%)+": "+str$(xsm%)+","+str$(ysm%)+" / "+str$(wsm)+","+str$(hsm)
  item_add 102,""
end_if
                if (sprites(i%,4)-1)<=(xsm%+wsm)            : ' bord gauche sprite fixe plus à gauche que bord droit tune mobile ?
  item_add 102,"a"
                  if (sprites(i%,4)+sprites(i%,0))>=(xsm%-1) : ' bord droit sprite fixe plus à droite que bord gauche tune mobile ?
  item_add 102,"b"
                    if (ysm%+hsm)>=sprites(i%,5)            : ' bord bas tune mobile plus bas que bord haut sprite fixe ?
  item_add 102,"c"
                      if ysm%<=(sprites(i%,5)+sprites(i%,1)) : ' bord haut tune mobile plus haut que bord bas sprite fixe ?
  item_add 102,"d"
                        sprite_collision% = i%              : ' alors collision
                        tune_collision% = 0
                        tune_collision_mobile% = tm%
                        chercher_noms()        : ' chercher les noms des tunes
if trace%=1 then item_add 102,str$(indm%)+" mobile"
                        exit_sub                : ' sortie car on a trouvé une collision
                      end_if                    : ' fin test sur bord haut tune mobile
                    end_if                      : ' fin test sur bord bas tune mobile
                  end_if                        : ' fin test sur bord droit tune fixe
                end_if                          : ' fin test sur bord gauche tune fixe
              next tm%                          : ' fin boucle sur les tunes mobile
              sprite_collision% = 0
            else                          : ' sprite mobile n'a pas de tunes !
              chercher_noms()            : ' alors, construire les noms par défaut
            end_if                        : ' fin de test sur les tunes du sprite mobile
            exit_sub                      : ' donc, sortie immédiate car colision globale
          end_if                          : ' fin test si sprite a des tunes
        end_if                            : ' fin collision possible
      end_if                              : ' fin test sprite en dur
    end_if                                : ' fin test sur sprite "autre"
  next i%                                : ' fin boucle sur les sprites
end_sub

sub chercher_noms()
      if tune_collision%>0              : ' est-ce qu'un tune a été touché ?
        for j%=1 to ntunes%                      : ' boucle de recherche du sprite concerné
          if tunes(j%,0)=sprite_collision%      : ' est-ce le sprite touché ?
            name_collision$ = tnames$(j%+tune_collision%-1)  : ' prendre le nom du tune
            exit_for                            : ' et sortir
          end_if                                : ' fin de traitement du sprite trouvé
        next j%                        : ' fin boucle sur les tunes
      else
        name_collision$ = "Sprite entier"
      end_if                            : ' fin traitement du tune touché
      if name_collision$="" then name_collision$ = "Tune "+str$(tune_collision%)      : ' nom par défaut
      if tune_collision_mobile%>0      : ' est-ce qu'un tune mobile a touché ?
        for j%=1 to ntunes%                            : ' boucle de recherche du sprite concerné
          if tunes(j%,0)=2              : ' est-ce le sprite mobile ?
            name_collision_mobile$ = tnames$(j%+tune_collision_mobile%-1) : ' prendre le nom du tune
            exit_for                                  : ' et sortir
          end_if                                      : ' fin de traitement du sprite trouvé
        next j%                        : ' fin boucle sur les tunes
      else
        name_collision_mobile$ = "Sprite entier"
      end_if                            : ' fin traitement du tune touché
      if name_collision_mobile$="" then name_collision_mobile$ = "Tune "+str$(tune_collision_mobile%)    : ' nom par défaut
end_sub
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Klaus

Klaus


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

Des procédures pour la 2D  - Page 4 Empty
MessageSujet: Re: Des procédures pour la 2D    Des procédures pour la 2D  - Page 4 EmptyJeu 28 Mai 2015 - 1:42

Il y a encore un problème en approche à partir de la gauche, en utilisant la flèche droite. je vais creuser cela...
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Jicehel

Jicehel


Nombre de messages : 5947
Age : 52
Localisation : 77500
Date d'inscription : 18/04/2011

Des procédures pour la 2D  - Page 4 Empty
MessageSujet: Re: Des procédures pour la 2D    Des procédures pour la 2D  - Page 4 EmptyJeu 28 Mai 2015 - 10:09

Je ne suis pas intervenu comme tu travailles toujours dessus pour le moment, mais n'hésites pas à demander si tu as besoin de testeur.
PS: Tu en pense quoi de mon idée de fonction copier_sprite ?
Revenir en haut Aller en bas
Klaus

Klaus


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

Des procédures pour la 2D  - Page 4 Empty
MessageSujet: Re: Des procédures pour la 2D    Des procédures pour la 2D  - Page 4 EmptyJeu 28 Mai 2015 - 21:47

@Jicehel:
Citation :
Tu en pense quoi de mon idée de fonction copier_sprite ?
Tu n'as pas vu que c'est déjà implémenté, dans mon dernier code de 0h08 ?
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Klaus

Klaus


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

Des procédures pour la 2D  - Page 4 Empty
MessageSujet: Re: Des procédures pour la 2D    Des procédures pour la 2D  - Page 4 EmptyJeu 28 Mai 2015 - 22:31

Et, avant d'aller plus loin dans la recherche du bug qui reste, voici une version qui gère, on seulement les noms des tunes, mais également les noms des sprites ! Oui, dans cette version, on peut donner des noms aux sprites !
Code:
' 2d_utilities.bas

label clic, key, close0

dim selection_sprite_1% : selection_sprite_1% = 1  : ' 0=carré rouge impénétrable
                                                  : ' 1=Android impénétrable
dim selection_sprite_2% : selection_sprite_2% = 2  : ' 0=carré bleu impénétrable
                                                  : ' 1=Android impénétrable

dim sprites(500,7)        : ' jusqu'à 500 sprites
                          : ' ,0)=largeur  ,1)=hauteur
                          : ' ,2)=visible/invisible ,3)=impénétrable
                          : ' ,4)=coordonnée x  ,5)=coordonnée y
                          : ' ,6)=numéro d'objet DLIST contenant les tunes
                          : ' ,6)=transformé en index dans tunes(..,..)
                          : ' ,7)=nombre de tunes
dim ntunes%                : ' nombre de tunes dans tunes(..,..)
dim tunes(3000,4)          : ' jusqu'à 3000 tunes
                          : ' ,0)=sprite  ,1)=coordonnée x  ,2)=coordonnée y
                          : ' ,3)=largeur  ,4)=hauteur
dim tnames$(3000)          : ' noms des tunes
dim snames$(500)          : ' noms des sprites
dim nsprite%              : ' dernier numéro de sprite créé
dim sprite_trouve%        : ' numéro du sprite trouvé par un clic (ou 0 si non trouvé)
dim sprite_collision%      : ' numéro du sprite touché par une collision
dim sprite_collision_mobile%  : ' numéro du sprite mobile touché
dim tune_collision%        : ' numéro du tune fixe touché (ou 0 si non trouvé)
dim tune_collision_mobile% : ' numéro du tune mobile touché (ou 0 si non trouvé)
dim tname_collision$      : ' nom du tune fixe touché
dim tname_collision_mobile$ : ' nom du tune mobile touché
dim sname_collision$      : ' nom du sprite fixe touché
dim sname_collision_mobile$ : ' nom du sprite mobile touché
dim scene_2d%              : ' numéro d'objet du scene2d
dim trace% : trace% = 0    : ' mettre 1 pour afficher une trace des calculs
dim images$                : ' nom de dossier temporaire pour copier les images des sprites
dim i%, j%, d%, dx%, dy%, s$, sm$

scene_2d% = 17            : ' juste un exemple
scene2d scene_2d%          : ' créer le scene2d
sprite_target_is scene_2d%    :  ' assurer du bon ciblage
on_click scene_2d%,clic

dlist 101                  : ' pour recevoir la liste des tunes pour sprite 1
if trace%=1 then list 102 : top 102,500 : width 102,1000 : height 102,200

full_space 0
full_space scene_2d%
picture 10 : hide 10 : width 10,200 : height 10,200
image 11
2d_target_is 10

memoriser_images()                  : ' activer la mémorisation des images des sprites

if selection_sprite_1%=0
  color 10,255,0,0
  2d_image_copy 11,0,0,200,200
  creer_sprite("Carré rouge fixe",50,50,11,1)          : ' sprite rouge impénétrable
else
  file_load 10,"Android.bmp"
  2d_image_copy 11,0,0,200,200
  file_load 101,"Android_mask_tuned_list.txt"
  creer_sprite_avec_tunes("Andoid fixe",50,50,11,1,101)  : ' sprite "Android" impénétrable, avec tunes
end_if

if selection_sprite_2%=0
  color 10,0,0,255
  2d_image_copy 11,0,0,200,200      : ' sprite bleu impénétrable
  creer_sprite("Carré bleu fixe",400,120,11,1)
else
  file_load 10,"Android.bmp"
  2d_image_copy 11,0,0,200,200
  file_load 101,"Android_mask_tuned_list.txt"
  creer_sprite_avec_tunes("Android mobile",400,130,11,1,101)  : ' sprite "Android" impénétrable, avec tunes
end_if

color 10,255,255,0
2d_image_copy 11,0,0,200,200      : ' sprite jaune pénétrable
creer_sprite("Carré jaune fixe",280,180,11,0)

copier_sprite("Android fixe copié",1,600,500,11)      : ' copie du sprite 1 (en sprite 4)

on_key_down 0,key
on_close 0,close0

end

' ***** frappe d'une touche au clavier
key:
  d% = key_down_code
  if d%=37 : ' gauche
        dx% = 0 - 1
        dy% = 0
  end_if
  if d%=38 : ' haut
        dx% = 0
        dy% = 0 - 1
  end_if
  if d%=39 : ' droite
        dx% = 1
        dy% = 0
  end_if
  if d%=40 : ' bas
        dx% = 0
        dy% = 1
  end_if
  for i%=1 to 30                        : ' pas de 30 pixels par frappe d'une flèche
    deplacer_sprite(2,1,dx%,dy%)        : ' déplacement relatif
    tester_si_collision(2,1)            : ' suivi du test de collision
    s$ = ""
    if sprite_collision%>0              : ' une collision a eu lieu ?
      s$ = "collision avec sprite "+str$(sprite_collision%)+"=["+sname_collision$+"]  tune "+str$(tune_collision%)+"=["+tname_collision$
      sm$ = "]  touché par sprite "+str$(sprite_collision_mobile%)+"=["+sname_collision_mobile$+"]  tune "+str$(tune_collision_mobile%)+"=["+tname_collision_mobile$+"]"
      message s$ + sm$
      deplacer_sprite(2,1,0-dx%,0-dy%)  : ' annuler le déplacement en cas de collision
      exit_for                          : ' et arrêter le déplacement
    end_if                              : ' fin test si collision
  next i%                              : ' fin boucle de déplacement
return

' ***** clic dans la scene2d
clic:
  chercher_sprite_selon_clic()
  if sprite_trouve%>0
    message "clic sur sprite "+str$(sprite_trouve%)
  else
    message "aucun sprite cliqué"
  end_if
  return
 
' ***** fermeture de la form 0
close0:
  effacer_images()                      : ' effacer éventuellement les images des sprites
  return
 

sub memoriser_images()
  dim_local d$
  if images$<>"" then exit_sub          : ' mémorisation déjà activé ?
  d$ = dir_current$ + "\Temp_Sprites"    : ' construire dossier temporaire des images des sprites
  if dir_exists(d$)=0                    : ' ce dossier n'existe pas ?
    dir_make d$                          : ' alors créer ce dossier
    images$ = d$                        : ' et mémoriser le chemin
  end_if                                : ' fin test existance du dossier temporaire
end_sub

sub effacer_images()
  dim_local old$, f$
  if images$="" then exit_sub            : ' le dossier temporaire n'existe pas ? Rien à faire !
  old$ = dir_current$                    : ' mémoriser l'actuel dossier courant
  dir_change images$                    : ' changer pour le dossier temporaire des images
  f$ = file_find_first$                  : ' prendre le premier nom de fichier de ce dossier
  while f$<>"_"                          : ' tout est traité ?
    if left$(f$,1)<>"." then file_delete f$  : ' détruire si c'est un vrai fichier
    f$ = file_find_next$                : ' passer au fichier suivant
  end_while                              : ' fin de boucle de traitement
  file_find_close                        : ' clore la fonction de recherche
  dir_change old$                        : ' remettre l'ancien dossier courant
  rmdir images$                          : ' supprimer le dossier des images
  images$ = ""                          : ' et "oublier" ce dossier
end_sub

sub creer_sprite(nam$,x%,y%,img%,dur%)
  nsprite% = nsprite% + 1        : ' passer au numéro de sprite suivant
  sprite nsprite%                : ' créer le sprite
  snames$(nsprite%)  = nam$    : ' memoriser son nom
  sprites(nsprite%,0) = 200      : ' mémoriser sa largeur
  sprites(nsprite%,1) = 200      : ' et sa hauteur
  sprites(nsprite%,2) = 1        : ' marquer "visible"
  sprites(nsprite%,3) = dur%    : ' marquer 0="pénétrable" ou 1="impénétrable"
  sprites(nsprite%,4) = x%      : ' position horizontale du sprite
  sprites(nsprite%,5) = y%      : ' position verticale du sprite
  sprites(nsprite%,6) = 0        : ' pas de tunes
  sprites(nsprite%,7) = 0        : ' pas de tunes
  if img%>0                      : ' une image est fournie ?
    sprite_image_load nsprite%,img%  : ' copier une image dans le sprite
    if images$<>"" then file_save img%,images$+"\sprite_"+str$(nsprite%)+".bmp" : ' et la sauver
  end_if                        : ' fin test image fournie
  sprite_position nsprite%,x%,y% : ' positionner le sprite à l'endroit voulu
  display
end_sub

sub creer_sprite_avec_tunes(nam$,x%,y%,img%,dur%,dl%)
  dim_local t%, s$, p%, n%
  if object_exists(dl%)=0 then exit_sub  : ' impossible si l'objet n'existe pas
  if object_type(dl%)<>26 then exit_sub  : ' impossible si l'objet n'est pas une DLIST
  if count(dl%)=0 then exit_sub          : ' impossible si la liste des tunes est vide
  nsprite% = nsprite% + 1          : ' passer au numéro de sprite suivant
  sprite nsprite%                  : ' créer le sprite
  snames$(nsprite%)  = nam$      : ' memoriser son nom
  sprites(nsprite%,0) = 200        : ' mémoriser sa largeur
  sprites(nsprite%,1) = 200        : ' et sa hauteur
  sprites(nsprite%,2) = 1          : ' marquer "visible"
  sprites(nsprite%,3) = dur%      : ' marquer 0="pénétrable" ou 1="impénétrable"
  sprites(nsprite%,4) = x%        : ' position horizontale du sprite
  sprites(nsprite%,5) = y%        : ' position verticale du sprite
  sprites(nsprite%,6) = ntunes%+1  : ' indice dans la liste des tunes
  sprites(nsprite%,7) = count(dl%) : ' nombre de tunes
  for t%=1 to count(dl%)          : ' boucle sur les lignes des tunes
    ntunes% = ntunes% + 1          : ' compter le nouveau tune
    tunes(ntunes%,0) = nsprite%    : ' mémoriser le numéro du sprite pour ce tune
    s$ = item_read$(dl%,t%)+","    : ' lire un eligne de tunes
    p% = instr(s$,",")
    n% = val(left$(s$,p%-1))      : ' garder le numéro du tune
    s$ = mid$(s$,p%+1,100)        : ' dépasser le numéro de tune
    p% = instr(s$,",")
    tunes(ntunes%,1) = val(left$(s$,p%-1)) : ' mémoriser coordonnée x du tune
    s$ = mid$(s$,p%+1,100)        : ' dépasser la coordonnée x du tune
    p% = instr(s$,",")
    tunes(ntunes%,2) = val(left$(s$,p%-1)) : ' mémoriser coordonnée y du tune
    s$ = mid$(s$,p%+1,100)        : ' dépasser la coordonnée y du tune
    p% = instr(s$,",")
    tunes(ntunes%,3) = val(left$(s$,p%-1)) - tunes(ntunes%,1)+1 : ' mémoriser largeur du tune
    s$ = mid$(s$,p%+1,100)        : ' dépasser la largeur du tune
    p% = instr(s$,",")
    tunes(ntunes%,4) = val(left$(s$,p%-1)) - tunes(ntunes%,2)+1 : ' mémoriser hauteur du tune
    s$ = mid$(s$,p%+1,100)        : ' dépasser la hauteur du tune
    if s$="" then s$ = "Tune "+str$(n%)
    tnames$(ntunes%) = s$
  next t%                          : ' fin boucle sur les lignes des tunes
  if img%>0                        : ' une image est fournie ?
    sprite_image_load nsprite%,img%  : ' copier une image dans le sprite
    if images$<>"" then file_save img%,images$+"\sprite_"+str$(nsprite%)+".bmp" : ' et la sauver
  end_if                          : ' fin test image fournie
  sprite_position nsprite%,x%,y%  : ' positionner le sprite à l'endroit voulu

  display
end_sub

sub copier_sprite(nam$,n%,x%,y%,img%)
  dim_local i%, nt%
  nsprite% = nsprite% + 1                : ' passer au numéro de sprite suivant
  sprite nsprite%                        : ' créer le sprite
  snames$(nsprite%)  = nam$            : ' memoriser son nom
  sprites(nsprite%,0) = sprites(n%,0)    : ' mémoriser sa largeur
  sprites(nsprite%,1) = sprites(n%,1)    : ' et sa hauteur
  sprites(nsprite%,2) = sprites(n%,2)    : ' marquer "visible"
  sprites(nsprite%,3) = sprites(n%,3)    : ' marquer 0="pénétrable" ou 1="impénétrable"
  sprites(nsprite%,4) = x%              : ' position horizontale du sprite
  if sprites(n%,3)=0 then sprites(nsprite%,4) = sprites(nsprite%,4) + 4000 : ' traitement "invisible"
  sprites(nsprite%,5) = y%              : ' position verticale du sprite
  if sprites(n%,6)=0                    : ' le sprite source n'a pas de tunes ?
    sprites(nsprite%,6) = 0              : ' pas de tunes
    sprites(nsprite%,7) = 0              : ' pas de tunes
  else                                  : ' le sprite source a des tunes
    nt% = sprites(n%,6)                  : ' alors mémoriser l'indice dans la liste des tunes
    sprites(nsprite%,6) = ntunes%+1      : ' indice dans la liste des tunes
    sprites(nsprite%,7) = sprites(n%,0)  : ' nombre de tunes
    for i%=1 to sprites(n%,0)            : ' boucle sur tous les tunes du sprite source
      ntunes% = ntunes% + 1              : ' compter le nouveau tune
      tunes(ntunes%,0) = nsprite%        : ' mémoriser le numéro du sprite pour ce tune
      tunes(ntunes%,1) = tunes(nt%+i%-1,1) : ' et copier les autres valeurs
      tunes(ntunes%,2) = tunes(nt%+i%-1,2)
      tunes(ntunes%,3) = tunes(nt%+i%-1,3)
      tunes(ntunes%,4) = tunes(nt%+i%-1,4)
      tnames$(ntunes%) = tnames$(nt%+i%-1) : ' copier le nom du tune
    next i%                              : ' fin boucle de copie des tunes
  end_if                                : ' fin traitement des tunes

  if images$<>""                        : ' les images sont mémorisées ?
    if file_exists(images$+"\sprite_"+str$(n%)+".bmp")=1
      file_load img%,images$+"\sprite_"+str$(n%)+".bmp"  : ' charger l'image dans objet IMG%
      sprite_image_load nsprite%,img%    : ' charger l'image dans le nouveau sprite
      file_save img%,images$+"\sprite_"+str$(nsprite%)+".bmp" : ' et la sauver
    end_if                              : ' fin test "image existante"
  end_if                                : ' fin test images mémorisées

  sprite_position nsprite%,sprites(nsprite%,4),sprites(nsprite%,5) : ' positionner le sprite à l'endroit voulu

  display
end_sub

sub deplacer_sprite(n%,rel%,x%,y%)
  if (n%<1) or (n%>nsprite%) then exit_sub  : ' sécuriser
  if rel%=1                              : ' positionnement relatif ?
    sprites(n%,4) = sprites(n%,4) + x%
    sprites(n%,5) = sprites(n%,5) + y%
  else                                  : ' positionnement absolu !
    sprites(n%,4) = x%
    sprites(n%,5) = y%
  end_if
  if sprites(nsprite%,2)=1              : ' sprite visible ?
    sprite_position n%,sprites(n%,4),sprites(n%,5) : ' positionner le sprite visible à l'endroit voulu
  else                                  : ' sprite caché !
    sprite_position n%,sprites(n%,4)+4000,sprites(n%,5) : ' positionner le sprite caché à l'endroit voulu
  end_if
end_sub

sub redimensionner_sprite_x(n%,c)
  if (n%<1) or (n%>nsprite%) then exit_sub  : ' sécuriser
  sprite_x_scale n%,c              : ' ajuster la largeur
  sprites(n%,0) = sprites(n%,0)*c  : ' et mémoriser
end_sub

sub redimensionner_sprite_y(n%,c)
  if (n%<1) or (n%>nsprite%) then exit_sub  : ' sécuriser
  sprite_y_scale n%,c              : ' ajuster la hauteur
  sprites(n%,1) = sprites(n%,1)*c  : ' et mémoriser
end_sub

sub redimensionner_sprite_xy(n%,cx,cy)
  if (n%<1) or (n%>nsprite%) then exit_sub  : ' sécuriser
  sprite_scale n%,cx,cy              : ' ajuster largeur et hauteur
  sprites(n%,0) = sprites(n%,0)*cx  : ' et mémoriser la largeur
  sprites(n%,1) = sprites(n%,1)*cy  : ' et mémoriser la hauteur
end_sub

sub cacher_sprite(n%)
  if (n%<1) or (n%>nsprite%) then exit_sub  : ' sécuriser
  if sprites(n%,2)=1                        : ' est-ce que le sprite est visible ?
    sprite_x_position n%,sprite_x_position(n%) + 4000    : ' déplacer hors de la vue
    sprites(n%,2) = 0                        : ' signaler "invisible"
  end_if
end_sub

sub montrer_sprite(n%)
  if (n%<1) or (n%>nsprite%) then exit_sub  : ' sécuriser
  if sprites(n%,2)=0                        : ' est-ce que le sprite est invisible ?
    sprite_x_position n%,sprite_x_position(n%) - 4000    : ' replacer dans la partie visible
    sprites(n%,2) = 1                        : ' signaler "visible"
  end_if
end_sub

sub chercher_sprite_selon_clic()
  dim_local i%, x%, y%, xs%, ys%
  sprite_trouve% = 0                  : ' supposer "sprite non trouvé"
  if number_click<>scene_2d% then exit : ' on n'a pas cliqué dans le scene2d ?
  if nsprite%=0 then exit_sub          : ' pas de sprites créés ?
  x% = mouse_x_left_down(scene_2d%)    : ' mémoriser la position horizontale du clic
  y% = mouse_y_left_down(scene_2d%)    : ' mémoriser la position verticale du clic
  for i%=nsprite% to 1 step -1        : ' boucle sur tous les sprites
    xs% = sprite_x_position(i%)        : ' mémoriser la position horizontale du sprite i%
    ys% = sprite_y_position(i%)        : ' mémoriser la position verticale dusprite i%
    if (xs%<x%)                        : ' le bord gauche du sprite est plus à gauche que l'abscisse du clic ?
      if (ys%<y%)                      : ' le bord haut du sprite est plus haute que l'ordonnée du sprite ?
        if xs%+sprites(i%,0)>=x%      : ' le bord droit du sprite est plus à droite que l'abscisse du clic ?
          if ys%+sprites(i%,1)>=y%    : ' le bord bas du sprite est plus en bas que l'ordonnée du clic ?
              sprite_trouve% = i%      : ' alors, on a trouvé le sprite
              exit_sub                : ' et on sort
          end_if                      : ' fin test sur le bord bas du sprite
        end_if                        : ' fin test sur le bord droit du sprite
      end_if                          : ' fin test sur le bord haut du sprite
    end_if                            : ' fin test sur le bord gauche du sprite
  next i%                              : ' fin boucle sur les sprites
message "a4"
end_sub

sub tester_si_collision(n%,dir%)
  dim_local i%, x%, y%, w%, h%, xs%, ys%, w, h, ws, hs, t%, nt%,
  dim_local s$, s1$, ss$, ss1$, p%, p2%, pp%, pp2%,
  dim_local ntm%, tm%, xsm%, ysm%, wsm, hsm, ind%, indm%
  sprite_collision%        = 0        : ' supposer "pas de collision"
  sprite_collision_mobile% = 0
  tune_collision%          = 0
  tune_collision_mobile%  = 0
  if nsprite%<2 then exit_sub          : ' pas de collisions possibles ?
  if sprites(n%,2)=0 then exit_sub    : ' le sprite mobile est "invisible" ?
  if sprites(n%,3)=0 then exit_sub    : ' le sprite mobile est "pénétrable" ?
  x% = sprites(n%,4)                  : ' position horizontale du sprite en movement
  y% = sprites(n%,5)                  : ' position verticale du sprite en movement
  w = sprites(n%,0)                    : ' largeur du sprite en movement
  h = sprites(n%,1)                    : ' hauteur du sprite en movement
  for i%=nsprite% to 1 step -1        : ' boucle sur tous les sprites
    if i%<>n%                          : ' on est sur un sprite autre que celui qui bouge ?
      if sprites(i%,3)<>0              : ' sprite en dur ?
        xs% = sprites(i%,4)            : ' position horizontale du sprite à tester
        ys% = sprites(i%,5)            : ' position verticale du sprite à tester
        ws = sprites(i%,0)            : ' largeur du sprite à tester
        hs = sprites(i%,1)            : ' hauteur du sprite à tester
        select dir%                    : ' distinction par direction du mouvement
          case 1: ' gauche
            if (x%-1)<=(xs%+ws)      : ' bord droit fixe peut toucher bord gauche mobile ?
              if (x%+w)>=(xs%-1)
                if (ys%+hs)>=y%        : ' bord bas mobile plus bas que bord haut fixe ?
                  if ys%<=(y%+h)        : ' bord haut mobile plus que bord bas fixe ?
                    sprite_collision% = i%  : ' alors collision
' message "collision à gauche avec "+str$(sprite_collision%)
                  end_if
                end_if
              end_if
            end_if
          case 2: ' haut
            if (y%-1)<=(ys%+hs)      : ' bord bas fixe peut toucher bord haut mobile ?
              if (y%+h)>=(ys%-1)
                if (xs%+hs)>=x%        : ' bord droit mobile plus à gauche que bord gauche fixe ?
                  if xs%<=(x%+h)        : ' bord gauche mobile plus à gauche que bord droit fixe ?
                    sprite_collision% = i%  : ' alors collision
                  end_if
                end_if
              end_if
            end_if
          case 3: ' droite    : ' à adapter
            if (x%+w)=(xs%-1)        : ' bord gauche fixe peut toucher bord droit mobile ?
              if (ys%+hs)>=y%        : ' bord bas mobile plus bas que bord haut fixe ?
                if ys%<=(y%+h)        : ' bord haut mobile plus que bord bas fixe ?
                  sprite_collision% = i%  : ' alors collision
                end_if
              end_if
            end_if
          case 4: ' bas        : ' à adapter
            if (y%+h)=(ys%-1)        : ' bord haut fixe peut toucher bord bas mobile ?
              if (xs%+hs)>=x%        : ' bord droit mobile plus à gauche que bord gauche fixe ?
                if xs%<=(x%+h)        : ' bord gauche mobile plus à gauche que bord droit fixe ?
                  sprite_collision% = i%  : ' alors collision
                end_if
              end_if
            end_if
        end_select                    : ' fin distinction par direction
' message str$(sprite_collision%)
        if sprite_collision%>0            : ' une collision est possible ?
          if sprites(i%,6)>0              : ' le sprite a des tunes ?
if trace%=1 then clear 102
            nt% = sprites(i%,7)          : ' nombre de tunes
            ind% = sprites(i%,6)-1        : ' prendre l'indice dans tunes()
            for t%=1 to nt%              : ' boucle sur les tunes du sprite touché
              xs% = tunes(ind%+t%,1)      : ' c'est l'abscisse du coin en haut à gauche
              ys% = tunes(ind%+t%,2)      : ' c'est l'ordonnée du coin en haut à gauche
              ws = tunes(ind%+t%,3)      : ' c'est la largeur
              hs = tunes(ind%+t%,4)      : ' c'est la hauteur
              xs% = xs% + sprites(i%,4)  : ' l'adresse du tune est relative !
              ys% = ys% + sprites(i%,5)  : ' l'adresse du tune est relative !

              if sprites(n%,6)>0          : ' le sprite mobile a des tunes ?
                ntm% = sprites(n%,7)      : ' nombre de tunes du sprite mobile
                indm% = sprites(n%,6)-1  : ' prendre l'indice dans tunes()
                for tm%=1 to ntm%              : ' boucle sur les tunes du sprite mobileé
                  xsm% = tunes(indm%+tm%,1)    : ' c'est l'abscisse du coin en haut à gauche
                  ysm% = tunes(indm%+tm%,2)    : ' c'est l'ordonnée du coin en haut à gauche
                  wsm = tunes(indm%+tm%,3)      : ' c'est la largeur
                  hsm = tunes(indm%+tm%,4)      : ' c'est la hauteur
                  xsm% = xsm% + sprites(n%,4)  : ' l'adresse du tune est relative !
                  ysm% = ysm% + sprites(n%,5)  : ' l'adresse du tune est relative !
if trace%=1
  item_add 102,str$(t%)+": "+str$(xs%)+","+str$(ys%)+"/"+str$(ws)+","+str$(hs)
  item_add 102,str$(tm%)+": "+str$(xsm%)+","+str$(ysm%)+"/"+str$(wsm)+","+str$(hsm)
  item_add 102,""
end_if
                  if (xs%-1)<=(xsm%+wsm)          : ' bord gauche tune fixe plus à gauche que bord droit tune mobile ?
                    if (xs%+ws)>=(xsm%-1)        : ' bord droit tune fixe plus à droite que bord gauche tune mobile ?
                      if (ysm%+hsm)>=ys%          : ' bord bas tune mobile plus bas que bord haut tune fixe ?
                        if ysm%<=(ys%+hs)        : ' bord haut tune mobile plus haut que bord bas tune fixe ?
                          sprite_collision% = i%  : ' alors collision
                          tune_collision% = t%
                          tune_collision_mobile% = tm%
                          chercher_noms(n%)      : ' chercher les noms des tunes
if trace%=1 then item_add 102,str$(ind%)+"  "+str$(indm%)
                          exit_sub                : ' sortie car on a trouvé une collision
                        end_if                    : ' fin test sur bord haut tune mobile
                      end_if                      : ' fin test sur bord bas tune mobile
                    end_if                        : ' fin test sur bord droit tune fixe
                  end_if                          : ' fin test sur bord gauche tune fixe

                next tm%                        : ' fin boucle sur les tune du mobile
              else                        : ' le sprite mobile n'a pas de tunes !
                  if (xs%-1)<=(x%+w)              : ' bord gauche tune fixe plus à gauche que bord droit sprite mobile ?
                    if (xs%+ws)>=(x%-1)          : ' bord droit tune fixe plus à droite que bord gauche sprite mobile ?
                      if (y%+h)>=ys%              : ' bord bas sprite mobile plus bas que bord haut tune fixe ?
                        if y%<=(ys%+hs)          : ' bord haut sprite mobile plus haut que bord bas tune fixe ?
                          sprite_collision% = i%  : ' alors collision
                          tune_collision% = t%
                          tune_collision_mobile% = 0
                          chercher_noms(n%)      : ' chercher les noms des tunes
if trace%=1 then item_add 102,str$(ind%)+" fixe"
                          exit_sub                : ' sortie car on a trouvé une collision
                        end_if                    : ' fin test sur bord haut tune mobile
                      end_if                      : ' fin test sur bord bas tune mobile
                    end_if                        : ' fin test sur bord droit tune fixe
                  end_if                          : ' fin test sur bord gauche tune fixe
              end_if                          : ' fin sprite mobile a des tunes
             
            next t%                          : ' fin boucle sur les tunes du sprite touché
            sprite_collision% = 0            : ' aucun tune du sprite n'est touché
          else                                : ' le sprite fixe n'a pas de tunes !
            if sprites(n%,6)>0                : ' le sprite mobile a des tunes ?
              ntm% = sprites(n%,7)            : ' nombre de tunes du sprite mobile
              indm% = sprites(n%,6)-1        : ' prendre l'indice dans tunes()
              for tm%=1 to ntm%              : ' boucle sur les tunes du sprite mobileé
                xsm% = tunes(indm%+tm%,1)    : ' c'est l'abscisse du coin en haut à gauche
                ysm% = tunes(indm%+tm%,2)    : ' c'est l'ordonnée du coin en haut à gauche
                wsm = tunes(indm%+tm%,3)      : ' c'est la largeur
                hsm = tunes(indm%+tm%,4)      : ' c'est la hauteur
                xsm% = xsm% + sprites(n%,4)  : ' l'adresse du tune est relative !
                ysm% = ysm% + sprites(n%,5)  : ' l'adresse du tune est relative !
if trace%=1
  item_add 102,"fixe: "+str$(sprites(i%,4))+","+str$(sprites(i%,5))+" / "+str$(sprites(i%,0))+","+str$(sprites(i%,1))
  item_add 102,"tune: "+str$(tm%)+": "+str$(xsm%)+","+str$(ysm%)+" / "+str$(wsm)+","+str$(hsm)
  item_add 102,""
end_if
                if (sprites(i%,4)-1)<=(xsm%+wsm)            : ' bord gauche sprite fixe plus à gauche que bord droit tune mobile ?
  item_add 102,"a"
                  if (sprites(i%,4)+sprites(i%,0))>=(xsm%-1) : ' bord droit sprite fixe plus à droite que bord gauche tune mobile ?
  item_add 102,"b"
                    if (ysm%+hsm)>=sprites(i%,5)            : ' bord bas tune mobile plus bas que bord haut sprite fixe ?
  item_add 102,"c"
                      if ysm%<=(sprites(i%,5)+sprites(i%,1)) : ' bord haut tune mobile plus haut que bord bas sprite fixe ?
  item_add 102,"d"
                        sprite_collision% = i%              : ' alors collision
                        tune_collision% = 0
                        tune_collision_mobile% = tm%
                        chercher_noms(n%)      : ' chercher les noms des tunes
if trace%=1 then item_add 102,str$(indm%)+" mobile"
                        exit_sub                : ' sortie car on a trouvé une collision
                      end_if                    : ' fin test sur bord haut tune mobile
                    end_if                      : ' fin test sur bord bas tune mobile
                  end_if                        : ' fin test sur bord droit tune fixe
                end_if                          : ' fin test sur bord gauche tune fixe
              next tm%                          : ' fin boucle sur les tunes mobile
              sprite_collision% = 0
            else                          : ' sprite mobile n'a pas de tunes !
              chercher_noms(n%)          : ' alors, construire les noms par défaut
            end_if                        : ' fin de test sur les tunes du sprite mobile
            exit_sub                      : ' donc, sortie immédiate car colision globale
          end_if                          : ' fin test si sprite a des tunes
        end_if                            : ' fin collision possible
      end_if                              : ' fin test sprite en dur
    end_if                                : ' fin test sur sprite "autre"
  next i%                                : ' fin boucle sur les sprites
end_sub

sub chercher_noms(mob%)
      sprite_collision_mobile% = mob%    : ' retourner ne numéro du sprite mobile
      sname_collision$ = snames$(sprite_collision%) : ' retourner le nom du sprite touché
      sname_collision_mobile$ = snames$(mob%) : ' retourner le nom du sprite mobile
      if tune_collision%>0              : ' est-ce qu'un tune a été touché ?
        for j%=1 to ntunes%                      : ' boucle de recherche du sprite concerné
          if tunes(j%,0)=sprite_collision%      : ' est-ce le sprite touché ?
            tname_collision$ = tnames$(j%+tune_collision%-1)  : ' prendre le nom du tune
            exit_for                            : ' et sortir
          end_if                                : ' fin de traitement du sprite trouvé
        next j%                        : ' fin boucle sur les tunes
      else
        tname_collision$ = "Sprite entier"
      end_if                            : ' fin traitement du tune touché
      if tname_collision$="" then tname_collision$ = "Tune "+str$(tune_collision%)      : ' nom par défaut
      if tune_collision_mobile%>0      : ' est-ce qu'un tune mobile a touché ?
        for j%=1 to ntunes%                            : ' boucle de recherche du sprite concerné
          if tunes(j%,0)=mob%          : ' est-ce le sprite mobile ?
            tname_collision_mobile$ = tnames$(j%+tune_collision_mobile%-1) : ' prendre le nom du tune
            exit_for                    : ' et sortir
          end_if                        : ' fin de traitement du sprite trouvé
        next j%                        : ' fin boucle sur les tunes
      else
        tname_collision_mobile$ = "Sprite entier"
      end_if                            : ' fin traitement du tune touché
      if tname_collision_mobile$="" then tname_collision_mobile$ = "Tune "+str$(tune_collision_mobile%)    : ' nom par défaut
end_sub
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Jicehel

Jicehel


Nombre de messages : 5947
Age : 52
Localisation : 77500
Date d'inscription : 18/04/2011

Des procédures pour la 2D  - Page 4 Empty
MessageSujet: Re: Des procédures pour la 2D    Des procédures pour la 2D  - Page 4 EmptyJeu 28 Mai 2015 - 22:33

oups, j'avais raté la proc ... Bon, je iens de voir la nouvelle version. Je teste de suite Wink
Revenir en haut Aller en bas
Jicehel

Jicehel


Nombre de messages : 5947
Age : 52
Localisation : 77500
Date d'inscription : 18/04/2011

Des procédures pour la 2D  - Page 4 Empty
MessageSujet: Re: Des procédures pour la 2D    Des procédures pour la 2D  - Page 4 EmptyJeu 28 Mai 2015 - 22:51

Nickel et pas mal l'idée de faire la sauvegarde de l'image lors de la création. Ca permet en effet de pouvoir faire la copie simplement Wink
Revenir en haut Aller en bas
Klaus

Klaus


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

Des procédures pour la 2D  - Page 4 Empty
MessageSujet: Re: Des procédures pour la 2D    Des procédures pour la 2D  - Page 4 EmptyJeu 11 Juin 2015 - 14:53

Voici une version nettement évoluée de mes outils 2D. il y a la correction de quelques bugs, mais surtout la collision est détectée correctement pour un mouvement dans les 4 directions, maintenant sur tous les tunes, que ce soit du sprite mobile ou du sprite fixe rencontré. Et on signale les numéros et les noms des sprites ainsi que des tunes concernés par la collision. En plus, un clic sur un sprite identifie ce dernier par son numéro et son nom. Et si le clic a lieu dans un tune, le numéro du tune et son nom est également affiché. On peut ainsi cliquer sur un des Android. Dans le ventre, il reconnaît le sprite, mais il n'y a pas de tune. Par contre, la tête, les bras et les jambes sont reconnues comme tunes individuels.

Dans le scene2d, 3 sprites Android vont apparaître: à gauche, un sprite fixe, au milieu le sprite Android mobile (piloté par les flèches), et à droite un sprite fixe qui est une copie du sprite à gauche. Il y a aussi un sprite sous forme d'un carré jaune. Il est fixe, mais "pénétrable" et ne génère donc pas de collision.

Voici le code:
Code:
' 2d_utilities.bas

label clic, key, close0

dim selection_sprite_1% : selection_sprite_1% = 1  : ' 0=carré rouge impénétrable
                                                  : ' 1=Android impénétrable
dim selection_sprite_2% : selection_sprite_2% = 2  : ' 0=carré bleu impénétrable
                                                  : ' 1=Android impénétrable

dim sprites(500,7)        : ' jusqu'à 500 sprites
                          : ' ,0)=largeur  ,1)=hauteur
                          : ' ,2)=visible/invisible ,3)=impénétrable
                          : ' ,4)=coordonnée x  ,5)=coordonnée y
                          : ' ,6)=numéro d'objet DLIST contenant les tunes
                          : ' ,6)=transformé en index dans tunes(..,..)
                          : ' ,7)=nombre de tunes
dim ntunes%                : ' nombre de tunes dans tunes(..,..)
dim tunes(3000,4)          : ' jusqu'à 3000 tunes
                          : ' ,0)=sprite  ,1)=coordonnée x  ,2)=coordonnée y
                          : ' ,3)=largeur  ,4)=hauteur
dim tnames$(3000)          : ' noms des tunes
dim snames$(500)          : ' noms des sprites
dim nsprite%              : ' dernier numéro de sprite créé
dim sprite_mobile%        : ' numéro du sprite mobile
dim sprite_trouve%        : ' numéro du sprite trouvé par un clic (ou 0 si non trouvé)
dim tune_trouve%          : ' numéro du tune trouvé par un clic (ou 0 si non trouvé)
dim tune_trouve_nom$      : ' nom du tune trouvé
dim sprite_collision%      : ' numéro du sprite touché par une collision
dim sprite_collision_mobile%  : ' numéro du sprite mobile touché
dim tune_collision%        : ' numéro du tune fixe touché (ou 0 si non trouvé)
dim tune_collision_mobile% : ' numéro du tune mobile touché (ou 0 si non trouvé)
dim tname_collision$      : ' nom du tune fixe touché
dim tname_collision_mobile$ : ' nom du tune mobile touché
dim sname_collision$      : ' nom du sprite fixe touché
dim sname_collision_mobile$ : ' nom du sprite mobile touché
dim scene_2d%              : ' numéro d'objet du scene2d
dim trace% : trace% = 0    : ' mettre 1 pour afficher une trace des calculs
dim images$                : ' nom de dossier temporaire pour copier les images des sprites
dim i%, j%, d%, dx%, dy%, s$, sm$

scene_2d% = 17            : ' juste un exemple
scene2d scene_2d%          : ' créer le scene2d
sprite_target_is scene_2d%    :  ' assurer du bon ciblage
on_click scene_2d%,clic

dlist 101                  : ' pour recevoir la liste des tunes pour sprite 1
if trace%=1 then list 102 : top 102,500 : width 102,1000 : height 102,200

full_space 0
full_space scene_2d%
picture 10 : hide 10 : width 10,200 : height 10,200
image 11
2d_target_is 10

memoriser_images()                  : ' activer la mémorisation des images des sprites

if selection_sprite_1%=0
  color 10,255,0,0
  2d_image_copy 11,0,0,200,200
  creer_sprite("Carré rouge initialement fixe",50,50,11,1)          : ' sprite rouge impénétrable
else
  file_load 10,"Android.bmp"
  2d_image_copy 11,0,0,200,200
  file_load 101,"Android_mask_tuned_list.txt"
  creer_sprite_avec_tunes("Andoid initialement fixe",50,50,11,1,101)  : ' sprite "Android" impénétrable, avec tunes
end_if

if selection_sprite_2%=0
  color 10,0,0,255
  2d_image_copy 11,0,0,200,200      : ' sprite bleu impénétrable
  creer_sprite("Carré bleu initialement fixe",400,120,11,1)
else
  file_load 10,"Android.bmp"
  2d_image_copy 11,0,0,200,200
  file_load 101,"Android_mask_tuned_list.txt"
  creer_sprite_avec_tunes("Android initialement mobile",400,130,11,1,101)  : ' sprite "Android" impénétrable, avec tunes
end_if

color 10,255,255,0
2d_image_copy 11,0,0,200,200      : ' sprite jaune pénétrable
creer_sprite("Carré jaune initialement fixe",280,180,11,0)

copier_sprite("Android initialement fixe copié",1,600,300,11)      : ' copie du sprite 1 (en sprite 4)

on_key_down 0,key
on_close 0,close0

sprite_mobile% = 2                : ' c'est le sprite mobile par défaut

end

' ***** frappe d'une touche au clavier
key:
  d% = key_down_code
  if d%=37 : ' gauche
        dx% = 0 - 1
        dy% = 0
  end_if
  if d%=38 : ' haut
        dx% = 0
        dy% = 0 - 1
  end_if
  if d%=39 : ' droite
        dx% = 1
        dy% = 0
  end_if
  if d%=40 : ' bas
        dx% = 0
        dy% = 1
  end_if
  for i%=1 to 30                        : ' pas de 30 pixels par frappe d'une flèche
    deplacer_sprite(sprite_mobile%,1,dx%,dy%) : ' déplacement relatif
    tester_si_collision(sprite_mobile%,1)    : ' suivi du test de collision
    s$ = ""
    if sprite_collision%>0              : ' une collision a eu lieu ?
      s$ = "collision avec sprite "+str$(sprite_collision%)+"=["+sname_collision$+"]  tune "+str$(tune_collision%)+"=["+tname_collision$
      sm$ = "]  touché par sprite "+str$(sprite_collision_mobile%)+"=["+sname_collision_mobile$+"]  tune "+str$(tune_collision_mobile%)+"=["+tname_collision_mobile$+"]"
      message s$ + sm$
      deplacer_sprite(sprite_mobile%,1,0-dx%,0-dy%)  : ' annuler le déplacement en cas de collision
      exit_for                          : ' et arrêter le déplacement
    end_if                              : ' fin test si collision
  next i%                              : ' fin boucle de déplacement
return

' ***** clic dans la scene2d
clic:
  chercher_sprite_selon_clic()
  if sprite_trouve%>0
    sprite_mobile% = sprite_trouve%    : ' sélectionner le sprite cliqué !
    if tune_trouve%>0
      message "clic sur sprite "+str$(sprite_trouve%)+"="+snames$(sprite_trouve%)+" tune "+str$(tune_trouve%)+"="+tune_trouve_nom$
    else
      message "clic sur sprite "+str$(sprite_trouve%)+"="+snames$(sprite_trouve%)+" sans tune"
    end_if
  else
    message "aucun sprite cliqué"
  end_if
  return
 
' ***** fermeture de la form 0
close0:
  effacer_images()                      : ' effacer éventuellement les images des sprites
  return
 

sub memoriser_images()
  dim_local d$, dold$, f$
  if images$<>"" then exit_sub          : ' mémorisation déjà activé ?
  d$ = dir_current$ + "\Temp_Sprites"    : ' construire dossier temporaire des images des sprites
  if dir_exists(d$)=1                    : ' ce dossier existe ?
    dold$ = dir_current$                : ' mémoriser le dossier actuel
    dir_change d$                        : ' passer dans le dossier des images
    f$ = file_find_first$                : ' chercher le premier fichier
    while f$<>"_"                        : ' tant qu'on trouve des fichiers
      if left$(f$,1)<>"." then file_delete f$  : ' les supprimer
      f$ = file_find_next$              : ' et passer au suivant
    end_while
    file_find_close                      : ' fin de recherche de fichiers
    dir_change dold$                    : ' repositionner dans le dossier par défaut ancien
    dir_remove d$                        : ' et supprimer le dossier des images
  end_if
  dir_make d$                            : ' alors créer ce dossier
  images$ = d$                          : ' et mémoriser le chemin
end_sub

sub effacer_images()
  dim_local old$, f$
  if images$="" then exit_sub            : ' le dossier temporaire n'existe pas ? Rien à faire !
  old$ = dir_current$                    : ' mémoriser l'actuel dossier courant
  dir_change images$                    : ' changer pour le dossier temporaire des images
  f$ = file_find_first$                  : ' prendre le premier nom de fichier de ce dossier
  while f$<>"_"                          : ' tout est traité ?
    if left$(f$,1)<>"." then file_delete f$  : ' détruire si c'est un vrai fichier
    f$ = file_find_next$                : ' passer au fichier suivant
  end_while                              : ' fin de boucle de traitement
  file_find_close                        : ' clore la fonction de recherche
  dir_change old$                        : ' remettre l'ancien dossier courant
  rmdir images$                          : ' supprimer le dossier des images
  images$ = ""                          : ' et "oublier" ce dossier
end_sub

sub creer_sprite(nam$,x%,y%,img%,dur%)
  nsprite% = nsprite% + 1        : ' passer au numéro de sprite suivant
  sprite nsprite%                : ' créer le sprite
  snames$(nsprite%)  = nam$    : ' memoriser son nom
  sprites(nsprite%,0) = 200      : ' mémoriser sa largeur
  sprites(nsprite%,1) = 200      : ' et sa hauteur
  sprites(nsprite%,2) = 1        : ' marquer "visible"
  sprites(nsprite%,3) = dur%    : ' marquer 0="pénétrable" ou 1="impénétrable"
  sprites(nsprite%,4) = x%      : ' position horizontale du sprite
  sprites(nsprite%,5) = y%      : ' position verticale du sprite
  sprites(nsprite%,6) = 0        : ' pas de tunes
  sprites(nsprite%,7) = 0        : ' pas de tunes
  if img%>0                      : ' une image est fournie ?
    sprite_image_load nsprite%,img%  : ' copier une image dans le sprite
    if images$<>"" then file_save img%,images$+"\sprite_"+str$(nsprite%)+".bmp" : ' et la sauver
  end_if                        : ' fin test image fournie
  sprite_position nsprite%,x%,y% : ' positionner le sprite à l'endroit voulu
  display
end_sub

sub creer_sprite_avec_tunes(nam$,x%,y%,img%,dur%,dl%)
  dim_local t%, s$, p%, n%
  if object_exists(dl%)=0 then exit_sub  : ' impossible si l'objet n'existe pas
  if object_type(dl%)<>26 then exit_sub  : ' impossible si l'objet n'est pas une DLIST
  if count(dl%)=0 then exit_sub          : ' impossible si la liste des tunes est vide
  nsprite% = nsprite% + 1          : ' passer au numéro de sprite suivant
  sprite nsprite%                  : ' créer le sprite
  snames$(nsprite%)  = nam$      : ' memoriser son nom
  sprites(nsprite%,0) = 200        : ' mémoriser sa largeur
  sprites(nsprite%,1) = 200        : ' et sa hauteur
  sprites(nsprite%,2) = 1          : ' marquer "visible"
  sprites(nsprite%,3) = dur%      : ' marquer 0="pénétrable" ou 1="impénétrable"
  sprites(nsprite%,4) = x%        : ' position horizontale du sprite
  sprites(nsprite%,5) = y%        : ' position verticale du sprite
  sprites(nsprite%,6) = ntunes%+1  : ' indice dans la liste des tunes
  sprites(nsprite%,7) = count(dl%) : ' nombre de tunes
  for t%=1 to count(dl%)          : ' boucle sur les lignes des tunes
    ntunes% = ntunes% + 1          : ' compter le nouveau tune
    tunes(ntunes%,0) = nsprite%    : ' mémoriser le numéro du sprite pour ce tune
    s$ = item_read$(dl%,t%)+","    : ' lire un eligne de tunes
    p% = instr(s$,",")
    n% = val(left$(s$,p%-1))      : ' garder le numéro du tune
    s$ = mid$(s$,p%+1,100)        : ' dépasser le numéro de tune
    p% = instr(s$,",")
    tunes(ntunes%,1) = val(left$(s$,p%-1)) : ' mémoriser coordonnée x du tune
    s$ = mid$(s$,p%+1,100)        : ' dépasser la coordonnée x du tune
    p% = instr(s$,",")
    tunes(ntunes%,2) = val(left$(s$,p%-1)) : ' mémoriser coordonnée y du tune
    s$ = mid$(s$,p%+1,100)        : ' dépasser la coordonnée y du tune
    p% = instr(s$,",")
    tunes(ntunes%,3) = val(left$(s$,p%-1)) - tunes(ntunes%,1)+1 : ' mémoriser largeur du tune
    s$ = mid$(s$,p%+1,100)        : ' dépasser la largeur du tune
    p% = instr(s$,",")
    tunes(ntunes%,4) = val(left$(s$,p%-1)) - tunes(ntunes%,2)+1 : ' mémoriser hauteur du tune
    s$ = mid$(s$,p%+1,100)        : ' dépasser la hauteur du tune
    if s$="" then s$ = "Tune "+str$(n%)
    tnames$(ntunes%) = s$
  next t%                          : ' fin boucle sur les lignes des tunes
  if img%>0                        : ' une image est fournie ?
    sprite_image_load nsprite%,img%  : ' copier une image dans le sprite
    if images$<>"" then file_save img%,images$+"\sprite_"+str$(nsprite%)+".bmp" : ' et la sauver
  end_if                          : ' fin test image fournie
  sprite_position nsprite%,x%,y%  : ' positionner le sprite à l'endroit voulu

  display
end_sub

sub copier_sprite(nam$,n%,x%,y%,img%)
  dim_local i%, nt%
  nsprite% = nsprite% + 1                : ' passer au numéro de sprite suivant
  sprite nsprite%                        : ' créer le sprite
  snames$(nsprite%)  = nam$            : ' memoriser son nom
  sprites(nsprite%,0) = sprites(n%,0)    : ' mémoriser sa largeur
  sprites(nsprite%,1) = sprites(n%,1)    : ' et sa hauteur
  sprites(nsprite%,2) = sprites(n%,2)    : ' marquer "visible"
  sprites(nsprite%,3) = sprites(n%,3)    : ' marquer 0="pénétrable" ou 1="impénétrable"
  sprites(nsprite%,4) = x%              : ' position horizontale du sprite
  if sprites(n%,3)=0 then sprites(nsprite%,4) = sprites(nsprite%,4) + 4000 : ' traitement "invisible"
  sprites(nsprite%,5) = y%              : ' position verticale du sprite
  if sprites(n%,6)=0                    : ' le sprite source n'a pas de tunes ?
    sprites(nsprite%,6) = 0              : ' pas de tunes
    sprites(nsprite%,7) = 0              : ' pas de tunes
  else                                  : ' le sprite source a des tunes
    nt% = sprites(n%,6)                  : ' alors mémoriser l'indice dans la liste des tunes
    sprites(nsprite%,6) = ntunes%+1      : ' indice dans la liste des tunes
    sprites(nsprite%,7) = sprites(n%,7)  : ' nombre de tunes
    for i%=1 to sprites(n%,0)            : ' boucle sur tous les tunes du sprite source
      ntunes% = ntunes% + 1              : ' compter le nouveau tune
      tunes(ntunes%,0) = nsprite%        : ' mémoriser le numéro du sprite pour ce tune
      tunes(ntunes%,1) = tunes(nt%+i%-1,1) : ' et copier les autres valeurs
      tunes(ntunes%,2) = tunes(nt%+i%-1,2)
      tunes(ntunes%,3) = tunes(nt%+i%-1,3)
      tunes(ntunes%,4) = tunes(nt%+i%-1,4)
      tnames$(ntunes%) = tnames$(nt%+i%-1) : ' copier le nom du tune
    next i%                              : ' fin boucle de copie des tunes
  end_if                                : ' fin traitement des tunes

  if images$<>""                        : ' les images sont mémorisées ?
    if file_exists(images$+"\sprite_"+str$(n%)+".bmp")=1
      file_load img%,images$+"\sprite_"+str$(n%)+".bmp"  : ' charger l'image dans objet IMG%
      sprite_image_load nsprite%,img%    : ' charger l'image dans le nouveau sprite
      file_save img%,images$+"\sprite_"+str$(nsprite%)+".bmp" : ' et la sauver
    end_if                              : ' fin test "image existante"
  end_if                                : ' fin test images mémorisées

  sprite_position nsprite%,sprites(nsprite%,4),sprites(nsprite%,5) : ' positionner le sprite à l'endroit voulu

  display
end_sub

sub deplacer_sprite(n%,rel%,x%,y%)
  if (n%<1) or (n%>nsprite%) then exit_sub  : ' sécuriser
  if rel%=1                              : ' positionnement relatif ?
    sprites(n%,4) = sprites(n%,4) + x%
    sprites(n%,5) = sprites(n%,5) + y%
  else                                  : ' positionnement absolu !
    sprites(n%,4) = x%
    sprites(n%,5) = y%
  end_if
  if sprites(nsprite%,2)=1              : ' sprite visible ?
    sprite_position n%,sprites(n%,4),sprites(n%,5) : ' positionner le sprite visible à l'endroit voulu
  else                                  : ' sprite caché !
    sprite_position n%,sprites(n%,4)+4000,sprites(n%,5) : ' positionner le sprite caché à l'endroit voulu
  end_if
end_sub

sub redimensionner_sprite_x(n%,c)
  if (n%<1) or (n%>nsprite%) then exit_sub  : ' sécuriser
  sprite_x_scale n%,c              : ' ajuster la largeur
  sprites(n%,0) = sprites(n%,0)*c  : ' et mémoriser
end_sub

sub redimensionner_sprite_y(n%,c)
  if (n%<1) or (n%>nsprite%) then exit_sub  : ' sécuriser
  sprite_y_scale n%,c              : ' ajuster la hauteur
  sprites(n%,1) = sprites(n%,1)*c  : ' et mémoriser
end_sub

sub redimensionner_sprite_xy(n%,cx,cy)
  if (n%<1) or (n%>nsprite%) then exit_sub  : ' sécuriser
  sprite_scale n%,cx,cy              : ' ajuster largeur et hauteur
  sprites(n%,0) = sprites(n%,0)*cx  : ' et mémoriser la largeur
  sprites(n%,1) = sprites(n%,1)*cy  : ' et mémoriser la hauteur
end_sub

sub cacher_sprite(n%)
  if (n%<1) or (n%>nsprite%) then exit_sub  : ' sécuriser
  if sprites(n%,2)=1                        : ' est-ce que le sprite est visible ?
    sprite_x_position n%,sprite_x_position(n%) + 4000    : ' déplacer hors de la vue
    sprites(n%,2) = 0                        : ' signaler "invisible"
  end_if
end_sub

sub montrer_sprite(n%)
  if (n%<1) or (n%>nsprite%) then exit_sub  : ' sécuriser
  if sprites(n%,2)=0                        : ' est-ce que le sprite est invisible ?
    sprite_x_position n%,sprite_x_position(n%) - 4000    : ' replacer dans la partie visible
    sprites(n%,2) = 1                        : ' signaler "visible"
  end_if
end_sub

sub chercher_sprite_selon_clic()
  dim_local i%, x%, y%, xs%, ys%, nt%, t%, ind%, ws, hs
  sprite_trouve% = 0                  : ' supposer "sprite non trouvé"
  tune_trouve% = 0                    : ' supposer "tune non trouvé"
  tune_trouve_nom$ = ""                : ' donc, pas de nom...
  if number_click<>scene_2d% then exit : ' on n'a pas cliqué dans le scene2d ?
  if nsprite%=0 then exit_sub          : ' pas de sprites créés ?
  x% = mouse_x_left_down(scene_2d%)    : ' mémoriser la position horizontale du clic
  y% = mouse_y_left_down(scene_2d%)    : ' mémoriser la position verticale du clic
  for i%=nsprite% to 1 step -1        : ' boucle sur tous les sprites
    xs% = sprite_x_position(i%)        : ' mémoriser la position horizontale du sprite i%
    ys% = sprite_y_position(i%)        : ' mémoriser la position verticale dusprite i%
    if (xs%<x%)                        : ' le bord gauche du sprite est plus à gauche que l'abscisse du clic ?
      if (ys%<y%)                      : ' le bord haut du sprite est plus haute que l'ordonnée du sprite ?
        if xs%+sprites(i%,0)>=x%      : ' le bord droit du sprite est plus à droite que l'abscisse du clic ?
          if ys%+sprites(i%,1)>=y%    : ' le bord bas du sprite est plus en bas que l'ordonnée du clic ?
              sprite_trouve% = i%      : ' alors, on a trouvé le sprite
              if sprites(i%,7)>0      : ' le sprigte cliqué a des tunes ?
                nt% = sprites(i%,7)    : ' prendre le nombre de tunes
                ind% = sprites(i%,6)-1 : ' prendre l'indice dans tunes()
                for t%=1 to nt%        : ' boucle sur les tunes du sprite cliqué
                  xs% = tunes(ind%+t%,1)          : ' c'est l'abscisse du coin en haut à gauche
                  ys% = tunes(ind%+t%,2)          : ' c'est l'ordonnée du coin en haut à gauche
                  ws = tunes(ind%+t%,3)            : ' c'est la largeur
                  hs = tunes(ind%+t%,4)            : ' c'est la hauteur
                  xs% = xs% + sprites(i%,4)        : ' l'adresse du tune est relative !
                  ys% = ys% + sprites(i%,5)        : ' l'adresse du tune est relative !
                  if (x%>=xs%) and (x%<(xs%+ws))  : ' horizontalement cliqué dans le tune ?
                    if (y%>=ys%) and (y%<(ys%+hs)) : ' vertictalement cliqué dans le tune ?
                      tune_trouve% = t%            : ' retourner le numéro du tune cliqué
                      tune_trouve_nom$ = tnames$(ind%+t%) : ' et son nom
                    end_if
                  end_if
                next t%                : ' find de boucle sur les tunes
              end_if                  : ' in du traitement des tunes
              exit_sub                : ' et on sort
          end_if                      : ' fin test sur le bord bas du sprite
        end_if                        : ' fin test sur le bord droit du sprite
      end_if                          : ' fin test sur le bord haut du sprite
    end_if                            : ' fin test sur le bord gauche du sprite
  next i%                              : ' fin boucle sur les sprites
end_sub

sub tester_si_collision(n%,dir%)
  dim_local i%, x%, y%, w%, h%, xs%, ys%, w, h, ws, hs, t%, nt%,
  dim_local s$, s1$, ss$, ss1$, p%, p2%, pp%, pp2%,
  dim_local ntm%, tm%, xsm%, ysm%, wsm, hsm, ind%, indm%
  sprite_collision%        = 0        : ' supposer "pas de collision"
  sprite_collision_mobile% = 0
  tune_collision%          = 0
  tune_collision_mobile%  = 0
  if nsprite%<2 then exit_sub          : ' pas de collisions possibles ?
  if sprites(n%,2)=0 then exit_sub    : ' le sprite mobile est "invisible" ?
  if sprites(n%,3)=0 then exit_sub    : ' le sprite mobile est "pénétrable" ?
  x% = sprites(n%,4)                  : ' position horizontale du sprite en movement
  y% = sprites(n%,5)                  : ' position verticale du sprite en movement
  w = sprites(n%,0)                    : ' largeur du sprite en movement
  h = sprites(n%,1)                    : ' hauteur du sprite en movement
  for i%=nsprite% to 1 step -1        : ' boucle sur tous les sprites
    if i%<>n%                          : ' on est sur un sprite autre que celui qui bouge ?
      if sprites(i%,3)<>0              : ' sprite en dur ?
        xs% = sprites(i%,4)            : ' position horizontale du sprite à tester
        ys% = sprites(i%,5)            : ' position verticale du sprite à tester
        ws = sprites(i%,0)            : ' largeur du sprite à tester
        hs = sprites(i%,1)            : ' hauteur du sprite à tester
        select dir%                    : ' distinction par direction du mouvement
          case 1: ' gauche
            if (x%-1)<=(xs%+ws)      : ' bord droit fixe peut toucher bord gauche mobile ?
              if (x%+w)>=(xs%-1)      : ' bord droit mobile plus à droite que bord gauche fixe ?
                if (ys%+hs)>=y%      : ' bord bas mobile plus bas que bord haut fixe ?
                  if ys%<=(y%+h)      : ' bord haut mobile plus que bord bas fixe ?
                    sprite_collision% = i%  : ' alors collision
' message "collision à gauche avec "+str$(sprite_collision%)
                  end_if
                end_if
              end_if
            end_if
          case 2: ' haut
            if (y%-1)<=(ys%+hs)      : ' bord bas fixe peut toucher bord haut mobile ?
              if (y%+h)>=(ys%-1)      : ' bord bas mobile plus bas que bord haut fixe ?
                if (xs%+hs)>=x%      : ' bord droit mobile plus à gauche que bord gauche fixe ?
                  if xs%<=(x%+h)      : ' bord gauche mobile plus à gauche que bord droit fixe ?
                    sprite_collision% = i%  : ' alors collision
                  end_if
                end_if
              end_if
            end_if
          case 3: ' droite    : ' à adapter
            if (x%+w)>=(xs%-1)        : ' bord gauche fixe peut toucher bord droit mobile ?
              if x%<=(xs%+ws)        : ' bord gauche mobile plus à gauche que bord droit fixe ?
                if (y%+h)>=(ys%-1)    : ' bord bas mobile plus bas que bord haut fixe ?
                  if ys%<=(y%+h)      : ' bord haut mobile plus bas que bord bas fixe ?
                    sprite_collision% = i%  : ' alors collision
                  end_if
                end_if
              end_if
            end_if
          case 4: ' bas        : ' à adapter
            if (y%+h)=(ys%-1)        : ' bord haut fixe peut toucher bord bas mobile ?
              if y%>=(ys%+hs)        : ' bord haut mobile plus haut que bord bas fixe ?
                if (xs%+hs)>=x%      : ' bord droit mobile plus à gauche que bord gauche fixe ?
                  if xs%<=(x%+h)      : ' bord gauche mobile plus à gauche que bord droit fixe ?
                    sprite_collision% = i%  : ' alors collision
                  end_if
                end_if
              end_if
            end_if
        end_select                    : ' fin distinction par direction
' message str$(sprite_collision%)

        if sprite_collision%>0            : ' une collision est possible ?
if trace%=1 then clear 102
          if sprites(i%,6)>0              : ' le sprite fixe a des tunes ?
            nt% = sprites(i%,7)          : ' nombre de tunes
            ind% = sprites(i%,6)-1        : ' prendre l'indice dans tunes()
            for t%=1 to nt%              : ' boucle sur les tunes du sprite touché
              xs% = tunes(ind%+t%,1)      : ' c'est l'abscisse du coin en haut à gauche
              ys% = tunes(ind%+t%,2)      : ' c'est l'ordonnée du coin en haut à gauche
              ws = tunes(ind%+t%,3)      : ' c'est la largeur
              hs = tunes(ind%+t%,4)      : ' c'est la hauteur
              xs% = xs% + sprites(i%,4)  : ' l'adresse du tune est relative !
              ys% = ys% + sprites(i%,5)  : ' l'adresse du tune est relative !

              if sprites(n%,6)>0          : ' le sprite mobile a des tunes ?
                ntm% = sprites(n%,7)      : ' nombre de tunes du sprite mobile
                indm% = sprites(n%,6)-1  : ' prendre l'indice dans tunes()
                for tm%=1 to ntm%              : ' boucle sur les tunes du sprite mobileé
                  xsm% = tunes(indm%+tm%,1)    : ' c'est l'abscisse du coin en haut à gauche
                  ysm% = tunes(indm%+tm%,2)    : ' c'est l'ordonnée du coin en haut à gauche
                  wsm = tunes(indm%+tm%,3)      : ' c'est la largeur
                  hsm = tunes(indm%+tm%,4)      : ' c'est la hauteur
                  xsm% = xsm% + sprites(n%,4)  : ' l'adresse du tune est relative !
                  ysm% = ysm% + sprites(n%,5)  : ' l'adresse du tune est relative !
if trace%=1
  item_add 102,"Fixe:  tune "+str$(t%)+": "+str$(xs%)+","+str$(ys%)+"/"+str$(ws)+","+str$(hs)
  item_add 102,"Mobile: tune "+str$(tm%)+": "+str$(xsm%)+","+str$(ysm%)+"/"+str$(wsm)+","+str$(hsm)
  item_add 102,""
end_if
                  if (xs%-1)<=(xsm%+wsm)          : ' bord gauche tune fixe plus à gauche que bord droit tune mobile ?
                    if (xs%+ws)>=(xsm%-1)        : ' bord droit tune fixe plus à droite que bord gauche tune mobile ?
                      if (ysm%+hsm)>=ys%          : ' bord bas tune mobile plus bas que bord haut tune fixe ?
                        if ysm%<=(ys%+hs)        : ' bord haut tune mobile plus haut que bord bas tune fixe ?
                          sprite_collision% = i%  : ' alors collision
                          tune_collision% = t%
                          tune_collision_mobile% = tm%
                          chercher_noms(n%)      : ' chercher les noms des tunes
if trace%=1 then item_add 102,str$(ind%)+"  "+str$(indm%)
                          exit_sub                : ' sortie car on a trouvé une collision
                        end_if                    : ' fin test sur bord haut tune mobile
                      end_if                      : ' fin test sur bord bas tune mobile
                    end_if                        : ' fin test sur bord droit tune fixe
                  end_if                          : ' fin test sur bord gauche tune fixe

                next tm%                          : ' fin boucle sur les tune du mobile
              else                                : ' le sprite mobile n'a pas de tunes !
                  if (xs%-1)<=(x%+w)              : ' bord gauche tune fixe plus à gauche que bord droit sprite mobile ?
                    if (xs%+ws)>=(x%-1)          : ' bord droit tune fixe plus à droite que bord gauche sprite mobile ?
                      if (y%+h)>=ys%              : ' bord bas sprite mobile plus bas que bord haut tune fixe ?
                        if y%<=(ys%+hs)          : ' bord haut sprite mobile plus haut que bord bas tune fixe ?
                          sprite_collision% = i%  : ' alors collision
                          tune_collision% = t%
                          tune_collision_mobile% = 0
                          chercher_noms(n%)      : ' chercher les noms des tunes
if trace%=1 then item_add 102,str$(ind%)+" fixe"
                          exit_sub                : ' sortie car on a trouvé une collision
                        end_if                    : ' fin test sur bord haut tune mobile
                      end_if                      : ' fin test sur bord bas tune mobile
                    end_if                        : ' fin test sur bord droit tune fixe
                  end_if                          : ' fin test sur bord gauche tune fixe
              end_if                              : ' fin sprite mobile a des tunes
             
            next t%                              : ' fin boucle sur les tunes du sprite touché
            sprite_collision% = 0                : ' aucun tune du sprite n'est touché
          else                                    : ' le sprite fixe n'a pas de tunes !
            if sprites(n%,6)>0                    : ' le sprite mobile a des tunes ?
              ntm% = sprites(n%,7)                : ' nombre de tunes du sprite mobile
              indm% = sprites(n%,6)-1            : ' prendre l'indice dans tunes()
              for tm%=1 to ntm%                  : ' boucle sur les tunes du sprite mobileé
                xsm% = tunes(indm%+tm%,1)        : ' c'est l'abscisse du coin en haut à gauche
                ysm% = tunes(indm%+tm%,2)        : ' c'est l'ordonnée du coin en haut à gauche
                wsm = tunes(indm%+tm%,3)          : ' c'est la largeur
                hsm = tunes(indm%+tm%,4)          : ' c'est la hauteur
                xsm% = xsm% + sprites(n%,4)      : ' l'adresse du tune est relative !
                ysm% = ysm% + sprites(n%,5)      : ' l'adresse du tune est relative !
if trace%=1
  item_add 102,"fixe: "+str$(sprites(i%,4))+","+str$(sprites(i%,5))+" / "+str$(sprites(i%,0))+","+str$(sprites(i%,1))
  item_add 102,"tune: "+str$(tm%)+": "+str$(xsm%)+","+str$(ysm%)+" / "+str$(wsm)+","+str$(hsm)
  item_add 102,""
end_if
                if (sprites(i%,4)-1)<=(xsm%+wsm)            : ' bord gauche sprite fixe plus à gauche que bord droit tune mobile ?
  item_add 102,"a"
                  if (sprites(i%,4)+sprites(i%,0))>=(xsm%-1) : ' bord droit sprite fixe plus à droite que bord gauche tune mobile ?
  item_add 102,"b"
                    if (ysm%+hsm)>=sprites(i%,5)            : ' bord bas tune mobile plus bas que bord haut sprite fixe ?
  item_add 102,"c"
                      if ysm%<=(sprites(i%,5)+sprites(i%,1)) : ' bord haut tune mobile plus haut que bord bas sprite fixe ?
  item_add 102,"d"
                        sprite_collision% = i%              : ' alors collision
                        tune_collision% = 0
                        tune_collision_mobile% = tm%
                        chercher_noms(n%)        : ' chercher les noms des tunes
if trace%=1 then item_add 102,str$(indm%)+" mobile"
                        exit_sub                  : ' sortie car on a trouvé une collision
                      end_if                      : ' fin test sur bord haut tune mobile
                    end_if                        : ' fin test sur bord bas tune mobile
                  end_if                          : ' fin test sur bord droit tune fixe
                end_if                            : ' fin test sur bord gauche tune fixe
              next tm%                            : ' fin boucle sur les tunes mobile
              sprite_collision% = 0
            else                          : ' sprite mobile n'a pas de tunes !
              chercher_noms(n%)          : ' alors, construire les noms par défaut
            end_if                        : ' fin de test sur les tunes du sprite mobile
            exit_sub                      : ' donc, sortie immédiate car colision globale
          end_if                          : ' fin test si sprite a des tunes
        end_if                            : ' fin collision possible
      end_if                              : ' fin test sprite en dur
    end_if                                : ' fin test sur sprite "autre"
  next i%                                : ' fin boucle sur les sprites
end_sub

sub chercher_noms(mob%)
      sprite_collision_mobile% = mob%    : ' retourner ne numéro du sprite mobile
      sname_collision$ = snames$(sprite_collision%) : ' retourner le nom du sprite touché
      sname_collision_mobile$ = snames$(mob%) : ' retourner le nom du sprite mobile
      if tune_collision%>0              : ' est-ce qu'un tune a été touché ?
        for j%=1 to ntunes%                      : ' boucle de recherche du sprite concerné
          if tunes(j%,0)=sprite_collision%      : ' est-ce le sprite touché ?
            tname_collision$ = tnames$(j%+tune_collision%-1)  : ' prendre le nom du tune
            exit_for                            : ' et sortir
          end_if                                : ' fin de traitement du sprite trouvé
        next j%                        : ' fin boucle sur les tunes
      else
        tname_collision$ = "Sprite entier"
      end_if                            : ' fin traitement du tune touché
      if tname_collision$="" then tname_collision$ = "Tune "+str$(tune_collision%)      : ' nom par défaut
      if tune_collision_mobile%>0      : ' est-ce qu'un tune mobile a touché ?
        for j%=1 to ntunes%                            : ' boucle de recherche du sprite concerné
          if tunes(j%,0)=mob%          : ' est-ce le sprite mobile ?
            tname_collision_mobile$ = tnames$(j%+tune_collision_mobile%-1) : ' prendre le nom du tune
            exit_for                    : ' et sortir
          end_if                        : ' fin de traitement du sprite trouvé
        next j%                        : ' fin boucle sur les tunes
      else
        tname_collision_mobile$ = "Sprite entier"
      end_if                            : ' fin traitement du tune touché
      if tname_collision_mobile$="" then tname_collision_mobile$ = "Tune "+str$(tune_collision_mobile%)    : ' nom par défaut
end_sub

Essayez - c'est spectaculaire !

EDIT

Et le code ci-dessus "sélectionne" maintenant le sprite cliqué pour le rendre mobile pour les prochaines frappes des flèches, même si ce sprite était fixe au départ !
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Jicehel

Jicehel


Nombre de messages : 5947
Age : 52
Localisation : 77500
Date d'inscription : 18/04/2011

Des procédures pour la 2D  - Page 4 Empty
MessageSujet: Re: Des procédures pour la 2D    Des procédures pour la 2D  - Page 4 EmptyJeu 11 Juin 2015 - 16:50

Je teste ça ce soir et en fait, je mets en standby l'article que j'avais prévu sur les collision et j'en fais un à la place juste sur tes fonctionnalités de detection de collisions (c'est l'orientation de l'article) pour le volet 2 des détection de collision. Ce sera plus léger.
Si j'ai le courage et le temps je mettrais l'autre en 3. Par contre tu pourras relire l'article quand je l'aurais écrit pour vérifier que je ne dis pas de bétises par rapport à tes fonctions ? L'article utilisera toutes les fonctionnalités de ton programme mais n'appronfondira que celles relatives aux collisions. Si tu veux en faire un sur l'utilisation des sprites en règle général, ça me semblerait être une bonne idée, mais je ne veux pas te donner du travail en plus si tu n'en a pas envie. Tu es déjà sans doute le plus productif d'entre nous...
Revenir en haut Aller en bas
Klaus

Klaus


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

Des procédures pour la 2D  - Page 4 Empty
MessageSujet: Re: Des procédures pour la 2D    Des procédures pour la 2D  - Page 4 EmptyJeu 11 Juin 2015 - 17:06

Je relirai ton article avec plaisir, Jicehel. Pour ce qui est de faire un article sur les sprites, je ne suis peut-être pas le mieux placé. Je m'en sers dans mon jeu "Eclater les billes", mais c'est à peu pris tout. Et je commence juste à appréhender les possibilités de ces objets. Enfin, on verra... Pour l'heure, j'ai fini les ajustements dans la gestion du FTP, avec la gestion paramétrable du cache. C'était complexe à diagnostiquer, mais finalement simple à corriger. On s'amuse, comme tu vois...
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Jicehel

Jicehel


Nombre de messages : 5947
Age : 52
Localisation : 77500
Date d'inscription : 18/04/2011

Des procédures pour la 2D  - Page 4 Empty
MessageSujet: Re: Des procédures pour la 2D    Des procédures pour la 2D  - Page 4 EmptyJeu 11 Juin 2015 - 18:12

Remarques mettre à jour "eclater les bulles" avec la détection de collision sphérique et les procédure de gestion des sprites que tu as écrit, ça pourrait être sympa, cela dit, en passant Wink

Ce jeu était excellent, avec les nouvelles fonctions, et peut être aussi une petite amélioration graphique en ajoutant une tache blanche et une ombre avec un cercle légèrement décalé plus sombre sur les bulles pour donner une sensation de 3D, il n'en sera que meilleur... mais bon encore faut-il qu'il te reste encore un peu de temps pour le faire..
Revenir en haut Aller en bas
Jean Claude

Jean Claude


Nombre de messages : 5950
Age : 70
Localisation : 83 Var
Date d'inscription : 07/05/2009

Des procédures pour la 2D  - Page 4 Empty
MessageSujet: Re: Des procédures pour la 2D    Des procédures pour la 2D  - Page 4 EmptyJeu 11 Juin 2015 - 18:33

@Klaus,

J'ai testé: cheers
Ça marche bien et on a bien le numéro de tune de collision pour chaque sprite. (je veux dire par quel coté il y a collision)

Je vais inspecter tout ça, car les choses ont beaucoup changées depuis les premières SUB(s) du début de ce post.

Je pense qu'il y a de quoi faire un super jeu en 2D.

A+
Revenir en haut Aller en bas
Klaus

Klaus


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

Des procédures pour la 2D  - Page 4 Empty
MessageSujet: Re: Des procédures pour la 2D    Des procédures pour la 2D  - Page 4 EmptyJeu 11 Juin 2015 - 18:38

Et même en cliquant sur un bras, une jambe etc, on sait sur quel tune on clique !
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Jicehel

Jicehel


Nombre de messages : 5947
Age : 52
Localisation : 77500
Date d'inscription : 18/04/2011

Des procédures pour la 2D  - Page 4 Empty
MessageSujet: Re: Des procédures pour la 2D    Des procédures pour la 2D  - Page 4 EmptyJeu 11 Juin 2015 - 22:38

Pas mal du tout, ça donne un code principal très lisible
Revenir en haut Aller en bas
Klaus

Klaus


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

Des procédures pour la 2D  - Page 4 Empty
MessageSujet: Re: Des procédures pour la 2D    Des procédures pour la 2D  - Page 4 EmptyJeu 11 Juin 2015 - 22:45

Merci ! Et j'ai fait un gros effort pour la documentation sous forme de commentaires...
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Klaus

Klaus


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

Des procédures pour la 2D  - Page 4 Empty
MessageSujet: Re: Des procédures pour la 2D    Des procédures pour la 2D  - Page 4 EmptyVen 12 Juin 2015 - 11:16

Voici une version de mes procédures de collision, avec la correction de quelques petites anomalies:
Code:
' 2d_utilities.bas

label clic, key, close0

dim selection_sprite_1% : selection_sprite_1% = 1  : ' 0=carré rouge impénétrable
                                                   : ' 1=Android impénétrable
dim selection_sprite_2% : selection_sprite_2% = 2  : ' 0=carré bleu impénétrable
                                                   : ' 1=Android impénétrable

dim sprites(500,7)         : ' jusqu'à 500 sprites
                           : ' ,0)=largeur  ,1)=hauteur
                           : ' ,2)=visible/invisible ,3)=impénétrable
                           : ' ,4)=coordonnée x  ,5)=coordonnée y
                           : ' ,6)=numéro d'objet DLIST contenant les tunes
                           : ' ,6)=transformé en index dans tunes(..,..)
                           : ' ,7)=nombre de tunes
dim ntunes%                : ' nombre de tunes dans tunes(..,..)
dim tunes(3000,4)          : ' jusqu'à 3000 tunes
                           : ' ,0)=sprite  ,1)=coordonnée x  ,2)=coordonnée y
                           : ' ,3)=largeur   ,4)=hauteur
dim tnames$(3000)          : ' noms des tunes
dim snames$(500)           : ' noms des sprites
dim nsprite%               : ' dernier numéro de sprite créé
dim sprite_mobile%         : ' numéro du sprite mobile
dim sprite_trouve%         : ' numéro du sprite trouvé par un clic (ou 0 si non trouvé)
dim tune_trouve%           : ' numéro du tune trouvé par un clic (ou 0 si non trouvé)
dim tune_trouve_nom$       : ' nom du tune trouvé
dim sprite_collision%      : ' numéro du sprite touché par une collision
dim sprite_collision_mobile%   : ' numéro du sprite mobile touché
dim tune_collision%        : ' numéro du tune fixe touché (ou 0 si non trouvé)
dim tune_collision_mobile% : ' numéro du tune mobile touché (ou 0 si non trouvé)
dim tname_collision$       : ' nom du tune fixe touché
dim tname_collision_mobile$ : ' nom du tune mobile touché
dim sname_collision$       : ' nom du sprite fixe touché
dim sname_collision_mobile$ : ' nom du sprite mobile touché
dim scene_2d%              : ' numéro d'objet du scene2d
dim trace% : trace% = 0    : ' mettre 1 pour afficher une trace des calculs
dim images$                : ' nom de dossier temporaire pour copier les images des sprites
dim i%, j%, d%, dx%, dy%, s$, sm$, direct%

scene_2d% = 17             : ' juste un exemple
scene2d scene_2d%          : ' créer le scene2d
sprite_target_is scene_2d%    :  ' assurer du bon ciblage
on_click scene_2d%,clic

dlist 101                  : ' pour recevoir la liste des tunes pour sprite 1
if trace%=1 then list 102 : top 102,500 : width 102,1000 : height 102,200

full_space 0
full_space scene_2d%
picture 10 : hide 10 : width 10,200 : height 10,200
image 11
2d_target_is 10

memoriser_images()                  : ' activer la mémorisation des images des sprites

if selection_sprite_1%=0
  color 10,255,0,0
  2d_image_copy 11,0,0,200,200
  creer_sprite("Carré rouge initialement fixe",50,50,11,1)          : ' sprite rouge impénétrable
else
  file_load 10,"Android.bmp"
  2d_image_copy 11,0,0,200,200
  file_load 101,"Android_mask_tuned_list.txt"
  creer_sprite_avec_tunes("Andoid initialement fixe",50,50,11,1,101)  : ' sprite "Android" impénétrable, avec tunes
end_if

if selection_sprite_2%=0
  color 10,0,0,255
  2d_image_copy 11,0,0,200,200      : ' sprite bleu impénétrable
  creer_sprite("Carré bleu initialement fixe",400,120,11,1)
else
  file_load 10,"Android.bmp"
  2d_image_copy 11,0,0,200,200
  file_load 101,"Android_mask_tuned_list.txt"
  creer_sprite_avec_tunes("Android initialement mobile",400,130,11,1,101)  : ' sprite "Android" impénétrable, avec tunes
end_if

color 10,255,255,0
2d_image_copy 11,0,0,200,200      : ' sprite jaune pénétrable
creer_sprite("Carré jaune initialement fixe",280,180,11,0)

copier_sprite("Android initialement fixe copié",1,600,300,11)       : ' copie du sprite 1 (en sprite 4)

on_key_down 0,key
on_close 0,close0

sprite_mobile% = 2                : ' c'est le sprite mobile par défaut

end

' ***** frappe d'une touche au clavier
key:
  direct% = 0
  d% = key_down_code
  if d%=37 : ' gauche
        dx% = 0 - 1
        dy% = 0
        direct% = 1
  end_if
  if d%=38 : ' haut
        dx% = 0
        dy% = 0 - 1
        direct% = 2
  end_if
  if d%=39 : ' droite
        dx% = 1
        dy% = 0
        direct% = 3
  end_if
  if d%=40 : ' bas
        dx% = 0
        dy% = 1
        direct% = 4
  end_if
  if direct%=0 then return
  for i%=1 to 30                        : ' pas de 30 pixels par frappe d'une flèche
    deplacer_sprite(sprite_mobile%,1,dx%,dy%) : ' déplacement relatif
    tester_si_collision(sprite_mobile%,direct%)     : ' suivi du test de collision
    s$ = ""
    if sprite_collision%>0              : ' une collision a eu lieu ?
      s$ = "collision avec sprite "+str$(sprite_collision%)+"=["+sname_collision$+"]  tune "+str$(tune_collision%)+"=["+tname_collision$
      sm$ = "]  touché par sprite "+str$(sprite_collision_mobile%)+"=["+sname_collision_mobile$+"]  tune "+str$(tune_collision_mobile%)+"=["+tname_collision_mobile$+"]"
      message s$ + sm$
      deplacer_sprite(sprite_mobile%,1,0-dx%,0-dy%)  : ' annuler le déplacement en cas de collision
      exit_for                          : ' et arrêter le déplacement
    end_if                              : ' fin test si collision
  next i%                               : ' fin boucle de déplacement
return

' ***** clic dans la scene2d
clic:
  chercher_sprite_selon_clic()
  if sprite_trouve%>0
    sprite_mobile% = sprite_trouve%     : ' sélectionner le sprite cliqué !
    if tune_trouve%>0
      message "clic sur sprite "+str$(sprite_trouve%)+"="+snames$(sprite_trouve%)+" tune "+str$(tune_trouve%)+"="+tune_trouve_nom$
    else
      message "clic sur sprite "+str$(sprite_trouve%)+"="+snames$(sprite_trouve%)+" sans tune"
    end_if
  else
    message "aucun sprite cliqué"
  end_if
  return
  
' ***** fermeture de la form 0
close0:
  effacer_images()                       : ' effacer éventuellement les images des sprites
  return
  

sub memoriser_images()
  dim_local d$, dold$, f$
  if images$<>"" then exit_sub           : ' mémorisation déjà activé ?
  d$ = dir_current$ + "\Temp_Sprites"    : ' construire dossier temporaire des images des sprites
  if dir_exists(d$)=1                    : ' ce dossier existe ?
    dold$ = dir_current$                 : ' mémoriser le dossier actuel
    dir_change d$                        : ' passer dans le dossier des images
    f$ = file_find_first$                : ' chercher le premier fichier
    while f$<>"_"                        : ' tant qu'on trouve des fichiers
      if left$(f$,1)<>"." then file_delete f$  : ' les supprimer
      f$ = file_find_next$               : ' et passer au suivant
    end_while
    file_find_close                      : ' fin de recherche de fichiers
    dir_change dold$                     : ' repositionner dans le dossier par défaut ancien
    dir_remove d$                        : ' et supprimer le dossier des images
  end_if
  dir_make d$                            : ' alors créer ce dossier
  images$ = d$                           : ' et mémoriser le chemin
end_sub

sub effacer_images()
  dim_local old$, f$
  if images$="" then exit_sub            : ' le dossier temporaire n'existe pas ? Rien à faire !
  old$ = dir_current$                    : ' mémoriser l'actuel dossier courant
  dir_change images$                     : ' changer pour le dossier temporaire des images
  f$ = file_find_first$                  : ' prendre le premier nom de fichier de ce dossier
  while f$<>"_"                          : ' tout est traité ?
    if left$(f$,1)<>"." then file_delete f$   : ' détruire si c'est un vrai fichier
    f$ = file_find_next$                 : ' passer au fichier suivant
  end_while                              : ' fin de boucle de traitement
  file_find_close                        : ' clore la fonction de recherche
  dir_change old$                        : ' remettre l'ancien dossier courant
  rmdir images$                          : ' supprimer le dossier des images
  images$ = ""                           : ' et "oublier" ce dossier
end_sub

sub creer_sprite(nam$,x%,y%,img%,dur%)
  nsprite% = nsprite% + 1        : ' passer au numéro de sprite suivant
  sprite nsprite%                : ' créer le sprite
  snames$(nsprite%)   = nam$     : ' memoriser son nom
  sprites(nsprite%,0) = 200      : ' mémoriser sa largeur
  sprites(nsprite%,1) = 200      : ' et sa hauteur
  sprites(nsprite%,2) = 1        : ' marquer "visible"
  sprites(nsprite%,3) = dur%     : ' marquer 0="pénétrable" ou 1="impénétrable"
  sprites(nsprite%,4) = x%       : ' position horizontale du sprite
  sprites(nsprite%,5) = y%       : ' position verticale du sprite
  sprites(nsprite%,6) = 0        : ' pas de tunes
  sprites(nsprite%,7) = 0        : ' pas de tunes
  if img%>0                      : ' une image est fournie ?
    sprite_image_load nsprite%,img%   : ' copier une image dans le sprite
    if images$<>"" then file_save img%,images$+"\sprite_"+str$(nsprite%)+".bmp" : ' et la sauver
  end_if                         : ' fin test image fournie
  sprite_position nsprite%,x%,y% : ' positionner le sprite à l'endroit voulu
  display
end_sub

sub creer_sprite_avec_tunes(nam$,x%,y%,img%,dur%,dl%)
  dim_local t%, s$, p%, n%
  if object_exists(dl%)=0 then exit_sub   : ' impossible si l'objet n'existe pas
  if object_type(dl%)<>26 then exit_sub   : ' impossible si l'objet n'est pas une DLIST
  if count(dl%)=0 then exit_sub           : ' impossible si la liste des tunes est vide
  nsprite% = nsprite% + 1          : ' passer au numéro de sprite suivant
  sprite nsprite%                  : ' créer le sprite
  snames$(nsprite%)   = nam$       : ' memoriser son nom
  sprites(nsprite%,0) = 200        : ' mémoriser sa largeur
  sprites(nsprite%,1) = 200        : ' et sa hauteur
  sprites(nsprite%,2) = 1          : ' marquer "visible"
  sprites(nsprite%,3) = dur%       : ' marquer 0="pénétrable" ou 1="impénétrable"
  sprites(nsprite%,4) = x%         : ' position horizontale du sprite
  sprites(nsprite%,5) = y%         : ' position verticale du sprite
  sprites(nsprite%,6) = ntunes%+1  : ' indice dans la liste des tunes
  sprites(nsprite%,7) = count(dl%) : ' nombre de tunes
  for t%=1 to count(dl%)           : ' boucle sur les lignes des tunes
    ntunes% = ntunes% + 1          : ' compter le nouveau tune
    tunes(ntunes%,0) = nsprite%    : ' mémoriser le numéro du sprite pour ce tune
    s$ = item_read$(dl%,t%)+","    : ' lire un eligne de tunes
    p% = instr(s$,",")
    n% = val(left$(s$,p%-1))       : ' garder le numéro du tune
    s$ = mid$(s$,p%+1,100)         : ' dépasser le numéro de tune
    p% = instr(s$,",")
    tunes(ntunes%,1) = val(left$(s$,p%-1)) : ' mémoriser coordonnée x du tune
    s$ = mid$(s$,p%+1,100)         : ' dépasser la coordonnée x du tune
    p% = instr(s$,",")
    tunes(ntunes%,2) = val(left$(s$,p%-1)) : ' mémoriser coordonnée y du tune
    s$ = mid$(s$,p%+1,100)         : ' dépasser la coordonnée y du tune
    p% = instr(s$,",")
    tunes(ntunes%,3) = val(left$(s$,p%-1)) - tunes(ntunes%,1)+1 : ' mémoriser largeur du tune
    s$ = mid$(s$,p%+1,100)         : ' dépasser la largeur du tune
    p% = instr(s$,",")
    tunes(ntunes%,4) = val(left$(s$,p%-1)) - tunes(ntunes%,2)+1 : ' mémoriser hauteur du tune
    s$ = mid$(s$,p%+1,100)         : ' dépasser la hauteur du tune
    if s$="" then s$ = "Tune "+str$(n%)
    tnames$(ntunes%) = s$
  next t%                          : ' fin boucle sur les lignes des tunes
  if img%>0                        : ' une image est fournie ?
    sprite_image_load nsprite%,img%   : ' copier une image dans le sprite
    if images$<>"" then file_save img%,images$+"\sprite_"+str$(nsprite%)+".bmp" : ' et la sauver
  end_if                           : ' fin test image fournie
  sprite_position nsprite%,x%,y%   : ' positionner le sprite à l'endroit voulu

  display
end_sub

sub copier_sprite(nam$,n%,x%,y%,img%)
  dim_local i%, nt%
  nsprite% = nsprite% + 1                : ' passer au numéro de sprite suivant
  sprite nsprite%                        : ' créer le sprite
  snames$(nsprite%)   = nam$             : ' memoriser son nom
  sprites(nsprite%,0) = sprites(n%,0)    : ' mémoriser sa largeur
  sprites(nsprite%,1) = sprites(n%,1)    : ' et sa hauteur
  sprites(nsprite%,2) = sprites(n%,2)    : ' marquer "visible"
  sprites(nsprite%,3) = sprites(n%,3)    : ' marquer 0="pénétrable" ou 1="impénétrable"
  sprites(nsprite%,4) = x%               : ' position horizontale du sprite
  if sprites(n%,3)=0 then sprites(nsprite%,4) = sprites(nsprite%,4) + 4000 : ' traitement "invisible"
  sprites(nsprite%,5) = y%               : ' position verticale du sprite
  if sprites(n%,6)=0                     : ' le sprite source n'a pas de tunes ?
    sprites(nsprite%,6) = 0              : ' pas de tunes
    sprites(nsprite%,7) = 0              : ' pas de tunes
  else                                   : ' le sprite source a des tunes
    nt% = sprites(n%,6)                  : ' alors mémoriser l'indice dans la liste des tunes
    sprites(nsprite%,6) = ntunes%+1      : ' indice dans la liste des tunes
    sprites(nsprite%,7) = sprites(n%,7)  : ' nombre de tunes
    for i%=1 to sprites(n%,0)            : ' boucle sur tous les tunes du sprite source
      ntunes% = ntunes% + 1              : ' compter le nouveau tune
      tunes(ntunes%,0) = nsprite%        : ' mémoriser le numéro du sprite pour ce tune
      tunes(ntunes%,1) = tunes(nt%+i%-1,1) : ' et copier les autres valeurs
      tunes(ntunes%,2) = tunes(nt%+i%-1,2)
      tunes(ntunes%,3) = tunes(nt%+i%-1,3)
      tunes(ntunes%,4) = tunes(nt%+i%-1,4)
      tnames$(ntunes%) = tnames$(nt%+i%-1) : ' copier le nom du tune
    next i%                              : ' fin boucle de copie des tunes
  end_if                                 : ' fin traitement des tunes

  if images$<>""                         : ' les images sont mémorisées ?
    if file_exists(images$+"\sprite_"+str$(n%)+".bmp")=1
      file_load img%,images$+"\sprite_"+str$(n%)+".bmp"   : ' charger l'image dans objet IMG%
      sprite_image_load nsprite%,img%    : ' charger l'image dans le nouveau sprite
      file_save img%,images$+"\sprite_"+str$(nsprite%)+".bmp" : ' et la sauver
    end_if                               : ' fin test "image existante"
  end_if                                 : ' fin test images mémorisées

  sprite_position nsprite%,sprites(nsprite%,4),sprites(nsprite%,5) : ' positionner le sprite à l'endroit voulu

  display
end_sub

sub deplacer_sprite(n%,rel%,x%,y%)
  if (n%<1) or (n%>nsprite%) then exit_sub   : ' sécuriser
  if rel%=1                              : ' positionnement relatif ?
    sprites(n%,4) = sprites(n%,4) + x%
    sprites(n%,5) = sprites(n%,5) + y%
  else                                   : ' positionnement absolu !
    sprites(n%,4) = x%
    sprites(n%,5) = y%
  end_if
  if sprites(nsprite%,2)=1               : ' sprite visible ?
    sprite_position n%,sprites(n%,4),sprites(n%,5) : ' positionner le sprite visible à l'endroit voulu
  else                                   : ' sprite caché !
    sprite_position n%,sprites(n%,4)+4000,sprites(n%,5) : ' positionner le sprite caché à l'endroit voulu
  end_if
end_sub

sub redimensionner_sprite_x(n%,c)
  if (n%<1) or (n%>nsprite%) then exit_sub   : ' sécuriser
  sprite_x_scale n%,c              : ' ajuster la largeur
  sprites(n%,0) = sprites(n%,0)*c  : ' et mémoriser
end_sub

sub redimensionner_sprite_y(n%,c)
  if (n%<1) or (n%>nsprite%) then exit_sub   : ' sécuriser
  sprite_y_scale n%,c              : ' ajuster la hauteur
  sprites(n%,1) = sprites(n%,1)*c  : ' et mémoriser
end_sub

sub redimensionner_sprite_xy(n%,cx,cy)
  if (n%<1) or (n%>nsprite%) then exit_sub   : ' sécuriser
  sprite_scale n%,cx,cy              : ' ajuster largeur et hauteur
  sprites(n%,0) = sprites(n%,0)*cx   : ' et mémoriser la largeur
  sprites(n%,1) = sprites(n%,1)*cy   : ' et mémoriser la hauteur
end_sub

sub cacher_sprite(n%)
  if (n%<1) or (n%>nsprite%) then exit_sub   : ' sécuriser
  if sprites(n%,2)=1                         : ' est-ce que le sprite est visible ?
    sprite_x_position n%,sprite_x_position(n%) + 4000     : ' déplacer hors de la vue
    sprites(n%,2) = 0                        : ' signaler "invisible"
  end_if
end_sub

sub montrer_sprite(n%)
  if (n%<1) or (n%>nsprite%) then exit_sub   : ' sécuriser
  if sprites(n%,2)=0                         : ' est-ce que le sprite est invisible ?
    sprite_x_position n%,sprite_x_position(n%) - 4000     : ' replacer dans la partie visible
    sprites(n%,2) = 1                        : ' signaler "visible"
  end_if
end_sub

sub chercher_sprite_selon_clic()
  dim_local i%, x%, y%, xs%, ys%, nt%, t%, ind%, ws, hs
  sprite_trouve% = 0                   : ' supposer "sprite non trouvé"
  tune_trouve% = 0                     : ' supposer "tune non trouvé"
  tune_trouve_nom$ = ""                : ' donc, pas de nom...
  if number_click<>scene_2d% then exit : ' on n'a pas cliqué dans le scene2d ?
  if nsprite%=0 then exit_sub          : ' pas de sprites créés ?
  x% = mouse_x_left_down(scene_2d%)    : ' mémoriser la position horizontale du clic
  y% = mouse_y_left_down(scene_2d%)    : ' mémoriser la position verticale du clic
  for i%=nsprite% to 1 step -1         : ' boucle sur tous les sprites
    xs% = sprite_x_position(i%)        : ' mémoriser la position horizontale du sprite i%
    ys% = sprite_y_position(i%)        : ' mémoriser la position verticale dusprite i%
    if (xs%<x%)                        : ' le bord gauche du sprite est plus à gauche que l'abscisse du clic ?
      if (ys%<y%)                      : ' le bord haut du sprite est plus haute que l'ordonnée du sprite ?
        if xs%+sprites(i%,0)>=x%       : ' le bord droit du sprite est plus à droite que l'abscisse du clic ?
          if ys%+sprites(i%,1)>=y%     : ' le bord bas du sprite est plus en bas que l'ordonnée du clic ?
              sprite_trouve% = i%      : ' alors, on a trouvé le sprite
              if sprites(i%,7)>0       : ' le sprigte cliqué a des tunes ?
                nt% = sprites(i%,7)    : ' prendre le nombre de tunes
                ind% = sprites(i%,6)-1 : ' prendre l'indice dans tunes()
                for t%=1 to nt%        : ' boucle sur les tunes du sprite cliqué
                  xs% = tunes(ind%+t%,1)           : ' c'est l'abscisse du coin en haut à gauche
                  ys% = tunes(ind%+t%,2)           : ' c'est l'ordonnée du coin en haut à gauche
                  ws = tunes(ind%+t%,3)            : ' c'est la largeur
                  hs = tunes(ind%+t%,4)            : ' c'est la hauteur
                  xs% = xs% + sprites(i%,4)        : ' l'adresse du tune est relative !
                  ys% = ys% + sprites(i%,5)        : ' l'adresse du tune est relative !
                  if (x%>=xs%) and (x%<(xs%+ws))   : ' horizontalement cliqué dans le tune ?
                    if (y%>=ys%) and (y%<(ys%+hs)) : ' vertictalement cliqué dans le tune ?
                      tune_trouve% = t%            : ' retourner le numéro du tune cliqué
                      tune_trouve_nom$ = tnames$(ind%+t%) : ' et son nom
                    end_if
                  end_if
                next t%                : ' find de boucle sur les tunes
              end_if                   : ' in du traitement des tunes
              exit_sub                 : ' et on sort
          end_if                       : ' fin test sur le bord bas du sprite
        end_if                         : ' fin test sur le bord droit du sprite
      end_if                           : ' fin test sur le bord haut du sprite
    end_if                             : ' fin test sur le bord gauche du sprite
  next i%                              : ' fin boucle sur les sprites
end_sub

sub tester_si_collision(n%,dir%)
  dim_local i%, x%, y%, w%, h%, xs%, ys%, w, h, ws, hs, t%, nt%,
  dim_local s$, s1$, ss$, ss1$, p%, p2%, pp%, pp2%,
  dim_local ntm%, tm%, xsm%, ysm%, wsm, hsm, ind%, indm%
  sprite_collision%        = 0         : ' supposer "pas de collision"
  sprite_collision_mobile% = 0
  tune_collision%          = 0
  tune_collision_mobile%   = 0
  if nsprite%<2 then exit_sub          : ' pas de collisions possibles ?
  if sprites(n%,2)=0 then exit_sub     : ' le sprite mobile est "invisible" ?
  if sprites(n%,3)=0 then exit_sub     : ' le sprite mobile est "pénétrable" ?
  x% = sprites(n%,4)                   : ' position horizontale du sprite en movement
  y% = sprites(n%,5)                   : ' position verticale du sprite en movement
  w = sprites(n%,0)                    : ' largeur du sprite en movement
  h = sprites(n%,1)                    : ' hauteur du sprite en movement
  for i%=nsprite% to 1 step -1         : ' boucle sur tous les sprites
    if i%<>n%                          : ' on est sur un sprite autre que celui qui bouge ?
      if sprites(i%,3)<>0              : ' sprite en dur ?
        xs% = sprites(i%,4)            : ' position horizontale du sprite à tester
        ys% = sprites(i%,5)            : ' position verticale du sprite à tester
        ws = sprites(i%,0)             : ' largeur du sprite à tester
        hs = sprites(i%,1)             : ' hauteur du sprite à tester
        select dir%                    : ' distinction par direction du mouvement
          case 1: ' gauche
             if (x%-1)<=(xs%+ws)       : ' bord droit fixe peut toucher bord gauche mobile ?
               if (x%+w)>=(xs%-1)      : ' bord droit mobile plus à droite que bord gauche fixe ?
                 if (ys%+hs)>=y%       : ' bord bas mobile plus bas que bord haut fixe ?
                   if ys%<=(y%+h)      : ' bord haut mobile plus que bord bas fixe ?
                     sprite_collision% = i%  : ' alors collision
' message "collision à gauche avec "+str$(sprite_collision%)
                   end_if
                 end_if
               end_if
             end_if
          case 2: ' haut
             if (y%-1)<=(ys%+hs)       : ' bord bas fixe peut toucher bord haut mobile ?
               if (y%+h)>=(ys%-1)      : ' bord bas mobile plus bas que bord haut fixe ?
                 if (xs%+hs)>=x%       : ' bord droit mobile plus à gauche que bord gauche fixe ?
                   if xs%<=(x%+h)      : ' bord gauche mobile plus à gauche que bord droit fixe ?
                     sprite_collision% = i%  : ' alors collision
                   end_if
                 end_if
               end_if
             end_if
          case 3: ' droite    : ' à adapter
             if (x%+w)>=(xs%-1)        : ' bord gauche fixe peut toucher bord droit mobile ?
               if x%<=(xs%+ws)         : ' bord gauche mobile plus à gauche que bord droit fixe ?
                 if (y%+h)>=(ys%-1)    : ' bord bas mobile plus bas que bord haut fixe ?
                   if ys%<=(y%+h)      : ' bord haut mobile plus bas que bord bas fixe ?
                     sprite_collision% = i%  : ' alors collision
                   end_if
                 end_if
               end_if
             end_if
          case 4: ' bas        : ' à adapter
             if (y%+h)=(ys%-1)         : ' bord haut fixe peut toucher bord bas mobile ?
               if y%<=(ys%+hs)         : ' bord haut mobile plus haut que bord bas fixe ?
                 if (xs%+hs)>=x%       : ' bord droit mobile plus à gauche que bord gauche fixe ?
                   if xs%<=(x%+h)      : ' bord gauche mobile plus à gauche que bord droit fixe ?
                     sprite_collision% = i%  : ' alors collision
                   end_if
                 end_if
               end_if
             end_if
        end_select                     : ' fin distinction par direction
' message str$(sprite_collision%)

        if sprite_collision%>0            : ' une collision est possible ?
if trace%=1 then clear 102
          if sprites(i%,6)>0              : ' le sprite fixe a des tunes ?
            nt% = sprites(i%,7)           : ' nombre de tunes
            ind% = sprites(i%,6)-1        : ' prendre l'indice dans tunes()
            for t%=1 to nt%               : ' boucle sur les tunes du sprite touché
              xs% = tunes(ind%+t%,1)      : ' c'est l'abscisse du coin en haut à gauche
              ys% = tunes(ind%+t%,2)      : ' c'est l'ordonnée du coin en haut à gauche
              ws = tunes(ind%+t%,3)       : ' c'est la largeur
              hs = tunes(ind%+t%,4)       : ' c'est la hauteur
              xs% = xs% + sprites(i%,4)   : ' l'adresse du tune est relative !
              ys% = ys% + sprites(i%,5)   : ' l'adresse du tune est relative !

              if sprites(n%,6)>0          : ' le sprite mobile a des tunes ?
                ntm% = sprites(n%,7)      : ' nombre de tunes du sprite mobile
                indm% = sprites(n%,6)-1   : ' prendre l'indice dans tunes()
                for tm%=1 to ntm%               : ' boucle sur les tunes du sprite mobileé
                  xsm% = tunes(indm%+tm%,1)     : ' c'est l'abscisse du coin en haut à gauche
                  ysm% = tunes(indm%+tm%,2)     : ' c'est l'ordonnée du coin en haut à gauche
                  wsm = tunes(indm%+tm%,3)      : ' c'est la largeur
                  hsm = tunes(indm%+tm%,4)      : ' c'est la hauteur
                  xsm% = xsm% + sprites(n%,4)   : ' l'adresse du tune est relative !
                  ysm% = ysm% + sprites(n%,5)   : ' l'adresse du tune est relative !
if trace%=1
  item_add 102,"Fixe:   tune "+str$(t%)+": "+str$(xs%)+","+str$(ys%)+"/"+str$(ws)+","+str$(hs)
  item_add 102,"Mobile: tune "+str$(tm%)+": "+str$(xsm%)+","+str$(ysm%)+"/"+str$(wsm)+","+str$(hsm)
  item_add 102,""
end_if
                  if (xs%-1)<=(xsm%+wsm)          : ' bord gauche tune fixe plus à gauche que bord droit tune mobile ?
                    if (xs%+ws)>=(xsm%-1)         : ' bord droit tune fixe plus à droite que bord gauche tune mobile ?
                      if (ysm%+hsm)>=ys%          : ' bord bas tune mobile plus bas que bord haut tune fixe ?
                        if ysm%<=(ys%+hs)         : ' bord haut tune mobile plus haut que bord bas tune fixe ?
                          sprite_collision% = i%  : ' alors collision
                          tune_collision% = t%
                          tune_collision_mobile% = tm%
                          chercher_noms(n%)       : ' chercher les noms des tunes
if trace%=1 then item_add 102,str$(ind%)+"  "+str$(indm%)
                          exit_sub                : ' sortie car on a trouvé une collision
                        end_if                    : ' fin test sur bord haut tune mobile
                      end_if                      : ' fin test sur bord bas tune mobile
                    end_if                        : ' fin test sur bord droit tune fixe
                  end_if                          : ' fin test sur bord gauche tune fixe

                next tm%                          : ' fin boucle sur les tune du mobile
              else                                : ' le sprite mobile n'a pas de tunes !
                  if (xs%-1)<=(x%+w)              : ' bord gauche tune fixe plus à gauche que bord droit sprite mobile ?
                    if (xs%+ws)>=(x%-1)           : ' bord droit tune fixe plus à droite que bord gauche sprite mobile ?
                      if (y%+h)>=ys%              : ' bord bas sprite mobile plus bas que bord haut tune fixe ?
                        if y%<=(ys%+hs)           : ' bord haut sprite mobile plus haut que bord bas tune fixe ?
                          sprite_collision% = i%  : ' alors collision
                          tune_collision% = t%
                          tune_collision_mobile% = 0
                          chercher_noms(n%)       : ' chercher les noms des tunes
if trace%=1 then item_add 102,str$(ind%)+" fixe"
                          exit_sub                : ' sortie car on a trouvé une collision
                        end_if                    : ' fin test sur bord haut tune mobile
                      end_if                      : ' fin test sur bord bas tune mobile
                    end_if                        : ' fin test sur bord droit tune fixe
                  end_if                          : ' fin test sur bord gauche tune fixe
              end_if                              : ' fin sprite mobile a des tunes
              
            next t%                               : ' fin boucle sur les tunes du sprite touché
            sprite_collision% = 0                 : ' aucun tune du sprite n'est touché
          else                                    : ' le sprite fixe n'a pas de tunes !
            if sprites(n%,6)>0                    : ' le sprite mobile a des tunes ?
              ntm% = sprites(n%,7)                : ' nombre de tunes du sprite mobile
              indm% = sprites(n%,6)-1             : ' prendre l'indice dans tunes()
              for tm%=1 to ntm%                   : ' boucle sur les tunes du sprite mobileé
                xsm% = tunes(indm%+tm%,1)         : ' c'est l'abscisse du coin en haut à gauche
                ysm% = tunes(indm%+tm%,2)         : ' c'est l'ordonnée du coin en haut à gauche
                wsm = tunes(indm%+tm%,3)          : ' c'est la largeur
                hsm = tunes(indm%+tm%,4)          : ' c'est la hauteur
                xsm% = xsm% + sprites(n%,4)       : ' l'adresse du tune est relative !
                ysm% = ysm% + sprites(n%,5)       : ' l'adresse du tune est relative !
if trace%=1
  item_add 102,"fixe: "+str$(sprites(i%,4))+","+str$(sprites(i%,5))+" / "+str$(sprites(i%,0))+","+str$(sprites(i%,1))
  item_add 102,"tune: "+str$(tm%)+": "+str$(xsm%)+","+str$(ysm%)+" / "+str$(wsm)+","+str$(hsm)
  item_add 102,""
end_if
                if (sprites(i%,4)-1)<=(xsm%+wsm)             : ' bord gauche sprite fixe plus à gauche que bord droit tune mobile ?
  item_add 102,"a"
                  if (sprites(i%,4)+sprites(i%,0))>=(xsm%-1) : ' bord droit sprite fixe plus à droite que bord gauche tune mobile ?
  item_add 102,"b"
                    if (ysm%+hsm)>=sprites(i%,5)             : ' bord bas tune mobile plus bas que bord haut sprite fixe ?
  item_add 102,"c"
                      if ysm%<=(sprites(i%,5)+sprites(i%,1)) : ' bord haut tune mobile plus haut que bord bas sprite fixe ?
  item_add 102,"d"
                        sprite_collision% = i%               : ' alors collision
                        tune_collision% = 0
                        tune_collision_mobile% = tm%
                        chercher_noms(n%)         : ' chercher les noms des tunes
if trace%=1 then item_add 102,str$(indm%)+" mobile"
                        exit_sub                  : ' sortie car on a trouvé une collision
                      end_if                      : ' fin test sur bord haut tune mobile
                    end_if                        : ' fin test sur bord bas tune mobile
                  end_if                          : ' fin test sur bord droit tune fixe
                end_if                            : ' fin test sur bord gauche tune fixe
              next tm%                            : ' fin boucle sur les tunes mobile
              sprite_collision% = 0
            else                          : ' sprite mobile n'a pas de tunes !
              chercher_noms(n%)           : ' alors, construire les noms par défaut
            end_if                        : ' fin de test sur les tunes du sprite mobile
            exit_sub                      : ' donc, sortie immédiate car colision globale
          end_if                          : ' fin test si sprite a des tunes
        end_if                            : ' fin collision possible
      end_if                              : ' fin test sprite en dur
    end_if                                : ' fin test sur sprite "autre"
  next i%                                 : ' fin boucle sur les sprites
end_sub

sub chercher_noms(mob%)
      sprite_collision_mobile% = mob%     : ' retourner ne numéro du sprite mobile
      sname_collision$ = snames$(sprite_collision%) : ' retourner le nom du sprite touché
      sname_collision_mobile$ = snames$(mob%) : ' retourner le nom du sprite mobile
      if tune_collision%>0              : ' est-ce qu'un tune a été touché ?
        for j%=1 to ntunes%                      : ' boucle de recherche du sprite concerné
          if tunes(j%,0)=sprite_collision%       : ' est-ce le sprite touché ?
            tname_collision$ = tnames$(j%+tune_collision%-1)   : ' prendre le nom du tune
            exit_for                             : ' et sortir
          end_if                                 : ' fin de traitement du sprite trouvé
        next j%                         : ' fin boucle sur les tunes
      else
        tname_collision$ = "Sprite entier"
      end_if                            : ' fin traitement du tune touché
      if tname_collision$="" then tname_collision$ = "Tune "+str$(tune_collision%)       : ' nom par défaut
      if tune_collision_mobile%>0       : ' est-ce qu'un tune mobile a touché ?
        for j%=1 to ntunes%                            : ' boucle de recherche du sprite concerné
          if tunes(j%,0)=mob%           : ' est-ce le sprite mobile ?
            tname_collision_mobile$ = tnames$(j%+tune_collision_mobile%-1) : ' prendre le nom du tune
            exit_for                    : ' et sortir
          end_if                        : ' fin de traitement du sprite trouvé
        next j%                         : ' fin boucle sur les tunes
      else
        tname_collision_mobile$ = "Sprite entier"
      end_if                            : ' fin traitement du tune touché
      if tname_collision_mobile$="" then tname_collision_mobile$ = "Tune "+str$(tune_collision_mobile%)     : ' nom par défaut
end_sub


Dernière édition par Klaus le Ven 12 Juin 2015 - 11:43, édité 1 fois
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Jean Claude

Jean Claude


Nombre de messages : 5950
Age : 70
Localisation : 83 Var
Date d'inscription : 07/05/2009

Des procédures pour la 2D  - Page 4 Empty
MessageSujet: Re: Des procédures pour la 2D    Des procédures pour la 2D  - Page 4 EmptyVen 12 Juin 2015 - 11:38

@Klaus,
il y a un inconvénient avec les touches de déplacement, toutes les touches du clavier restent fonctionnelles...

d'autre part j'ai déposé sur mon Webdav un dossier nommé "vaisseau" à l'intérieur de "jeu_en 2D"
J'aimerai que tu le télécharges et que tu réfléchisses à moyen de faire pivoté le vaisseau sur lui même et de voir aussi des possibilités de déplacement en diagonale.

Je ramasse ta copie dans 1/4 d'heure..Embarassed
lol!
Revenir en haut Aller en bas
Jean Claude

Jean Claude


Nombre de messages : 5950
Age : 70
Localisation : 83 Var
Date d'inscription : 07/05/2009

Des procédures pour la 2D  - Page 4 Empty
MessageSujet: Re: Des procédures pour la 2D    Des procédures pour la 2D  - Page 4 EmptyVen 12 Juin 2015 - 11:47

Je voudrais votre avis.

J'envisage de renommer ce post "Procédure pour la 2D" car le titre actuel ne correspond plus au sujet initial.

A+
Revenir en haut Aller en bas
Klaus

Klaus


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

Des procédures pour la 2D  - Page 4 Empty
MessageSujet: Re: Des procédures pour la 2D    Des procédures pour la 2D  - Page 4 EmptyVen 12 Juin 2015 - 11:50

Voilà qui est corrigé. Je vais voir ton problème de pivotement. Mais en général, le pivotement se fait de la manière suivante:
1. tu mémorises l'orientation pour le ou les sprites concernés, dans une variable par sprite
2. tu crées autant d'images du sprite que d'orientations possibles
3. tu prévois 2 touches pour pivoter à gauche ou à droite
4. en fonction de la nouvelle orientation, tu charges l'image correspondante dans le sprite

Il n'y a pas d'autre méthode. La notion de rotation d'un sprite n'existe pas, et tu dois le programmer de cette manière.

Si tu veux faire un déplacement diagonale, il faut définir 4 autres touches fonction. Chacune de ces touches va effectuer un déplacement d'un pixel dans un sens vertical (avec contrôle de collision) suivi d'un déplacement dans un sens horizontal (à nouveau avec contrôle de collision). Ainsi, en utilisant les directions de la rose des vents pour désigner les déplacements, NO devient N suivi de O, NE devient N suivi de E, etc.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Klaus

Klaus


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

Des procédures pour la 2D  - Page 4 Empty
MessageSujet: Re: Des procédures pour la 2D    Des procédures pour la 2D  - Page 4 EmptyVen 12 Juin 2015 - 11:51

Bonne idée de renommer ce fil de discussion !
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Klaus

Klaus


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

Des procédures pour la 2D  - Page 4 Empty
MessageSujet: Re: Des procédures pour la 2D    Des procédures pour la 2D  - Page 4 EmptyVen 12 Juin 2015 - 12:02

J'ai regardé ton code. Belle image !

Pour pouvoir bouger ton sprite, il faut changer le numéro du sprite mobile:
Code:
sprite_mobile% = 1                : ' c'est le sprite mobile par défa
Dans mon code, c'était le sprite 2. Mais pour toi, c'est le sprite 1... Ainsi, il est déplaçable même sans cliquer dessus. Mais, en cliquant dessus, cela s'actualise tout seul, et on voit très bien les différentes zones actives.

Je reviens sur la rotation: non seulement il faut faire autant d'images que de positions possibles, mais il faut également redéfinir les tunes pour chaque rotation, bien sûr !
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Jean Claude

Jean Claude


Nombre de messages : 5950
Age : 70
Localisation : 83 Var
Date d'inscription : 07/05/2009

Des procédures pour la 2D  - Page 4 Empty
MessageSujet: Re: Des procédures pour la 2D    Des procédures pour la 2D  - Page 4 EmptyVen 12 Juin 2015 - 12:13

OK, j'ai compris,

sprite_mobile% = 1 : ' c'est le sprite mobile par défaut

il y a beaucoup à apprendre.


Pour la rotation, ça fait beaucoup de travail car pour redéfinir les tunes, il faut repasser par build_sprite_mask.
Mais bon, ce n'est pas impossible.

A+
Revenir en haut Aller en bas
Jean Claude

Jean Claude


Nombre de messages : 5950
Age : 70
Localisation : 83 Var
Date d'inscription : 07/05/2009

Des procédures pour la 2D  - Page 4 Empty
MessageSujet: Re: Des procédures pour la 2D    Des procédures pour la 2D  - Page 4 EmptyVen 12 Juin 2015 - 14:07

@Klaus,

Apparemment, pour que ton jeu de procédures fonctionne, il n'est pas indispensable que la taille des images.bmp soit  200x200.
Si c'est le cas, tu pourrais définir par une variable la taille des images. Bien sur, ça t'oblige à revoir build_sprite_mask dans la même optique.

Est-ce obligatoire qu'elle soit carré ???

200x200 pour des sprites avec ou sans tune, c'est trop grand pour faire un jeu sur un SCENE2D de 700x700.

A+
Revenir en haut Aller en bas
Jicehel

Jicehel


Nombre de messages : 5947
Age : 52
Localisation : 77500
Date d'inscription : 18/04/2011

Des procédures pour la 2D  - Page 4 Empty
MessageSujet: Re: Des procédures pour la 2D    Des procédures pour la 2D  - Page 4 EmptyVen 12 Juin 2015 - 14:18

Dans l'outil pour les sprites, (il faudra abandonner le nom build_mask) pour sprite tool ou autre, il y a plein de petit outils qui peuvent être bien pratique comme la substitution d'une couleur par une autre, la rotation par pas de 90° peut être faite facilement avec adaptation des masques automatiquement, après ça se complique un peu. Je pense que la rotation par pas de 45° doit pouvoir être envisagé d'une manière raisonnable mais je pense comme Klaus que le plutôt au moins d'en faire une version tournée à 45°, après on pourra appliquer l'outil pour calculer les 4 rotations à 90° de ce sprite et de ses masques.
Je réouvrirait les outils que j'avais fait pour modifié les sprites de Barbarian, il y avait l'inversion horizontale et verticale, la substitution d'une couleur par une autre avec une palette libre ou avec des couleurs spécifiques pour pouvoir travailler (j'avais mis le noir avec les 3 valeurs à 0, le noir avec le bleu à 1 (le faux noir pas transparent), le fushia qui me servait a remplacer la couleur 0 pendant que je travaillais pour la distinguer du noir. Je ne me souviens plus du reste, mais bien sûr il faudra garder dans les outils la création de masques et de tunes.
Revenir en haut Aller en bas
Contenu sponsorisé





Des procédures pour la 2D  - Page 4 Empty
MessageSujet: Re: Des procédures pour la 2D    Des procédures pour la 2D  - Page 4 Empty

Revenir en haut Aller en bas
 
Des procédures pour la 2D
Revenir en haut 
Page 4 sur 5Aller à la page : Précédent  1, 2, 3, 4, 5  Suivant
 Sujets similaires
-
» Des procédures pour le réseau
» Mes Procédures
» a l'aide sur " procédures "
» Un extracteur de procédures
» Problème avec ADR() et procédures

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: