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

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

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

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

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

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

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

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

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

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

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

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

» fichier.exe
Des procédures pour la 2D  - Page 5 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 : -29%
DYSON V8 Origin – Aspirateur balai sans fil
Voir le deal
269.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
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 5 Empty
MessageSujet: Re: Des procédures pour la 2D    Des procédures pour la 2D  - Page 5 EmptyVen 12 Juin 2015 - 15:00

@Jean Claude:
J'ai pris 200x200 car c'est la taille maximale d'un sprite. Cela peur bien sûr être plus petit. Je reconfigurerai bientôt mon outil pour une taille paramétrable. Et rectangulaire est possible aussi...

@Jicehel:
Je en vois pas bien quel problème pose le nom que j'ai choisi? Faudra que tu m'expliques. Mais en réalité, n'importe quel nom ferait l'affaire. J'ai choisi ce schéma de nommage dans un double souci: éviter des conflits de noms de fichiers sur le disque, et avoir des noms auto-explicatifs.

Maintenant, pour les rotations de 90° à 90°, c'est assez simple. J'ai des fonctions dans KGF.dll qui font ça, et donc aussi bien le sprite lui-même que le masque peuvent être tournés ainsi. Et le fichier descriptif des tunes peut être assez facilement recalculé dans ce contexte - un peu de calcul à faire, mais rien de méchant. On pourrait intégrer dans l'outil, des boutons "Rotation 90° à droite" et "Rotation 90° à gauche".

La rotation de 45° est une toute autre paire de manches. J'ai bien des fonctions dans KGF.dll qui le font, donc pas de problème pour tourner l'image et le masque. Et le recalcul des définitions des tunes est facile aussi. Non, le problème réside dans la perte potentielle de parties d'image. Si le sprite à tourner a des parties visibles proche des coins, elles seront tout simplement tronquées (clipping). Ceci est vrai pour un sprite carré, mais plus encore pour un sprite rectangulaire. Il faut être absolument certain que toute la partie visible du sprite est inscrite dans un cercle centrée sur le centre du sprite, et dont le diamètre est égal à la longueur du plus petit côté du rectange. Alors oui, on peut faire une rotation de 45° !

Et voici mon programme de démo, avec la possibilité de déplacements en diagonale ! Les touches suivantes sont reconnues:
Code:

Direction         Touches normales   Pavé numérique
======================================================
gauche             flèche à gauche    4
droite             flèche à droite    6
haut               flèche en haut     8
bas                flèche en bas      2
haut gauche                           7
haut droite                           9
bas gauche                            1
bas droite                            3
Ceci marche en mode "numérique verrouillé" ou non. 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$, direct1%, direct2%, dx2%, dy2%

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:
  direct1% = 0
  direct2% = 0
  d% = key_down_code
  if (d%=37) or (d%=100) : ' gauche
        dx% = 0 - 1
        dy% = 0
        direct1% = 1
  end_if
  if (d%=38) or (d%=104) : ' haut
        dx% = 0
        dy% = 0 - 1
        direct1% = 2
  end_if
  if (d%=39) or (d%=102) : ' droite
        dx% = 1
        dy% = 0
        direct1% = 3
  end_if
  if (d%=40) or (d%=98) : ' bas
        dx% = 0
        dy% = 1
        direct1% = 4
  end_if
  if (d%=33) or (d%=105) : ' haut droite
        dx% = 0
        dy% = 0 - 1
        direct1% = 2
        dx2% = 1
        dy2% = 0
        direct2% = 3
  end_if
  if (d%=34) or (d%=99) : ' bas droite
        dx% = 0
        dy% = 1
        direct1% = 4
        dx2% = 1
        dy2% = 0
        direct2% = 3
  end_if
  if (d%=35) or (d%=97) : ' bas gauche
        dx% = 0
        dy% = 1
        direct1% = 4
        dx2% = 0 - 1
        dy2% = 0
        direct2% = 1
  end_if
  if (d%=36) or (d%=103) : ' haut gauche
        dx% = 0
        dy% = 0 - 1
        direct1% = 2
        dx2% = 0 - 1
        dy2% = 0
        direct2% = 1
  end_if

  if direct1%=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%,direct1%)  : ' 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
    if direct2%>0                      : ' test si déplacement en diagonale
   
    deplacer_sprite(sprite_mobile%,1,dx2%,dy2%)    : ' déplacement relatif
    tester_si_collision(sprite_mobile%,direct2%)  : ' 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

    end_if                              : ' fin test déplacement en diagonale
  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
                  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

        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
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 5 Empty
MessageSujet: Re: Des procédures pour la 2D    Des procédures pour la 2D  - Page 5 EmptyVen 12 Juin 2015 - 17:12

@Klaus,

déplacement en diagonale: testé, ça fonctionne impeccable.
Pour la taille des sprites c'est une bonne nouvelle.

Une remarque: pour faciliter les mises à jours de mon code pourrais-tu regrouper les variables indispensables dans une sub, ainsi je pourrais utiliser #include


@ Jicehel et Klaus.

Pour les rotations Photofiltre7 (gratuit) fait cela très bien et sans déformer l'image.
On peut jouer sur 2 fronts: rotation et inclinaison et ça donne des bons résultats, alors pourquoi se prendre la tête... Very Happy

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 5 Empty
MessageSujet: Re: Des procédures pour la 2D    Des procédures pour la 2D  - Page 5 EmptyVen 12 Juin 2015 - 17:25

C'est ça Jean-Claude. Le plus simple c'est de calculer un sprite à 45° et de s'assurer qu'il et propre. Après on peut utiliser les procédure de rotataion à 90° qui ne sont pas destructive.

@Klaus: le nom de ton programme ne pose aucun probème et correspond à son utilisation actuel, mais si on fait un programme pour le traitement des sprites qui fasse la rotation, la création de masques, de tunes, de changement de couleurs et autres utilitaires pratiques pour les sprites il ne correspondra plus. La création de masques et de tunes ne sera plus que l'une des possiblités, un des outils.
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 5 Empty
MessageSujet: Re: Des procédures pour la 2D    Des procédures pour la 2D  - Page 5 EmptyVen 12 Juin 2015 - 17:56

Exact. A ce moment-là, on conviendra d'un autre nom...

Voici une version qui isole toutes les définitions de variables globales pour les SUBs dans une SUB de définition. Ainsi, tout peut être inclus dans un module #INCLUDE.

Vous trouverez également une variable DoKGF% qui a la valeur 0. Laissez-là comme ça. C'est pour une évolution que je suis en train de mettre en place, pour pouvoir gérer la détection des collusions par une fonction DLL, pour optimiser les performances. Mais si vous laissez cette variable à 9, KGF.dll ne sera pas chargée et le programme fonctionnera comme avant.

Code:
' 2d_utilities.bas

' res% = dll_call6("DefineSprite",ns%,x%,y%,w%,h%,adr(nom$))
' res% = dll_call5("ChangeSpriteGeometry",ns%,x%,y%,w%,h%)
' res% = dll_call3("ChangeSpriteOptions",ns%,v%,s%)
' res% = dll_call2("SetSpriteTunes",ns%,object_internal(dl))
' res% = dll_call2("CopySpriteTunes",ns%,nsorg%)

label clic, key, close0


' ====== variables de configuration ========================================
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 trace% : trace% = 0    : ' mettre 1 pour afficher une trace des calculs
dim DoKGF% : DoKGF% = 0    : ' effectuer le travail par des fonctions KGF.dll

' ======= variables diverses pour le programme de démo ====================
dim scene_2d%              : ' numéro d'objet du scene2d
dim images$                : ' nom de dossier temporaire pour copier les images des sprites
dim i%, j%, d%, dx%, dy%, s$, sm$, direct1%, direct2%, dx2%, dy2%, res%
' ===================== fin des variables ===================================
variables_pour_sprites()   : ' déclarer les variables globales pour les SUBs

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 DoKGF%>0 then dll_on "KGF.dll"

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:
  direct1% = 0
  direct2% = 0
  d% = key_down_code
  if (d%=37) or (d%=100) : ' gauche
        dx% = 0 - 1
        dy% = 0
        direct1% = 1
  end_if
  if (d%=38) or (d%=104) : ' haut
        dx% = 0
        dy% = 0 - 1
        direct1% = 2
  end_if
  if (d%=39) or (d%=102) : ' droite
        dx% = 1
        dy% = 0
        direct1% = 3
  end_if
  if (d%=40) or (d%=98) : ' bas
        dx% = 0
        dy% = 1
        direct1% = 4
  end_if
  if (d%=33) or (d%=105) : ' haut droite
        dx% = 0
        dy% = 0 - 1
        direct1% = 2
        dx2% = 1
        dy2% = 0
        direct2% = 3
  end_if
  if (d%=34) or (d%=99) : ' bas droite
        dx% = 0
        dy% = 1
        direct1% = 4
        dx2% = 1
        dy2% = 0
        direct2% = 3
  end_if
  if (d%=35) or (d%=97) : ' bas gauche
        dx% = 0
        dy% = 1
        direct1% = 4
        dx2% = 0 - 1
        dy2% = 0
        direct2% = 1
  end_if
  if (d%=36) or (d%=103) : ' haut gauche
        dx% = 0
        dy% = 0 - 1
        direct1% = 2
        dx2% = 0 - 1
        dy2% = 0
        direct2% = 1
  end_if

  if direct1%=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%,direct1%)  : ' 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
    if direct2%>0                       : ' test si déplacement en diagonale
    
    deplacer_sprite(sprite_mobile%,1,dx2%,dy2%)     : ' déplacement relatif
    tester_si_collision(sprite_mobile%,direct2%)  : ' 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

    end_if                              : ' fin test déplacement en diagonale
  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 variables_pour_sprites()
' ======= variables globales utilisées par les procédures =================
  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é
end_sub


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
  if DoKGF%>0
    res% = dll_call6("DefineSprite",nsprite%,x%,y%,200,200,adr(nam$))
    res% = dll_call3("ChangeSpriteOptions",nsprite%,1,dur%)
  end_if
  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
  if DoKGF%>0
    res% = dll_call6("DefineSprite",nsprite%,x%,y%,200,200,adr(nam$))
    res% = dll_call3("ChangeSpriteOptions",nsprite%,1,dur%)
    res% = dll_call2("SetSpriteTunes",nsprite%,object_internal(dl%))
  end_if

  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 DoKGF%>0
    res% = dll_call6("DefineSprite",nsprite%,x%,y%,200,200,adr(nam$))
    res% = dll_call3("ChangeSpriteOptions",nsprite%,1,sprites(n%,3))
  end_if
  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
    if DoKGF%>0
      res% = dll_call2("CopySpriteTunes",nsprite%,n%)
    end_if
  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
                   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    :
            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 (ys%+hs)>=y%      : ' 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        
             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

        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 - 19:57, é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 5 Empty
MessageSujet: Re: Des procédures pour la 2D    Des procédures pour la 2D  - Page 5 EmptyVen 12 Juin 2015 - 18:53

Merci pour la possibilité #INCLUDE.

J'ai un problème de collision entre 2 sprites sans tunes (les pauvres Very Happy )

Plutôt que de mauvaises explications, télécharges le zip "vaisseau" (dans le dossier jeu_en_2D) et lance VaisseauSansTune.bas

Si tu tourne autours de l’astéroïde, ça bien dans un sens (aiguille d'une montre) mais pas dans l'autre.

Je pense n'avoir pas commis d'erreur dans la confection et la création des sprites.

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 5 Empty
MessageSujet: Re: Des procédures pour la 2D    Des procédures pour la 2D  - Page 5 EmptyVen 12 Juin 2015 - 19:59

Je pense que je viens de corriger ce bug dans la version postée ci-dessus. Cela concerne la sub tester_si_collision. Si tu la reprends dans le pos ci-dessus, ça devrait marcher.
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 5 Empty
MessageSujet: Re: Des procédures pour la 2D    Des procédures pour la 2D  - Page 5 EmptyVen 12 Juin 2015 - 20:46

Désolé, ça ne marche toujours pas.

C'est même pire qu'avant, car ça bloque en x et y.
1) As-tu vérifié si j'ai correctement créer les sprites ?
2) j'ai un doute avec 2D_IMAGE_COPY, est-ce qu'il ne laisse pas la trace de l'image au moment de sa création, ce qui expliquerait le bug ????

Autrement il y a une chose qui m’interpelle:

dans la dernière version il y a ceci:
Code:
' ======= variables diverses pour le programme de démo ====================
dim scene_2d%              : ' numéro d'objet du scene2d
dim images$                : ' nom de dossier temporaire pour copier les images des sprites
dim i%, j%, d%, dx%, dy%, s$, sm$, direct1%, direct2%, dx2%, dy2%, res%


Ces variables devrait se trouver dans  sub variables_pour_sprites(), vu qu'elles sont utilisées dans les SUB(s) Question

A+

PS: prends ton temps, car pour ce soir je décroche Very Happy
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 5 Empty
MessageSujet: Re: Des procédures pour la 2D    Des procédures pour la 2D  - Page 5 EmptyVen 12 Juin 2015 - 23:45

Je te poste cette version de mon programme de démo, que j'ai configuré de sorte que les 3 sprites impénétrables" sont des carrés sans tunes. Donc, le moindre contact provoque une collision qui est détectée. Et ce pour des mouvements quelque soit le sens.
Code:
' 2d_utilities.bas

' res% = dll_call6("DefineSprite",ns%,x%,y%,w%,h%,adr(nom$))
' res% = dll_call5("ChangeSpriteGeometry",ns%,x%,y%,w%,h%)
' res% = dll_call3("ChangeSpriteOptions",ns%,v%,s%)
' res% = dll_call2("SetSpriteTunes",ns%,object_internal(dl))
' res% = dll_call2("CopySpriteTunes",ns%,nsorg%)
' res% = dll_call6("CheckSpriteCollision",ns%,dir%,adr(sc%),adr(scm%),adr(tc%),adr(tcm%))

label clic, key, close0


' ====== variables de configuration ========================================
dim selection_sprite_1% : selection_sprite_1% = 0  : ' 0=carré rouge impénétrable
                                                  : ' 1=Android impénétrable
dim selection_sprite_2% : selection_sprite_2% = 0  : ' 0=carré bleu impénétrable
                                                  : ' 1=Android impénétrable
dim trace% : trace% = 0    : ' mettre 1 pour afficher une trace des calculs
dim DoKGF% : DoKGF% = 0    : ' effectuer le travail par des fonctions KGF.dll

' ======= variables diverses pour le programme de démo ====================
dim scene_2d%              : ' numéro d'objet du scene2d
dim images$                : ' nom de dossier temporaire pour copier les images des sprites
dim i%, j%, d%, dx%, dy%, s$, sm$, direct1%, direct2%, dx2%, dy2%, res%
' ===================== fin des variables ===================================
variables_pour_sprites()  : ' déclarer les variables globales pour les SUBs

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 DoKGF%>0 then dll_on "KGF.dll"

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,800,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:
  direct1% = 0
  direct2% = 0
  d% = key_down_code
  if (d%=37) or (d%=100) : ' gauche
        dx% = 0 - 1
        dy% = 0
        direct1% = 1
  end_if
  if (d%=38) or (d%=104) : ' haut
        dx% = 0
        dy% = 0 - 1
        direct1% = 2
  end_if
  if (d%=39) or (d%=102) : ' droite
        dx% = 1
        dy% = 0
        direct1% = 3
  end_if
  if (d%=40) or (d%=98) : ' bas
        dx% = 0
        dy% = 1
        direct1% = 4
  end_if
  if (d%=33) or (d%=105) : ' haut droite
        dx% = 0
        dy% = 0 - 1
        direct1% = 2
        dx2% = 1
        dy2% = 0
        direct2% = 3
  end_if
  if (d%=34) or (d%=99) : ' bas droite
        dx% = 0
        dy% = 1
        direct1% = 4
        dx2% = 1
        dy2% = 0
        direct2% = 3
  end_if
  if (d%=35) or (d%=97) : ' bas gauche
        dx% = 0
        dy% = 1
        direct1% = 4
        dx2% = 0 - 1
        dy2% = 0
        direct2% = 1
  end_if
  if (d%=36) or (d%=103) : ' haut gauche
        dx% = 0
        dy% = 0 - 1
        direct1% = 2
        dx2% = 0 - 1
        dy2% = 0
        direct2% = 1
  end_if

  if direct1%=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%,direct1%)  : ' 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
    if direct2%>0                      : ' test si déplacement en diagonale
   
    deplacer_sprite(sprite_mobile%,1,dx2%,dy2%)    : ' déplacement relatif
    tester_si_collision(sprite_mobile%,direct2%)  : ' 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

    end_if                              : ' fin test déplacement en diagonale
  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 variables_pour_sprites()
' ======= variables globales utilisées par les procédures =================
  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é
end_sub


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
  if DoKGF%>0
    res% = dll_call6("DefineSprite",nsprite%,x%,y%,200,200,adr(nam$))
    res% = dll_call3("ChangeSpriteOptions",nsprite%,1,dur%)
  end_if
  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
  if DoKGF%>0
    res% = dll_call6("DefineSprite",nsprite%,x%,y%,200,200,adr(nam$))
    res% = dll_call3("ChangeSpriteOptions",nsprite%,1,dur%)
    res% = dll_call2("SetSpriteTunes",nsprite%,object_internal(dl%))
  end_if

  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 DoKGF%>0
    res% = dll_call6("DefineSprite",nsprite%,x%,y%,200,200,adr(nam$))
    res% = dll_call3("ChangeSpriteOptions",nsprite%,1,sprites(n%,3))
  end_if
  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
    if DoKGF%>0
      res% = dll_call2("CopySpriteTunes",nsprite%,n%)
    end_if
  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 DoKGF%=1 then res% = dll_call5("ChangeSpriteGeometry",n%,sprites(n%,4),sprites(n%,5),sprites(n%,0),sprites(n%,1))
  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
  if DoKGF%=1 then res% = dll_call5("ChangeSpriteGeometry",n%,sprites(n%,4),sprites(n%,5),sprites(n%,0),sprites(n%,1))
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
  if DoKGF%=1 then res% = dll_call5("ChangeSpriteGeometry",n%,sprites(n%,4),sprites(n%,5),sprites(n%,0),sprites(n%,1))
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
  if DoKGF%=1 then res% = dll_call5("ChangeSpriteGeometry",n%,sprites(n%,4),sprites(n%,5),sprites(n%,0),sprites(n%,1))
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"
    if DoKGF%=1 then res% = dll_call3("ChangeSpriteOptions",n%,0,sprites(n%,3))
  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"
    if DoKGF%=1 then res% = dll_call3("ChangeSpriteOptions",n%,1,sprites(n%,3))
  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" ?
  if DoKGF%=1
    res% = dll_call6("CheckSpriteCollision",n%,dir%,adr(sprite_collision%),adr(sprite_collision_mobile%),adr(tune_collision%),adr(tune_collision_mobile%))
    exit_sub
  end_if
  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
                  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    :
            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 (ys%+hs)>=y%      : ' 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        :
            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

        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

Je n'ai pas le temps ce soir de regarder ton code de façon approfondie - je pourrai peut-être le faire demain. Mais la démo ci-dessus prouve que la détection marche bien pour les sprites sans tunes...

En ce qui concerne les variables, je vais regarder cela - tu auras de mes nouvelles.
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 5 Empty
MessageSujet: Re: Des procédures pour la 2D    Des procédures pour la 2D  - Page 5 EmptySam 13 Juin 2015 - 6:37

Milles excuses Klaus,

Embarassed Embarassed Embarassed Embarassed Embarassed Embarassed Embarassed Embarassed Embarassed Embarassed Embarassed Embarassed Embarassed Embarassed Embarassed

C'est le mien, de code, qui n'est pas bon.
Toutefois, on peut en tirer un enseignement. il faut que tu ajoutes 2 variables pour remplacer 200 dans les appels de SUB. Car j'avais tout simplement oublié de changer ces 2 paramètres avec des sprites de 50x50. Donc forcément, la collision se Faisait à 150 Px du bord des sprites.

Tu as bien fait de ne pas rechercher hier soir.


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 5 Empty
MessageSujet: Re: Des procédures pour la 2D    Des procédures pour la 2D  - Page 5 EmptySam 13 Juin 2015 - 9:57

Ah, je n'avais pas pensé à ce coup-là ! Voici donc une version des SUB avec paramétrage de la taille des sprites. J'ai également revu la procédure de définition de variables pour y inclure les quelques variables qui servent dans la procédure, en vue du #INCLUDE.
Code:
' 2d_utilities.bas

' res% = dll_call6("DefineSprite",ns%,x%,y%,w%,h%,adr(nom$))
' res% = dll_call5("ChangeSpriteGeometry",ns%,x%,y%,w%,h%)
' res% = dll_call3("ChangeSpriteOptions",ns%,v%,s%)
' res% = dll_call2("SetSpriteTunes",ns%,object_internal(dl))
' res% = dll_call2("CopySpriteTunes",ns%,nsorg%)
' res% = dll_call6("CheckSpriteCollision",ns%,dir%,adr(sc%),adr(scm%),adr(tc%),adr(tcm%))

label clic, key, close0


' ====== variables de configuration ========================================
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% = 1  : ' 0=carré bleu impénétrable
                                                  : ' 1=Android impénétrable
dim trace% : trace% = 0    : ' mettre 1 pour afficher une trace des calculs
dim DoKGF% : DoKGF% = 0    : ' effectuer le travail par des fonctions KGF.dll

' ======= variables diverses pour le programme de démo ====================
dim i%, j%, d%, dx%, dy%, s$, sm$, direct1%, direct2%, dx2%, dy2%
' ===================== fin des variables ===================================
variables_pour_sprites()  : ' déclarer les variables globales pour les SUBs

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 DoKGF%>0 then dll_on "KGF.dll"

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,200,200,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,200,200,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,200,200,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,200,200,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,200,200,180,11,0)

copier_sprite("Android initialement fixe copié",1,800,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:
  direct1% = 0
  direct2% = 0
  d% = key_down_code
  if (d%=37) or (d%=100) : ' gauche
        dx% = 0 - 1
        dy% = 0
        direct1% = 1
  end_if
  if (d%=38) or (d%=104) : ' haut
        dx% = 0
        dy% = 0 - 1
        direct1% = 2
  end_if
  if (d%=39) or (d%=102) : ' droite
        dx% = 1
        dy% = 0
        direct1% = 3
  end_if
  if (d%=40) or (d%=98) : ' bas
        dx% = 0
        dy% = 1
        direct1% = 4
  end_if
  if (d%=33) or (d%=105) : ' haut droite
        dx% = 0
        dy% = 0 - 1
        direct1% = 2
        dx2% = 1
        dy2% = 0
        direct2% = 3
  end_if
  if (d%=34) or (d%=99) : ' bas droite
        dx% = 0
        dy% = 1
        direct1% = 4
        dx2% = 1
        dy2% = 0
        direct2% = 3
  end_if
  if (d%=35) or (d%=97) : ' bas gauche
        dx% = 0
        dy% = 1
        direct1% = 4
        dx2% = 0 - 1
        dy2% = 0
        direct2% = 1
  end_if
  if (d%=36) or (d%=103) : ' haut gauche
        dx% = 0
        dy% = 0 - 1
        direct1% = 2
        dx2% = 0 - 1
        dy2% = 0
        direct2% = 1
  end_if

  if direct1%=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%,direct1%)  : ' 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
    if direct2%>0                      : ' test si déplacement en diagonale
   
    deplacer_sprite(sprite_mobile%,1,dx2%,dy2%)    : ' déplacement relatif
    tester_si_collision(sprite_mobile%,direct2%)  : ' 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

    end_if                              : ' fin test déplacement en diagonale
  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 variables_pour_sprites()
' ======= variables globales utilisées par les procédures =================
  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 images$                : ' nom de dossier temporaire pour copier les images des sprites
  dim scene_2d%              : ' numéro d'objet du scene2d
  dim resx%                  : ' variable de résltat pour les fonctions dfe KGF.dll
end_sub


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%,w%,h%,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) = w%      : ' mémoriser sa largeur
  sprites(nsprite%,1) = h%      : ' 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
  if DoKGF%>0
    resx% = dll_call6("DefineSprite",nsprite%,x%,y%,200,200,adr(nam$))
    resx% = dll_call3("ChangeSpriteOptions",nsprite%,1,dur%)
  end_if
  display
end_sub

sub creer_sprite_avec_tunes(nam$,x%,y%,w%,h%,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) = w%        : ' mémoriser sa largeur
  sprites(nsprite%,1) = h%        : ' 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
  if DoKGF%>0
    resx% = dll_call6("DefineSprite",nsprite%,x%,y%,200,200,adr(nam$))
    resx% = dll_call3("ChangeSpriteOptions",nsprite%,1,dur%)
    resx% = dll_call2("SetSpriteTunes",nsprite%,object_internal(dl%))
  end_if

  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 DoKGF%>0
    resx% = dll_call6("DefineSprite",nsprite%,x%,y%,200,200,adr(nam$))
    resx% = dll_call3("ChangeSpriteOptions",nsprite%,1,sprites(n%,3))
  end_if
  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
    if DoKGF%>0
      resx% = dll_call2("CopySpriteTunes",nsprite%,n%)
    end_if
  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 DoKGF%=1 then resx% = dll_call5("ChangeSpriteGeometry",n%,sprites(n%,4),sprites(n%,5),sprites(n%,0),sprites(n%,1))
  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
  if DoKGF%=1 then resx% = dll_call5("ChangeSpriteGeometry",n%,sprites(n%,4),sprites(n%,5),sprites(n%,0),sprites(n%,1))
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
  if DoKGF%=1 then resx% = dll_call5("ChangeSpriteGeometry",n%,sprites(n%,4),sprites(n%,5),sprites(n%,0),sprites(n%,1))
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
  if DoKGF%=1 then resx% = dll_call5("ChangeSpriteGeometry",n%,sprites(n%,4),sprites(n%,5),sprites(n%,0),sprites(n%,1))
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"
    if DoKGF%=1 then resx% = dll_call3("ChangeSpriteOptions",n%,0,sprites(n%,3))
  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"
    if DoKGF%=1 then resx% = dll_call3("ChangeSpriteOptions",n%,1,sprites(n%,3))
  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 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" ?
  if DoKGF%=1
    res%x = dll_call6("CheckSpriteCollision",n%,dir%,adr(sprite_collision%),adr(sprite_collision_mobile%),adr(tune_collision%),adr(tune_collision_mobile%))
    if res%x=1
      message str$(sprite_collision%)+"/"+str$(tune_collision%)+"<->"+str$(sprite_collision_mobile%)+"/"+str$(tune_collision_mobile%)

    end_if
    exit_sub
  end_if
  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
                  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    :
            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 (ys%+hs)>=y%      : ' 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        :
            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

        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
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 5 Empty
MessageSujet: Re: Des procédures pour la 2D    Des procédures pour la 2D  - Page 5 EmptySam 13 Juin 2015 - 10:17

Là on peut dire que l'on a un beau jeu de procédure pour faire fonctionner les sprites avec la version actuelle de Panoramic. Plus qu'à voir après éventuellement si on peut encore optimiser le code pour quand il y a beaucoup de sprites, mais c'est déjà tout a fait satisfaisant pour une utilisation standard.
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 5 Empty
MessageSujet: Re: Des procédures pour la 2D    Des procédures pour la 2D  - Page 5 EmptySam 13 Juin 2015 - 13:27

@Klaus,
pour le moment, ça marche super bien.

J' envisage de choisir un sprite (mobile et sans tune, pour le moment), en fonction de la touche du clavier qui a été appuyée.
EX: l'appuis sur la flèche droite, ce qui charge le sprite orienté vers la droite, fait le déplacement et teste les éventuelles collisions.
Bien sûr je dois avoir préalablement crée le sprite orienté vers la droite.
Je vois bien qu'il faut modifier le sous-programme clic pour changer l'image en fonction de la touche enfoncée.

Mon idée serait d'avoir:
1) dans sous-programme clic une détection du choix du programmeur (avec changement d'image ou pas)
2) si oui avoir une sub qui charge le bon sprite en fonction de la touche choisie.
3) dès que la touche est relachée le sprite d'origine remplace (revient) le précédent.

Le but: si un véhicule se dirige vers le haut de l'écran, alors son image est orientée avec l'avant du véhicule vers le haut, etc....

Je te demande de me donner ton avis, mais sache que ce n'est pas pressé, ce Weekend je ne programme pas pour cause de 24h du Mans, et de toute façon je n'ai pas terminer mon check-list sur l'étude et les teste de ta production. Car mine de rien, c'est pas si simple, mais une fois compris et assimilé ça va largement simplifié le codage de jeux en 2D.

Bon Weekend.
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 5 Empty
MessageSujet: Re: Des procédures pour la 2D    Des procédures pour la 2D  - Page 5 EmptySam 13 Juin 2015 - 20:58

Vu que Jack a fait un éditeur pour PANGINE2D (que je ne pensais pas arriver si vite), tu as encore plus de temps devant toi, car je vais essayer PANGINE2D.
Il n'en reste pas moins que tout ton travail reste utile pour les inconditionnels de Panoramic (pour la 2D).

Je ne manquerait pas de vous dire (je ne te vouvoie pas, je parle à tous) ce qui est bien et moins bien avec PANGINE2D.

A+
Revenir en haut Aller en bas
Contenu sponsorisé





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

Revenir en haut Aller en bas
 
Des procédures pour la 2D
Revenir en haut 
Page 5 sur 5Aller à la page : Précédent  1, 2, 3, 4, 5
 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: