Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | Calendrier |
|
|
| début de programme pour l'article | |
| | Auteur | Message |
---|
Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: début de programme pour l'article Sam 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.zipA 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 | |
| | | silverman
Nombre de messages : 970 Age : 52 Localisation : Picardie Date d'inscription : 18/03/2015
| Sujet: Re: début de programme pour l'article Dim 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
| |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: début de programme pour l'article Dim 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 | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: début de programme pour l'article Lun 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) | |
| | | silverman
Nombre de messages : 970 Age : 52 Localisation : Picardie Date d'inscription : 18/03/2015
| Sujet: Re: début de programme pour l'article Lun 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? | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: début de programme pour l'article Lun 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.
| |
| | | silverman
Nombre de messages : 970 Age : 52 Localisation : Picardie Date d'inscription : 18/03/2015
| Sujet: Re: début de programme pour l'article Lun 6 Juil 2015 - 12:36 | |
| oups! tu as raison, je n'avais pas tout compris. 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). | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: début de programme pour l'article Lun 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 ? | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: début de programme pour l'article Lun 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 | |
| | | Contenu sponsorisé
| Sujet: Re: début de programme pour l'article | |
| |
| | | | début de programme pour l'article | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |