FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  FAQFAQ  RechercherRechercher  S'enregistrerS'enregistrer  MembresMembres  GroupesGroupes  Connexion  
Derniers sujets
» PPE...le retour ?...
par Yannick Aujourd'hui à 8:34

» Question et réponse sur l'objet TIMER
par Marc37 Aujourd'hui à 6:16

» MasterMind Alphabétique Français
par Marc37 Aujourd'hui à 3:15

» Illusion d'optique
par Marc37 Aujourd'hui à 3:09

» Rotation de bitmap
par Marc37 Aujourd'hui à 2:50

» Windows Defender détecte un trojan dans Panoramic (résolu)
par JL35 Hier à 20:19

» Compilateur FBPano
par jean_debord Hier à 19:08

» Quelle option est cochée ?
par Klaus Hier à 15:22

» KGF_dll - nouvelles versions
par Yannick Hier à 15:21

» Sleep ; une alternative de PAUSE
par Marc37 Mer 22 Fév 2017 - 22:57

» New: Maître-expert alphabétique
par Marc37 Mer 22 Fév 2017 - 16:07

» Histoire d' en rire 2
par Yannick Mer 22 Fév 2017 - 14:42

» GetParent : Utile pas pour deux sous
par papydall Mar 21 Fév 2017 - 15:44

» Univers sans fin
par jjn4 Lun 20 Fév 2017 - 17:55

» Palette de couleurs
par jjn4 Lun 20 Fév 2017 - 17:51

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Février 2017
LunMarMerJeuVenSamDim
  12345
6789101112
13141516171819
20212223242526
2728     
CalendrierCalendrier

Partagez | 
 

 début de programme pour l'article

Voir le sujet précédent Voir le sujet suivant Aller en bas 
AuteurMessage
Jicehel



Nombre de messages : 5783
Age : 44
Localisation : 77500
Date d'inscription : 19/04/2011

MessageSujet: début de programme pour l'article   Sam 4 Juil 2015 - 15:40

Bonjour,

Je voulais faire un article vite fait pour commencer à expliquer la gestion des sprites telle que Klaus nous l'a proposé (pour le moment, sans gestion des tunes pour commencer plus simplement), mais j'ai dû faire une erreur quelque part dans ma gestion des collision, mais comme je pars jusqu'à demain soir, pas le temps de chercher.

Je vous mets le source et les sprites

Code:
label clic

dim sprites(100,7)        : ' jusqu'à 500 sprites
                          : ' ,0)=largeur
                          : '  1)=hauteur
                          : '  2)=visible/invisible ,
                          : '  3)=impénétrable
                          : '  4)=coordonnée x
                          : '  5)=coordonnée y
                          : '  6)=inutilisé dans ce tutoriel
                          : '  7)=inutilisé dans ce tutoriel
dim snames$(100)          : ' noms des sprites
dim nsprite%              : ' dernier numéro de sprite créé
dim sprite_trouve%        : ' numéro du sprite trouvé par un clic (ou 0 si non trouvé)
dim sprite_collision%    : ' numéro du sprite touché par une collision
dim scene_2d%            : ' numéro d'objet du scene2d
dim i%, j%, d%, dx, dy, dxa, dya
dim vaisseau%,asteroide%, collision%  : ' Mémorisation des numéros de sprite
dim collision$
scene_2d% = 17            : ' juste un exemple
scene2d scene_2d% :full_space scene_2d%  : ' créer le scene2d
sprite_target_is scene_2d%    :  ' assurer du bon ciblage
on_click scene_2d%,clic
full_space 0

nsprite% = 0
creer_sprite("vaisseau",100,100,160,160,"vaisseau.bmp",1,1) : vaisseau% = nsprite%
creer_sprite("vaisseau_i",100,100,160,160,"vaisseau_i.bmp",1,0)
dx = 5 : dy = 0 : ' On définit comment notre vaisseau se déplace
creer_sprite("asteroide",200,300,160,160,"asteroide.bmp",1,1) : asteroide% = nsprite%
dya = 0-5
creer_sprite("collision",400,400,350,75,"collision.bmp",0,0) : collision% = nsprite%

for j% = 1 to 3 : ' On fait 3 boucles d'aller / retour
  for i% = 1 to 200
      deplacer_sprite(vaisseau%,1,dx,dy)
      if dya < 0 and sprites(asteroide%,5)< 5 then dya = 0 - dya
      if dya > 0 and sprites(asteroide%,5)  > (height(0) - sprites(asteroide%,1)) then dya = 0 - dya
      dxa = rnd(16) - 7
      if dxa < 0 and sprites(asteroide%,4)< 1 then dxa = 0 - dxa
      if dxa > 0 and sprites(asteroide%,4)  > (width(0) - sprites(asteroide%,0)) then dxa = 0 - dxa
      deplacer_sprite(asteroide%,1,dxa,dya)
      tester_si_collision(vaisseau%)
      if sprite_collision% > 0
            ' montrer_sprite(collision%)
            message "Collision"
      else
            ' cacher_sprite(collision%)
      end_if
  next i%
  cacher_sprite(vaisseau%)    : ' On masque le sprite du vaisseau qui va vers la droite
  sprites(vaisseau%+1,4) = sprites(vaisseau%,4)  : ' On met a jour la position du vaiseau caché
  sprites(vaisseau%+1,5) = sprites(vaisseau%,5)
  montrer_sprite(vaisseau%+1) : ' On affiche le sprite du vaisseau qui va à gauche
  for i% = 1 to 200
      deplacer_sprite(vaisseau%+1,1,0-dx,0-dy)
      if dya < 0 and sprites(asteroide%,5)< 5 then dya = 0 - dya
      if dya > 0 and sprites(asteroide%,5)  > (height(0) - sprites(asteroide%,1)) then dya = 0 - dya
      dxa = rnd(16) - 7
      if dxa < 0 and sprites(asteroide%,4)< 1 then dxa = 0 - dxa
      if dxa > 0 and sprites(asteroide%,4)  > (width(0) - sprites(asteroide%,0)) then dxa = 0 - dxa
      deplacer_sprite(asteroide%,1,dxa,dya)
      tester_si_collision(vaisseau%+1)
      if sprite_collision% > 0
'            montrer_sprite(collision%)
            message "Collision"
      else
'            cacher_sprite(collision%)
      end_if
  next i%
  cacher_sprite(vaisseau%+1)    : ' On masque le sprite du vaisseau qui va vers la droite
  sprites(vaisseau%,4) = sprites(vaisseau%+1,4)  : ' On met a jour la position du vaiseau caché
  sprites(vaisseau%,5) = sprites(vaisseau%+1,5)
  montrer_sprite(vaisseau%)    : ' On affiche le sprite du vaisseau qui va à gauche
next j%
end


sub creer_sprite(nam$,x%,y%,largeur%,hauteur%,img$,dur%,visible%)
  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) = largeur% : ' mémoriser sa largeur
  sprites(nsprite%,1) = hauteur% : ' et sa hauteur
  sprite_file_load nsprite%,img$ : ' copier une image dans le sprite
  if visible% = 0 then sprites(nsprite%,2) = 1 : cacher_sprite(nsprite%)  : ' masquer le sprite "invisible"
  if visible% = 1 then sprites(nsprite%,2) = 0 : montrer_sprite(nsprite%)  : ' afficher le sprite "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        : ' inutilisé dans ce tutoriel
  sprites(nsprite%,7) = 0        : ' inutilisé dans ce tutoriel
  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
  sprite_position n%,sprites(n%,4)+(1-sprites(n%,2))*4000,sprites(n%,5) : ' positionner le sprite
  display
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%,sprites(n%,4) + 4000    : ' déplacer hors de la vue
    sprites(n%,2) = 0                        : ' signaler "invisible"
  end_if
  display
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%,sprites(n%,4) - 4000    : ' replacer dans la partie visible
    sprites(n%,2) = 1                        : ' signaler "visible"
  end_if
  display
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é"
  if number_click<>scene_2d% then exit : ' on n'a pas cliqué dans le scene2d ?
  if nsprite%=0 then exit_sub          : ' pas de sprites créés ?
  x% = mouse_x_left_down(scene_2d%)    : ' mémoriser la position horizontale du clic
  y% = mouse_y_left_down(scene_2d%)    : ' mémoriser la position verticale du clic
  for i%=nsprite% to 1 step -1        : ' boucle sur tous les sprites
    xs% = sprite_x_position(i%)        : ' mémoriser la position horizontale du sprite i%
    ys% = sprite_y_position(i%)        : ' mémoriser la position verticale dusprite i%
    if (xs%<x%)                        : ' le bord gauche du sprite est plus à gauche que l'abscisse du clic ?
      if (ys%<y%)                      : ' le bord haut du sprite est plus haute que l'ordonnée du sprite ?
        if xs%+sprites(i%,0)>=x%      : ' le bord droit du sprite est plus à droite que l'abscisse du clic ?
          if ys%+sprites(i%,1)>=y%    : ' le bord bas du sprite est plus en bas que l'ordonnée du clic ?
              sprite_trouve% = i%      : ' alors, on a trouvé le sprite
              exit_sub                : ' et on sort
          end_if                      : ' fin test sur le bord bas du sprite
        end_if                        : ' fin test sur le bord droit du sprite
      end_if                          : ' fin test sur le bord haut du sprite
    end_if                            : ' fin test sur le bord gauche du sprite
  next i%                              : ' fin boucle sur les sprites
end_sub


' ***** clic dans la scene2d
clic:
  chercher_sprite_selon_clic()
  if sprite_trouve%>0
    caption 0,"clic sur sprite "+str$(sprite_trouve%)+"="+snames$(sprite_trouve%)+" sans tune"
  else
    caption 0,"aucun sprite cliqué"
  end_if
return

sub tester_si_collision(n%)
  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"
  if nsprite%<2 then exit_sub          : ' pas de collisions possibles ?
  if sprites(n%,2)=0 then exit_sub    : ' le sprite mobile est "invisible" si oui, pas de collision
  if sprites(n%,3)=0 then exit_sub    : ' le sprite mobile est "pénétrable" si oui, on ne détecte pas de collisions
  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 and sprites(i%,2) <>0              : ' sprite en dur ?
          Collision_AABB(x%,y%,w,h,sprites(i%,4),sprites(i%,5),sprites(i%,0), sprites(i%,1))
          if collision$ = "OK" then sprite_collision% = i% : exit_sub
      end_if                          : ' fin test sprite en dur
    end_if                            : ' fin test sur sprite "autre"
  next i%                              : ' fin boucle sur les sprites
end_sub

rem ============================================================================
SUB Collision_AABB(r1_x%,r1_y%,r1_width,r1_height,r2_x%,r2_y%, r2_width,r2_height)
  Collision$="OK"
  IF ((r2_x% >= (r1_x% + r1_width)) OR ((r2_x% + r2_width) <= r1_x%) OR (r2_y% >= (r1_y% + r1_height)) OR ((r2_y% + r2_height) <= r1_y%)) THEN Collision$=""
END_SUB

Et les sprites sont ici: fichier zip: Collisions_sprites.zip

A demain et désolé, l'article n'est pas avancé plus faute de temps ...


Dernière édition par Jicehel le Lun 6 Juil 2015 - 2:04, édité 1 fois
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
silverman



Nombre de messages : 326
Age : 44
Localisation : Picardie
Date d'inscription : 19/03/2015

MessageSujet: Re: début de programme pour l'article   Dim 5 Juil 2015 - 13:24

J'ai limité à 2 aller-retour et fait apparaitre des "bounding box" pour montrer le pb. Il semble se situer dans la routine de collisions.
Les "bounding box" sont très utiles pour déboguer, tu devrais ajouter des subs pour les créer automatiquement.

Code:

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)=inutilisé dans ce tutoriel
                          : '  7)=inutilisé dans ce tutoriel
dim snames$(500)          : ' noms des sprites
dim nsprite%              : ' dernier numéro de sprite créé
dim sprite_trouve%        : ' numéro du sprite trouvé par un clic (ou 0 si non trouvé)
dim sprite_collision%    : ' numéro du sprite touché par une collision
dim scene_2d%            : ' numéro d'objet du scene2d
dim i%, j%, d%, dx, dy, dxa, dya
dim vaisseau%,asteroide%, collision%  : ' Mémorisation des numéros de sprite
dim collision$
scene_2d% = 17            : ' juste un exemple
scene2d scene_2d%        : ' créer le scene2d
sprite_target_is scene_2d%    :  ' assurer du bon ciblage

label clic

on_click scene_2d%,clic
full_space 0

' debogage #####################################################################
picture 6
full_space 6
2d_target_is 6
image 7
color 6,255,255,255
2d_image_copy 7,100,100,260,260
sprite 100   :' bounding box blanche = vaisseau
sprite_image_load 100,7
color 6,0,255,255
2d_image_copy 7,100,100,260,260
sprite 101   :' bounding box turquoise = asteroide
sprite_image_load 101,7
' ##############################################################################


full_space scene_2d%
nsprite% = 0
creer_sprite("vaisseau",100,100,160,160,"vaisseau.bmp",1,1)
vaisseau% = nsprite%
creer_sprite("vaisseau_i",100,100,160,160,"vaisseau_i.bmp",1,0)
dx = 5 : dy = 0 : ' On définit comment notre vaisseau se déplace
creer_sprite("asteroide",200,300,160,160,"asteroide.bmp",1,1)
asteroide% = nsprite%
creer_sprite("collision",300,400,509,110,"collision.bmp",0,0)
collision% = nsprite%
dya = 0-5
for j% = 1 to 2 : ' On fait 5 boucles d'aller / retour
  for i% = 1 to 200
      deplacer_sprite(vaisseau%,1,dx,dy)
      if dya < 0 and sprites(asteroide%,5)< 5 then dya = 0 - dya
      if dya > 0 and sprites(asteroide%,5)  > (height(0) - sprites(asteroide%,1)) then dya = 0 - dya
      dxa = rnd(16) - 7
      if dxa < 0 and sprites(asteroide%,4)< 1 then dxa = 0 - dxa
      if dxa > 0 and sprites(asteroide%,4)  > (width(0) - sprites(asteroide%,0)) then dxa = 0 - dxa
      deplacer_sprite(asteroide%,1,dxa,dya)
      tester_si_collision(vaisseau%)
      if sprite_collision% > 0
            montrer_sprite(collision%)
' debogage #####################################################################
wait 150
' ##############################################################################
      else
            cacher_sprite(collision%)
      end_if
  next i%
  cacher_sprite(vaisseau%)    : ' On masque le sprite du vaisseau qui va vers la droite
  sprites(vaisseau%+1,4) = sprites(vaisseau%,4)  : ' On met a jour la position du vaiseau caché
  sprites(vaisseau%+1,5) = sprites(vaisseau%,5)
  montrer_sprite(vaisseau%+1) : ' On affiche le sprite du vaisseau qui va à gauche
  for i% = 1 to 200
      deplacer_sprite(vaisseau%+1,1,0-dx,0-dy)
      if dya < 0 and sprites(asteroide%,5)< 5 then dya = 0 - dya
      if dya > 0 and sprites(asteroide%,5)  > (height(0) - sprites(asteroide%,1)) then dya = 0 - dya
      dxa = rnd(16) - 7
      if dxa < 0 and sprites(asteroide%,4)< 1 then dxa = 0 - dxa
      if dxa > 0 and sprites(asteroide%,4)  > (width(0) - sprites(asteroide%,0)) then dxa = 0 - dxa
      deplacer_sprite(asteroide%,1,dxa,dya)
      tester_si_collision(vaisseau%+1)
      if sprite_collision% > 0
            montrer_sprite(collision%)
' debogage #####################################################################
wait 150
' ##############################################################################
      else
            cacher_sprite(collision%)
      end_if
  next i%
  cacher_sprite(vaisseau%+1)    : ' On masque le sprite du vaisseau qui va vers la droite
  sprites(vaisseau%,4) = sprites(vaisseau%+1,4)  : ' On met a jour la position du vaiseau caché
  sprites(vaisseau%,5) = sprites(vaisseau%+1,5)
  montrer_sprite(vaisseau%)    : ' On affiche le sprite du vaisseau qui va à gauche
next j%



END
' +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
' +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
' +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
sub creer_sprite(nam$,x%,y%,largeur%,hauteur%,img$,dur%,visible%)
  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) = largeur% : ' mémoriser sa largeur
  sprites(nsprite%,1) = hauteur% : ' et sa hauteur
  sprite_file_load nsprite%,img$ : ' copier une image dans le sprite
  if visible% = 0 then sprites(nsprite%,2) = 1 : cacher_sprite(nsprite%)  : ' masquer le sprite "invisible"
  if visible% = 1 then sprites(nsprite%,2) = 0 : montrer_sprite(nsprite%)  : ' afficher le sprite "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        : ' inutilisé dans ce tutoriel
  sprites(nsprite%,7) = 0        : ' inutilisé dans ce tutoriel
  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
  sprite_position n%,sprites(n%,4)+(1-sprites(n%,2))*4000,sprites(n%,5) : ' positionner le sprite
  display
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%,sprites(n%,4) + 4000    : ' déplacer hors de la vue
    sprites(n%,2) = 0                        : ' signaler "invisible"
  end_if
  display
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%,sprites(n%,4) - 4000    : ' replacer dans la partie visible
    sprites(n%,2) = 1                        : ' signaler "visible"
  end_if
  display
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é"
  if number_click<>scene_2d% then exit : ' on n'a pas cliqué dans le scene2d ?
  if nsprite%=0 then exit_sub          : ' pas de sprites créés ?
  x% = mouse_x_left_down(scene_2d%)    : ' mémoriser la position horizontale du clic
  y% = mouse_y_left_down(scene_2d%)    : ' mémoriser la position verticale du clic
  for i%=nsprite% to 1 step -1        : ' boucle sur tous les sprites
    xs% = sprite_x_position(i%)        : ' mémoriser la position horizontale du sprite i%
    ys% = sprite_y_position(i%)        : ' mémoriser la position verticale dusprite i%
    if (xs%<x%)                        : ' le bord gauche du sprite est plus à gauche que l'abscisse du clic ?
      if (ys%<y%)                      : ' le bord haut du sprite est plus haute que l'ordonnée du sprite ?
        if xs%+sprites(i%,0)>=x%      : ' le bord droit du sprite est plus à droite que l'abscisse du clic ?
          if ys%+sprites(i%,1)>=y%    : ' le bord bas du sprite est plus en bas que l'ordonnée du clic ?
              sprite_trouve% = i%      : ' alors, on a trouvé le sprite
              exit_sub                : ' et on sort
          end_if                      : ' fin test sur le bord bas du sprite
        end_if                        : ' fin test sur le bord droit du sprite
      end_if                          : ' fin test sur le bord haut du sprite
    end_if                            : ' fin test sur le bord gauche du sprite
  next i%                              : ' fin boucle sur les sprites
end_sub


' ***** clic dans la scene2d
clic:
  chercher_sprite_selon_clic()
  if sprite_trouve%>0
    caption 0,"clic sur sprite "+str$(sprite_trouve%)+"="+snames$(sprite_trouve%)+" sans tune"
  else
    caption 0,"aucun sprite cliqué"
  end_if
return

sub tester_si_collision(n%)
  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"
  if nsprite%<2 then exit_sub          : ' pas de collisions possibles ?
  if sprites(n%,2)=0 then exit_sub    : ' le sprite mobile est "invisible" si oui, pas de collision
  if sprites(n%,3)=0 then exit_sub    : ' le sprite mobile est "pénétrable" si oui, on ne détecte pas de collisions
  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 ?
          Collision_AABB(x%,y%,w,h,sprites(i%,4),sprites(i%,5),sprites(i%,0), sprites(i%,1))
          if collision$ = "OK" then  sprite_collision% = i% : exit_for
      end_if                              : ' fin test sprite en dur
    end_if                                : ' fin test sur sprite "autre"
  next i%                            : ' fin boucle sur les sprites
end_sub

rem ============================================================================
SUB Collision_AABB(r1_x%,r1_y%,r1_width,r1_height,r2_x%,r2_y%, r2_width,r2_height)
  Collision$="OK"
' debogage #####################################################################
sprite_position 100,r1_x%,r1_y%   :' bounding box blanche = vaisseau
sprite_position 101,r2_x%,r2_y%   :' bounding box turquoise = asteroide
' ##############################################################################
  IF ((r2_x% >= (r1_x% + r1_width)) OR ((r2_x% + r2_width) <= r1_x%) OR (r2_y% >= (r1_y% + r1_height)) OR ((r2_y% + r2_height) <= r1_y%)) THEN Collision$=""
END_SUB
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Jicehel



Nombre de messages : 5783
Age : 44
Localisation : 77500
Date d'inscription : 19/04/2011

MessageSujet: Re: début de programme pour l'article   Dim 5 Juil 2015 - 23:57

woui, tu as raison. Je pensais faire le code rapidement avant de partir pour faire l'article, mais bon ça a merdouillé et je vais regarder le problème. Je ne connais pas la date de sortie du journal mais bon je l'écris dès que ça marche Very Happy
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Jicehel



Nombre de messages : 5783
Age : 44
Localisation : 77500
Date d'inscription : 19/04/2011

MessageSujet: Re: début de programme pour l'article   Lun 6 Juil 2015 - 2:07

J'ai trouvé ce qui ne fonctionnait pas dans la détection de la collision: je ne testais pas si le sprite était visible ou non, du coup je testais si le vaisseau était dans le carré du vaisseau allant en sens opposé, ce qui était vrai en chaque fin de mouvement.

Par contre, j'ai mis en commentaire l'affichage du sprite collision car ça ne marche pas et je n'ai pas trouvé pourquoi ...
(Voir programme du premier post)
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
silverman



Nombre de messages : 326
Age : 44
Localisation : Picardie
Date d'inscription : 19/03/2015

MessageSujet: Re: début de programme pour l'article   Lun 6 Juil 2015 - 11:09

c'est normal que ça ne marche pas, pour cacher le sprite tu le positionne hors de l'écran avec juste un décalage de 4000(nouvelle position non mémorisée). Mais puisqu'il est toujours en mouvement, tu le replace à la position suivante, ce qui le réaffiche.
Pourquoi tu n'utilises simplement pas la commande "sprite_hide" pour le cacher?
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Jicehel



Nombre de messages : 5783
Age : 44
Localisation : 77500
Date d'inscription : 19/04/2011

MessageSujet: Re: début de programme pour l'article   Lun 6 Juil 2015 - 13:01

C'est la méthode qu'utilise Klaus, mais tu te trompes sur le problème, je pense.
On a le vaisseau et l'asteroide qui bougent, ça ça marche
On a la détection de collision, ça ça marche (Du coup j'affiche un message)
Le truc c'est que le message c'est lours, on doit appuyer sur OK, je peux faire des tas de choses comme mettre collision dans le label de la fenêtre, ça fonctionne, mais là, je voulais pour la démo juste afficher un autre gros sprite : Collision quand il y a collision, je trouvais ça plus beau et c'est hyper simple en principe puisque je créé le sprite invisible et traversable pour qu'il ne soit pas pris en compte dans la boucle de detection des collisions. Quand j'ai l'information comme quoi il y a eu collision entre 2 sprites "non traversables", j'affiche le sprite. (Donc le sprite est en +4000+x quand il est caché, quand il y a collision, on change son flag pour le passer en visible et on retire 4000 en x pour le replacer dans l'écran). Ca marche bien pour le vaisseau, mais pas pour le sprite collision (je me suis dit qu'il était peut être trop grand comme à l'origine les sprites étaient limité en taille, je l'ai donc redimensionné en plus petit 350 * 75.)
Ce soir je testerais, les sprites sont peut être limités à 200 pixels, mais il me semblait que Jack avait retiré cette limitation il y a longtemps. Je testerais, je viens d'y repenser et je ne vois pas d'autres explication logique (mais mon erreur est peut être justement une erreur de logique...)
En tout cas merci Silverman de réfléchir à mon problème et je ne sais pas vraiment pourquoi Klaus n'a pas utilisé la fonction hide pour les sprites. Comme sa méthode fonctionne bien, je n'ai pas jugé utile de la changer. J'ai juste modifié la partie détection de collision car sa formule est très pratique pour identifier l'origine de la collision mais pas pour une première illustration de la méthode d'utilisation des sprites et j'ai retrié la partie Tunes pour simplifier aussi cette prise en main.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
silverman



Nombre de messages : 326
Age : 44
Localisation : Picardie
Date d'inscription : 19/03/2015

MessageSujet: Re: début de programme pour l'article   Lun 6 Juil 2015 - 13:36

oups! tu as raison, je n'avais pas tout compris. Embarassed

Cette fois ça marche, le pb vient de cette ligne:
creer_sprite("collision",400,400,350,75,"collision.bmp",0,0) : collision% = nsprite%

C'est un pb de positionnement initial; remplace le 400 par (4000+400).
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Jicehel



Nombre de messages : 5783
Age : 44
Localisation : 77500
Date d'inscription : 19/04/2011

MessageSujet: Re: début de programme pour l'article   Lun 6 Juil 2015 - 14:42

OK, merci pour la solution Silverman, je ne peux pas tester avant ce soir, mais avec ta réponse, ce sera qu'une formalité.
Du coup je fois que j'ai fais une erreur et j'ai compris laquelle. Je vérifie donc ce soir et je corrige mon erreur (enfin si c'est bien ce que je pense) qui vient d'une modification de la procédure que j'ai faite.
Dans ma logique, on ne devrait pas à avoir à positionner le sprite caché en 4000 + 400 mais bien en 400, l'utilisateur n'ayant pas à voir comment le programme se débrouille dans les procédures. Il doit pourvoir appeler la procédure pour qu'elle fasse son job. Si on est obligé de bouger le sprite c'est bien que ce que j'ai voulu faire n'est pas correct sur ce point.
Merci pour ta recherche et je te confirme tout ça ce soir.

PS: Ygeronimi, on a jusque quand pour déposer l'article ?
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Jicehel



Nombre de messages : 5783
Age : 44
Localisation : 77500
Date d'inscription : 19/04/2011

MessageSujet: Re: début de programme pour l'article   Mar 7 Juil 2015 - 0:14

En fait tu avais raison ça complique l'histoire du décalage.

J'ai simplifié en utilisant les bons vieux show et hide.

Maintenant ça marche bien

Code:
label clic

dim sprites(100,7)        : ' jusqu'à 500 sprites
                          : ' ,0)=largeur
                          : '  1)=hauteur
                          : '  2)=visible/invisible ,
                          : '  3)=impénétrable
                          : '  4)=coordonnée x
                          : '  5)=coordonnée y
                          : '  6)=inutilisé dans ce tutoriel
                          : '  7)=inutilisé dans ce tutoriel
dim snames$(100)          : ' noms des sprites
dim nsprite%              : ' dernier numéro de sprite créé
dim sprite_trouve%        : ' numéro du sprite trouvé par un clic (ou 0 si non trouvé)
dim sprite_collision%    : ' numéro du sprite touché par une collision
dim scene_2d%            : ' numéro d'objet du scene2d
dim i%, j%, d%, dx, dy, dxa, dya
dim vaisseau%,asteroide%, collision%  : ' Mémorisation des numéros de sprite
dim collision$
scene_2d% = 17            : ' juste un exemple
scene2d scene_2d% :full_space scene_2d%  : ' créer le scene2d
sprite_target_is scene_2d%    :  ' assurer du bon ciblage
on_click scene_2d%,clic
full_space 0

nsprite% = 0
creer_sprite("vaisseau",100,100,160,160,"vaisseau.bmp",1,1) : vaisseau% = nsprite%
creer_sprite("vaisseau_i",100,100,160,160,"vaisseau_i.bmp",1,0)
dx = 5 : dy = 0 : ' On définit comment notre vaisseau se déplace
creer_sprite("asteroide",200,300,160,160,"asteroide.bmp",1,1) : asteroide% = nsprite%
dya = 0-5
creer_sprite("collision",400,400,350,75,"collision.bmp",0,0) : collision% = nsprite%

for j% = 1 to 3 : ' On fait 3 boucles d'aller / retour
  montrer_sprite(vaisseau%)    : ' On affiche le sprite du vaisseau qui va à gauche
  for i% = 1 to 200
      deplacer_sprite(vaisseau%,1,dx,dy)
      if dya < 0 and sprites(asteroide%,5)< 5 then dya = 0 - dya
      if dya > 0 and sprites(asteroide%,5)  > (height(0) - sprites(asteroide%,1)) then dya = 0 - dya
      dxa = rnd(16) - 7
      if dxa < 0 and sprites(asteroide%,4)< 1 then dxa = 0 - dxa
      if dxa > 0 and sprites(asteroide%,4)  > (width(0) - sprites(asteroide%,0)) then dxa = 0 - dxa
      deplacer_sprite(asteroide%,1,dxa,dya)
      tester_si_collision(vaisseau%)
      if sprite_collision% > 0
            montrer_sprite(collision%)
      else
            cacher_sprite(collision%)
      end_if
  next i%
  cacher_sprite(vaisseau%)    : ' On masque le sprite du vaisseau qui va vers la droite
  sprites(vaisseau%+1,4) = sprites(vaisseau%,4)  : ' On met a jour la position du vaiseau caché
  sprites(vaisseau%+1,5) = sprites(vaisseau%,5)
  montrer_sprite(vaisseau%+1) : ' On affiche le sprite du vaisseau qui va à gauche
  for i% = 1 to 200
      deplacer_sprite(vaisseau%+1,1,0-dx,0-dy)
      if dya < 0 and sprites(asteroide%,5)< 5 then dya = 0 - dya
      if dya > 0 and sprites(asteroide%,5)  > (height(0) - sprites(asteroide%,1)) then dya = 0 - dya
      dxa = rnd(16) - 7
      if dxa < 0 and sprites(asteroide%,4)< 1 then dxa = 0 - dxa
      if dxa > 0 and sprites(asteroide%,4)  > (width(0) - sprites(asteroide%,0)) then dxa = 0 - dxa
      deplacer_sprite(asteroide%,1,dxa,dya)
      tester_si_collision(vaisseau%+1)
      if sprite_collision% > 0
            montrer_sprite(collision%)
      else
            cacher_sprite(collision%)
      end_if
  next i%
  cacher_sprite(vaisseau%+1)    : ' On masque le sprite du vaisseau qui va vers la droite
  sprites(vaisseau%,4) = sprites(vaisseau%+1,4)  : ' On met a jour la position du vaiseau caché
  sprites(vaisseau%,5) = sprites(vaisseau%+1,5)
next j%
montrer_sprite(vaisseau%+1) : ' On affiche le sprite du vaisseau qui va à gauche
end


sub creer_sprite(nam$,x%,y%,largeur%,hauteur%,img$,dur%,visible%)
  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) = largeur% : ' mémoriser sa largeur
  sprites(nsprite%,1) = hauteur% : ' et sa hauteur
  sprite_file_load nsprite%,img$ : ' copier une image dans le sprite
  sprites(nsprite%,4) = x%      : ' position horizontale du sprite
  sprites(nsprite%,5) = y%      : ' position verticale du sprite
  sprite_position nsprite%,x%,y%
  if visible% = 0 then cacher_sprite(nsprite%)  : ' masquer le sprite "invisible"
  if visible% = 1 then montrer_sprite(nsprite%)  : ' afficher le sprite "visible"
  sprites(nsprite%,3) = dur%    : ' marquer 0="pénétrable" ou 1="impénétrable"
  sprites(nsprite%,6) = 0        : ' inutilisé dans ce tutoriel
  sprites(nsprite%,7) = 0        : ' inutilisé dans ce tutoriel
  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
  sprite_position n%,sprites(n%,4)+(1-sprites(n%,2))*4000,sprites(n%,5) : ' positionner le sprite
  display
end_sub

sub cacher_sprite(n%)
  if (n%<1) or (n%>nsprite%) then exit_sub  : ' sécuriser
  sprite_hide n%                            : ' cacher le sprite
  sprites(n%,2) = 0                        : ' signaler "invisible"
end_sub

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


' ***** clic dans la scene2d
clic:
  chercher_sprite_selon_clic()
  if sprite_trouve%>0
    caption 0,"clic sur sprite "+str$(sprite_trouve%)+"="+snames$(sprite_trouve%)+" sans tune"
  else
    caption 0,"aucun sprite cliqué"
  end_if
return

sub tester_si_collision(n%)
  dim_local i%, x%, y%, w%, h%, w, h, ws
  sprite_collision%        = 0        : ' supposer "pas de collision"
  if nsprite%<2 then exit_sub          : ' pas de collisions possibles ?
  if sprites(n%,2)=0 then exit_sub    : ' le sprite mobile est "invisible" si oui, pas de collision
  if sprites(n%,3)=0 then exit_sub    : ' le sprite mobile est "pénétrable" si oui, on ne détecte pas de collisions
  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 and sprites(i%,2) <>0              : ' sprite en dur ?
          Collision_AABB(x%,y%,w,h,sprites(i%,4),sprites(i%,5),sprites(i%,0), sprites(i%,1))
          if collision$ = "OK" then sprite_collision% = i% : exit_sub
      end_if                          : ' fin test sprite en dur
    end_if                            : ' fin test sur sprite "autre"
  next i%                              : ' fin boucle sur les sprites
end_sub

rem ============================================================================
SUB Collision_AABB(r1_x%,r1_y%,r1_width,r1_height,r2_x%,r2_y%, r2_width,r2_height)
  Collision$="OK"
  IF ((r2_x% >= (r1_x% + r1_width)) OR ((r2_x% + r2_width) <= r1_x%) OR (r2_y% >= (r1_y% + r1_height)) OR ((r2_y% + r2_height) <= r1_y%)) THEN Collision$=""
END_SUB
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Contenu sponsorisé




MessageSujet: Re: début de programme pour l'article   

Revenir en haut Aller en bas
 
début de programme pour l'article
Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Les meilleures extensions Firefox pour protéger sa vie privée
» petit programme pour l'effet miroir et renverser
» Vérification rapport ZHP - PC lent, bloque souvent ("pas de réponse")
» Faire une animation pixel par pixel
» [Résolu] Problème avec "Ouvrir Avec"

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: PANORAMIC 32 bits :: Présentation et bavardage-
Sauter vers: