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.
début de programme pour l'article Emptypar Pedro Sam 23 Nov 2024 - 15:50

» Un autre pense-bête...
début de programme pour l'article Emptypar Froggy One Jeu 21 Nov 2024 - 15:54

» Récupération du contenu d'une page html.
début de programme pour l'article Emptypar Pedro Sam 16 Nov 2024 - 14:04

» Décompilation
début de programme pour l'article Emptypar JL35 Mar 12 Nov 2024 - 19:57

» Un album photos comme du temps des grands-mères
début de programme pour l'article Emptypar jjn4 Mar 12 Nov 2024 - 17:23

» traitement d'une feuille excel
début de programme pour l'article Emptypar jjn4 Jeu 7 Nov 2024 - 3:52

» Aide-mémoire mensuel
début de programme pour l'article Emptypar jjn4 Lun 4 Nov 2024 - 18:56

» Des incomprèhension avec Timer
début de programme pour l'article Emptypar Klaus Mer 30 Oct 2024 - 18:26

» KGF_dll - nouvelles versions
début de programme pour l'article Emptypar Klaus Mar 29 Oct 2024 - 17:58

» instructions panoramic
début de programme pour l'article Emptypar maelilou Lun 28 Oct 2024 - 19:51

» Figures fractales
début de programme pour l'article Emptypar Marc Ven 25 Oct 2024 - 12:18

» Panoramic et Scanette
début de programme pour l'article Emptypar Yannick Mer 25 Sep 2024 - 22:16

» Editeur d étiquette avec QR évolutif
début de programme pour l'article Emptypar JL35 Lun 23 Sep 2024 - 22:40

» BUG QR Code DelphiZXingQRCode
début de programme pour l'article Emptypar Yannick Dim 22 Sep 2024 - 11:40

» fichier.exe
début de programme pour l'article 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 : -25%
PC Portable Gamer 16,1” HP Victus 16 – 16 ...
Voir le deal
749.99 €

 

 début de programme pour l'article

Aller en bas 
2 participants
AuteurMessage
Jicehel

Jicehel


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

début de programme pour l'article Empty
MessageSujet: début de programme pour l'article   début de programme pour l'article EmptySam 4 Juil 2015 - 14: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 - 1:04, édité 1 fois
Revenir en haut Aller en bas
silverman

silverman


Nombre de messages : 970
Age : 52
Localisation : Picardie
Date d'inscription : 18/03/2015

début de programme pour l'article Empty
MessageSujet: Re: début de programme pour l'article   début de programme pour l'article EmptyDim 5 Juil 2015 - 12: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
Jicehel

Jicehel


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

début de programme pour l'article Empty
MessageSujet: Re: début de programme pour l'article   début de programme pour l'article EmptyDim 5 Juil 2015 - 22: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
Jicehel

Jicehel


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

début de programme pour l'article Empty
MessageSujet: Re: début de programme pour l'article   début de programme pour l'article EmptyLun 6 Juil 2015 - 1: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
silverman

silverman


Nombre de messages : 970
Age : 52
Localisation : Picardie
Date d'inscription : 18/03/2015

début de programme pour l'article Empty
MessageSujet: Re: début de programme pour l'article   début de programme pour l'article EmptyLun 6 Juil 2015 - 10: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
Jicehel

Jicehel


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

début de programme pour l'article Empty
MessageSujet: Re: début de programme pour l'article   début de programme pour l'article EmptyLun 6 Juil 2015 - 12: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
silverman

silverman


Nombre de messages : 970
Age : 52
Localisation : Picardie
Date d'inscription : 18/03/2015

début de programme pour l'article Empty
MessageSujet: Re: début de programme pour l'article   début de programme pour l'article EmptyLun 6 Juil 2015 - 12: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
Jicehel

Jicehel


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

début de programme pour l'article Empty
MessageSujet: Re: début de programme pour l'article   début de programme pour l'article EmptyLun 6 Juil 2015 - 13: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
Jicehel

Jicehel


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

début de programme pour l'article Empty
MessageSujet: Re: début de programme pour l'article   début de programme pour l'article EmptyLun 6 Juil 2015 - 23: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
Contenu sponsorisé





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

Revenir en haut Aller en bas
 
début de programme pour l'article
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Un programme pour le boulot
» Astuce pour maîtriser fa fin d'un programme
» Un petit programme pour GRID
» Structure pour un programme Windows 1/4
» Structure pour un programme Windows 2/4

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