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 3 Emptypar Pedro Aujourd'hui à 10:37

» Un autre pense-bête...
Des procédures pour la 2D  - Page 3 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 3 Emptypar Pedro Sam 16 Nov 2024 - 14:04

» Décompilation
Des procédures pour la 2D  - Page 3 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 3 Emptypar jjn4 Mar 12 Nov 2024 - 17:23

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

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

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

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

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

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

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

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

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

» fichier.exe
Des procédures pour la 2D  - Page 3 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 à ne pas rater :
Smartphone Xiaomi 14 – 512 Go- 6,36″ 5G Double SIM à 599€
599 €
Voir le deal

 

 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
Yannick




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

Des procédures pour la 2D  - Page 3 Empty
MessageSujet: re   Des procédures pour la 2D  - Page 3 EmptyDim 24 Mai 2015 - 16:50

@ Jean Claude,

Je pense que ton souci vient du fait que tu dois utiliser la même variable d' incrementation
pour les objets et les sprite.
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 3 Empty
MessageSujet: Re: Des procédures pour la 2D    Des procédures pour la 2D  - Page 3 EmptyDim 24 Mai 2015 - 16:59

Non Ygeronimi, je n'ai plus de souci, j'ai bien fait attention de ne pas utiliser no% pour les sprites.

Ne me demande pas comment je suis arrivé à cette fausse conclusion, je serais incapable de te répondre. Embarassed

Bref, pour moi c'est arrangé et ça avance. Very Happy (Merci à Jicehel)

A+
Revenir en haut Aller en bas
Yannick




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

Des procédures pour la 2D  - Page 3 Empty
MessageSujet: re   Des procédures pour la 2D  - Page 3 EmptyDim 24 Mai 2015 - 17:07

Après tout, si cela fonctionne, c' est l' essentiel. Laughing
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 3 Empty
MessageSujet: Re: Des procédures pour la 2D    Des procédures pour la 2D  - Page 3 EmptyDim 24 Mai 2015 - 17:28

On commet tous des erreurs et moi le premier, c'est lun des intérets de discuter sur le forum Smile
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 3 Empty
MessageSujet: Re: Des procédures pour la 2D    Des procédures pour la 2D  - Page 3 EmptyLun 25 Mai 2015 - 9:59

J'ai posté un petit utilitaire permettant de construire les masques des images des sprites, ainsi que des zones rectangulaires de contact pour les tests de collision. Je les ai nommées "tunes". Et c'est dans la rubrique "Vos sources, vos utilitaires à partager": https://panoramic.1fr1.net/t4212-construire-un-masque-pour-les-sprites#49557

Je vais maintenant adapter ma sub de détection pour l'utilisation de ces zones de contact.
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 3 Empty
MessageSujet: Re: Des procédures pour la 2D    Des procédures pour la 2D  - Page 3 EmptyLun 25 Mai 2015 - 10:58

J'attends ton adpatation de tes procédures pour tester ce soir (te connaissant, tu les auras sans doute écrites sauf si tu n'es pas dispo aujourd'hui Wink ).

PS: Dans ton tableau qui contient les données des sprites, tu ne veux pas prévoir un emplacement pour les coordonnées ? Je sais que l'on peut les récupérer par les instruction Panoramic, mais ça pourrait éviter d'avoir à les mémoriser dans des variables temporaires, par exemple avant le chargement d'une image. L'intéret est limité, c'est donc une question ouverte ...
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 3 Empty
MessageSujet: Re: Des procédures pour la 2D    Des procédures pour la 2D  - Page 3 EmptyLun 25 Mai 2015 - 11:03

Je ferai ça ce soir, car maintenant, je n'ai pas le temps. Je dois m'absenter. Et ta suggestion de mettre les coordonnées dans la table - pourquoi pas ? J'y ai déjà mis les dimensions. Donc, je ferai ça aussi. Je rajouterai donc 3 colonnes: les coordonnées X et y, et le numéro d'un DLIST contenant la liste des tunes si cette liste existe, et 0 sinon. Voilà la feuille de route...
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 3 Empty
MessageSujet: Re: Des procédures pour la 2D    Des procédures pour la 2D  - Page 3 EmptyLun 25 Mai 2015 - 11:08

Parfait. Comme ça toutes les infos du sprites seront dans le tableau 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 3 Empty
MessageSujet: Re: Des procédures pour la 2D    Des procédures pour la 2D  - Page 3 EmptyLun 25 Mai 2015 - 23:21

Nouvelle version.

J'ai étendu le tableau sprites(..,..) comme prévu, en mémorisant la position (x,y) des sprites, ainsi que le numéro d'objet d'un DLIST contenant la définition des tunes (zones de contact) de chaque sprite. J'ai remplacé le sprite rouge par le sprite Android, qui a 5 tunes: 1=tête  1=bras droit 3=bras gauche  4=jambe droite 5=jambe gauche. Le sprite 2 (bleu) se déplace et heurte le sprite 1 (Android) au niveau du bras gauche (tune 3). Ceci est signalé, puis le sprite bleu retourne à sa place.

Voici le code:
Code:
' 2d_utilities.bas

label clic

dim sprites(500,6)        : ' 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
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 touché (ou 0 si non trouvé)
dim scene_2d%             : ' numéro d'objet du scene2d
dim i%

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

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

' color 10,255,0,0
' 2d_image_copy 11,0,0,200,200
' creer_sprite(50,50,11,1)          : ' sprite rouge impénétrable
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

color 10,0,0,255
2d_image_copy 11,0,0,200,200      : ' sprite bleu impénétrable
creer_sprite(400,120,11,1)

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


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%)
    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

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
  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%)
  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) = dl%      : ' liste 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%,x%,y%             : ' positionner le sprite visible à l'endroit voulu
  else                                   : ' sprite caché !
    sprite_position n%,x%+4000,y%        : ' 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%, ws, hs, t%, nt%, s$, s1$, p%, p2%, ws%, hs%
  sprite_collision% = 0                : ' supposer "pas de collision"
  tune_collision% = 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% = sprite_x_position(n%)           : ' position horizontale du sprite en movement
  y% = sprite_y_position(n%)           : ' position verticale du sprite en movement
  ws = sprites(n%,0)                   : ' largeur du sprite en movement
  hs = 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% = sprite_x_position(i%)    : ' position horizontale du sprite à tester
        ys% = sprite_y_position(i%)    : ' 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 (xs%+ws)>=(x%-1)  then sprite_collision% = i%
          case 2: ' haut
             if (ys%+hs)>=(y%-1)  then sprite_collision% = i%
          case 3: ' droite
             if (xs%-1)<=(x%+w%)  then sprite_collision% = i%
          case 4: ' bas
             if (ys%-1)<=(y%+h%)  then sprite_collision% = i%
        end_select                        : ' fin distintion par direction
        if sprite_collision%>0            : ' une collision est possible ?
          if sprites(i%,6)>0              : ' le sprite a des tunes ?
            nt% = count(sprites(i%,6))    : ' nombre de tunes
            for t%=1 to nt%               : ' boucle sur les tunes du sprite touché
              s$ = item_read$(sprites(i%,6),t%)+","  : ' lire la définition du sprite
              p% = instr(s$,",")          : '
              s1$ = mid$(s$,p%+1,100)     : ' éliminer le numéro de tune
              p% = instr(s1$,",")         : ' chercher la fin du premier paramètre
              xs% = val(left$(s1$,p%-1))  : ' c'est l'abscisse du coin en haut à gauche
              s1$ = mid$(s1$,p%+1,100)    : ' éliminer le premier paramètre
              p% = instr(s1$,",")         : ' chercher la fin du deuxième paramètre
              ys% = val(left$(s1$,p%-1))  : ' c'est l'ordonnée du coin en haut à gauche
              s1$ = mid$(s1$,p%+1,100)    : ' éliminer le deuxième paramètre
              p% = instr(s1$,",")         : ' chercher la fin du troisième paramètre
              ws% = val(left$(s1$,p%-1))-xs%+1  : ' c'est l'abscisse du coin en bas à droite
              s1$ = mid$(s1$,p%+1,100)    : ' éliminer le troisième paramètre
              p% = instr(s1$,",")         : ' chercher la fin du quatrième paramètre
              hs% = val(left$(s1$,p%-1))-ys%+1  : ' c'est l'ordonnée du coin en bas à droite
              xs% = xs% + sprites(i%,4)   : ' l'adresse du tune est relative !
              ys% = ys% + sprites(i%,5)   : ' l'adresse du tune est relative !
              if xs%<x%                   : ' le bord gauche du tune est plus à gauche que l'abscisse du clic ?
                if ys%<y%                 : ' le bord haut du tune est plus haute que l'ordonnée du sprite ?
                  if (xs%+ws%)>=x%        : ' le bord droit du tune est plus à droite que l'abscisse du clic ?
                    if (ys%+hs%)>=y%      : ' le bord bas du tune est plus en bas que l'ordonnée du clic ?
                      sprite_collision% = i% : ' alors, on a trouvé le sprite
                      tune_collision% = val(left$(s$,instr(s$,",")-1)) : ' et le tune trouvé
                      exit_sub            : ' ici, on a trouvé le tune touché
                    end_if                : ' fin test sur le bord bas du tune
                  end_if                  : ' fin test sur le bord droit du tune
                end_if                    : ' fin test sur le bord haut du tune
              end_if                      : ' fin test sur le bord gauche du tune
            next t%                       : ' fin boucle sur les tunes du sprite touché
            sprite_collision% = 0         : ' aucun tune du sprite n'est touché
          else                            : ' le sprite n'a pas de tunes !
            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


Voici le sprite Andoid.bmp:
Des procédures pour la 2D  - Page 3 Androi13

Et voici le fichier Android_mask_tuned_list.txt avec la liste des tunes:
Citation :
1,43,0,159,69
2,23,67,64,140
3,140,67,181,136
4,51,131,96,200
5,111,131,152,197

Vous verrez que le sprite bleu avance vraiment au contact du bras gauche (à droit sur l'écran, bien sûr !), bien que le sprite Android s'étende plus loin - il y a une partie noire qui est transparente dans le scene2d. Mais la procédure de détection de collision détecte bien que le sprite a des tunes et réagit alors aux tunes. Sinon, il réagit dès le premier contact avec le sprite.


Dernière édition par Klaus le Mar 26 Mai 2015 - 0:08, édité 1 fois
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Yannick




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

Des procédures pour la 2D  - Page 3 Empty
MessageSujet: re   Des procédures pour la 2D  - Page 3 EmptyLun 25 Mai 2015 - 23:49

Il manque la déclaration suivante :

dim tune_trouve%

Wink

Ceci dit beau travail Klaus, le résultat est fluide.
Je pense que l' on peut vraiment se servir de ce programme
comme base des jeux avec des sprites
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 3 Empty
MessageSujet: Re: Des procédures pour la 2D    Des procédures pour la 2D  - Page 3 EmptyMar 26 Mai 2015 - 0:13

J'ai supprimé la ligne qui initialisait cette variable - c'était un résidu d'une tentative, et j'avais oublié de l'enlever.

Oui, ça marche déjà pas mal. On peut, pour chaque sprite, déclarer jusqu'à 63 zones "réactives" (des tunes). Ces zones réagissent à une collision, en donnant le numéro du sprite et le numéro du tune. Histoire de savoir exactement où le contact a eu lieu.

Il reste un truc à faire; les tunes sont pris en compte pour tous les sprites immobiles, susceptibles d'être touchés par un sprite en mouvement. Mais pour le sprite en mouvement, je ne gère pas encore les tunes. Mais c'est en cours. Le présent programme laisse déjà entrevoir, sous forme de maquette, ce que sera la détection de collision une fois que ce dernier aspect sera codé.
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 3 Empty
MessageSujet: Re: Des procédures pour la 2D    Des procédures pour la 2D  - Page 3 EmptyMar 26 Mai 2015 - 0:31

Bravo Klaus, c'est un excellent départ. Le principe et là et c'est rapide. Après il faudra que l'on teste avec plusieurs sprites pour voir si ça reste performant avec 50 sprites en mouvements par exemple. Si ça tient la cdence, avec 100 et si ça tient, avec 200.
Si ça tient avec 200 sprites, on peu quasiment dire qu'il n'y aurait pas de limite car peu de jeux font evoluer 200 sprites à l'écran... Mais il y en aura sans doute une avant.
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 3 Empty
MessageSujet: Re: Des procédures pour la 2D    Des procédures pour la 2D  - Page 3 EmptyMar 26 Mai 2015 - 0:47

Effectivement, à un moment donné, le problème des performances se posera. Je suis en 100 % Panoramic. C'est intentionnel, pour montrer le principe, la faisabilité.

Ensuite, l'idéal, ce serait que la collision serait implémentée dans le moteur de Panoramic. Je suis curieux de voir sur quel principe elle fonctionnera. Mais ce qui est sûr, c'est que la fonction de détection peut se coder comme une fonction de KGF.dll. A voir plus tard.
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 3 Empty
MessageSujet: Re: Des procédures pour la 2D    Des procédures pour la 2D  - Page 3 EmptyMar 26 Mai 2015 - 8:10

Je pense que l'on aura du nouveau bientôt par Jack car il semblait bien avancé sur le sujet. Le truc c'est que j'espère que ce sera directement dans le Panoramic classic et pas dans une version à part... Je croise les doigts et je pense ue je vais attendre un moi pour faire la seconde partie pour les collisions car ce sujet risque d'évoluer avec ces changements.
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 3 Empty
MessageSujet: Re: Des procédures pour la 2D    Des procédures pour la 2D  - Page 3 EmptyMer 27 Mai 2015 - 2:16

Je suis en train d'adapter le mécanisme à des collision de 3 types:
- sprite simple contre sprite simple
- sprite simple contre sprite avec tunes
- sprite avec tunes contre sprite avec tunes

Les premiers résultats sont prometteurs, et j'ai trouvé un algorithme qui donne des performances raisonnables, pour un programme codé en 100 % Panoramic. Autant dire qu'en compilé, se sera très rapide. En tout cas, les tests avancent bien.
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 3 Empty
MessageSujet: Re: Des procédures pour la 2D    Des procédures pour la 2D  - Page 3 EmptyMer 27 Mai 2015 - 8:26

Je m'en doutais comme tu n'avais rien mis hier. Tu peux mettre la proc que j'ai mis dans l'article aussi pour la détection circulaire, car c'est souvent utilisé aussi (le plus et de loin, c'est rectangulaire, après loin derriere c'est le cercle et le masque)
Et souvent en effet il y a une seule forme complexe (un vaisseau par exemple) et des détections rectangulaires pour le décor et les énemmis et les tirs pour des raisons de performances)
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 3 Empty
MessageSujet: Re: Des procédures pour la 2D    Des procédures pour la 2D  - Page 3 EmptyMer 27 Mai 2015 - 8:43

J'ai prévu d'ajouter la détection par cercle lorsque la détection par rectangle marchera. Pour le masque, cela ne me paraît pas faisable en Panoramic pur, pour des raisons de performance.
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 3 Empty
MessageSujet: Re: Des procédures pour la 2D    Des procédures pour la 2D  - Page 3 EmptyMer 27 Mai 2015 - 9:22

Voici une première version de détection de collision entre 2 sprites ayant chacun des tunes. J'ai pris mon sprite Andoid dans les deux cas. Il est posté ci-dessus, avec son image Android.bmp et son fichier des tunes Android_mask_tuned_list.txt. Le programme utilise les 4 flèches pour déplacer l'Android de droite, comme on veut. Dès qu'il touche l'Android de gauche, la collision est signalé. Voici les références numériques utilisées:

liste des sprites:
sprite 1 = Android fixe, à gauche, impénétrable
sprite 2 = Android mobile, à droite, impénétrable
sprite 3 = carré jaune, fixe, pénétrable

liste des tunes pour chaque Android:
1 = tête
2 = bras droit (à gauche de l'écran)
3 = bras gauche (à droite de l'écran)
4 = jambe droite (à gauche de l'écran)
5 = jambe gauche (à droite de l'écran)

Voici le code:
Code:
' 2d_utilities.bas

label clic, key

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 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 touché (ou 0 si non trouvé)
dim tune_collision_mobile% : ' numéro du tune touché (ou 0 si non trouvé)
dim scene_2d%              : ' numéro d'objet du scene2d
dim trace% : trace% = 0    : ' mettre 1 pour afficher une trace des calculs
dim i%, d%, dx%, dy%

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

' color 10,255,0,0
' 2d_image_copy 11,0,0,200,200
' creer_sprite(50,50,11,1)          : ' sprite rouge impénétrable
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

' color 10,0,0,255
' 2d_image_copy 11,0,0,200,200      : ' sprite bleu impénétrable
' creer_sprite(400,120,11,1)
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

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% = scancode
  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
    if sprite_collision%>0              : ' une collision a eu lieu ?
      message "collision avec sprite "+str$(sprite_collision%)+"  tune "+str$(tune_collision%)+"  touché par sprite 2 tune "+str$(tune_collision_mobile%)
      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%
  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$,",")
    s$ = mid$(s$,p%+1,100)        : ' ignorer 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
  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%
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 !
              ' ...à faire...
              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 n'a pas de tunes !
            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


En ligne 22, il y a une variable trace. On peut mettre sa valeur à 1 pour afficher une liste des calculs de détection...
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 3 Empty
MessageSujet: Re: Des procédures pour la 2D    Des procédures pour la 2D  - Page 3 EmptyMer 27 Mai 2015 - 10:41

T'inquiète Klaus, les Tunes permettront sans doute déjà de repondre à 99% des cas Wink Cette nouvelle souplesse permet déjà de retirer la pluspart des zones tranparentes du sprite. Ca permet aussi de faire un traitement pour une comportement particulier. Par exemple pour Barbarian, si on touche la zone tête avec la zone épée de l'autre sprite alors on déclenche l'animation "couper la tête" et on affiche la série de sprites correspondante sauf si on touche le tunne correpondant à l'épée avant, ce qui voudrait dire que le joueur s'est mis en protection.
Après pour le moment c'est à nous d'être malins et d'essayer de faire des formes les plus rectangulaires possibles et d'éviter au maximum les grosses formes triangulaires qui nécessiteraient beaucoup de Tunes pour avoir une précision de détection correcte (pour les petits triangles, 2 ou 3 tunes suffisent donc on s'en fiche Wink ).

En tout cas, le programme fonctionne et les collissions sont bien détéctées pour les zones correspondants au sprites
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 3 Empty
MessageSujet: Re: Des procédures pour la 2D    Des procédures pour la 2D  - Page 3 EmptyMer 27 Mai 2015 - 11:11

Et voici le programme de démo de collisions, avec l'affichage du nom des tunes concernés par une collision:
Code:
' 2d_utilities.bas

label clic, key

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

' color 10,255,0,0
' 2d_image_copy 11,0,0,200,200
' creer_sprite(50,50,11,1)          : ' sprite rouge impénétrable
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

' color 10,0,0,255
' 2d_image_copy 11,0,0,200,200      : ' sprite bleu impénétrable
' creer_sprite(400,120,11,1)
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

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% = scancode
  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 !
              ' ...à faire...
              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 n'a pas de tunes !
            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$ = ""
      end_if                            : ' fin traitement du tune touché
      if name_collision$="" then name_collision$ = "Tune "+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$ = ""
      end_if                            : ' fin traitement du tune touché
      if name_collision_mobile$="" then name_collision_mobile$ = "Tune "+tune_collision_mobile%    : ' nom par défaut
end_sub

Le fichier Android_mask_tuned_list.txt avec les noms:
Citation :
1,43,0,159,69,Tête
2,23,67,64,140,Bras droit
3,140,67,181,136,Bras gauche
4,51,131,96,200,Jambe droite
5,111,131,152,197,Jambe gauche
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 3 Empty
MessageSujet: Re: Des procédures pour la 2D    Des procédures pour la 2D  - Page 3 EmptyMer 27 Mai 2015 - 11:37

Nickel Wink
PS: Ah non, pas du tout nickel : Le commentaire qui donne le nom du programme ne correspond pas au programme !!
Intolérable ! catastrophique ! Dramatique ! C'est du grand n'importe quoi ...

... D'accord, je sors ...
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 3 Empty
MessageSujet: Re: Des procédures pour la 2D    Des procédures pour la 2D  - Page 3 EmptyMer 27 Mai 2015 - 11:41

Chez moi, le programme s'appelle bien "build_sprite_mask.bas" !

Mais je suis content que tu apprécies.
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 3 Empty
MessageSujet: Re: Des procédures pour la 2D    Des procédures pour la 2D  - Page 3 EmptyMer 27 Mai 2015 - 13:50

C'était une boutade, par ce que tu as laissé ' 2d_utilities.bas comme première ligne comme pour l'utilitaire pour construire les Tunes au lieu de mettre ' Programme de test des collisions entre plusieures Tunes par exemple. Mais bon tu as bien compris que c'était une boutade...
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 3 Empty
MessageSujet: Re: Des procédures pour la 2D    Des procédures pour la 2D  - Page 3 EmptyMer 27 Mai 2015 - 14:02

Dans tes fonctions, je pense que ce serait bien aussi d'avoir un copier_sprite(N1,N2) qui recopie le sprite N1 dans N2 (si N2 n'existe pas, il le créé, sinon il recopie l'image et les propriétés comme les tunes sont identiques, il faudra juste recopier les emplacement 6 et 7 du tableau s'il y en a ... carrément facile avec le tableau. Le seul truc un peu tordu c'est pour sauvegarder l'image du 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 3 Empty
MessageSujet: Re: Des procédures pour la 2D    Des procédures pour la 2D  - Page 3 EmptyMer 27 Mai 2015 - 22:12

C'est une bonne idée, et je vais y réfléchir.

Pour le moment, je finalise des collisions avec tunes - c'est presque prêt.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Contenu sponsorisé





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

Revenir en haut Aller en bas
 
Des procédures pour la 2D
Revenir en haut 
Page 3 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: