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 |
|
|
| Des procédures pour la 2D | |
| | |
Auteur | Message |
---|
Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Dim 24 Mai 2015 - 16:50 | |
| @ Jean Claude,
Je pense que ton souci vient du fait que tu dois utiliser la même variable d' incrementation pour les objets et les sprite. | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Des procédures pour la 2D Dim 24 Mai 2015 - 16:59 | |
| Non Ygeronimi, je n'ai plus de souci, j'ai bien fait attention de ne pas utiliser no% pour les sprites. Ne me demande pas comment je suis arrivé à cette fausse conclusion, je serais incapable de te répondre. Bref, pour moi c'est arrangé et ça avance. (Merci à Jicehel) A+ | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Dim 24 Mai 2015 - 17:07 | |
| Après tout, si cela fonctionne, c' est l' essentiel. | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Des procédures pour la 2D Dim 24 Mai 2015 - 17:28 | |
| On commet tous des erreurs et moi le premier, c'est lun des intérets de discuter sur le forum | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Des procédures pour la 2D Lun 25 Mai 2015 - 9:59 | |
| J'ai posté un petit utilitaire permettant de construire les masques des images des sprites, ainsi que des zones rectangulaires de contact pour les tests de collision. Je les ai nommées "tunes". Et c'est dans la rubrique "Vos sources, vos utilitaires à partager": https://panoramic.1fr1.net/t4212-construire-un-masque-pour-les-sprites#49557Je vais maintenant adapter ma sub de détection pour l'utilisation de ces zones de contact. | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Des procédures pour la 2D Lun 25 Mai 2015 - 10:58 | |
| J'attends ton adpatation de tes procédures pour tester ce soir (te connaissant, tu les auras sans doute écrites sauf si tu n'es pas dispo aujourd'hui ). PS: Dans ton tableau qui contient les données des sprites, tu ne veux pas prévoir un emplacement pour les coordonnées ? Je sais que l'on peut les récupérer par les instruction Panoramic, mais ça pourrait éviter d'avoir à les mémoriser dans des variables temporaires, par exemple avant le chargement d'une image. L'intéret est limité, c'est donc une question ouverte ... | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Des procédures pour la 2D Lun 25 Mai 2015 - 11:03 | |
| Je ferai ça ce soir, car maintenant, je n'ai pas le temps. Je dois m'absenter. Et ta suggestion de mettre les coordonnées dans la table - pourquoi pas ? J'y ai déjà mis les dimensions. Donc, je ferai ça aussi. Je rajouterai donc 3 colonnes: les coordonnées X et y, et le numéro d'un DLIST contenant la liste des tunes si cette liste existe, et 0 sinon. Voilà la feuille de route... | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Des procédures pour la 2D Lun 25 Mai 2015 - 11:08 | |
| Parfait. Comme ça toutes les infos du sprites seront dans le tableau | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Des procédures pour la 2D Lun 25 Mai 2015 - 23:21 | |
| Nouvelle version. J'ai étendu le tableau sprites(..,..) comme prévu, en mémorisant la position (x,y) des sprites, ainsi que le numéro d'objet d'un DLIST contenant la définition des tunes (zones de contact) de chaque sprite. J'ai remplacé le sprite rouge par le sprite Android, qui a 5 tunes: 1=tête 1=bras droit 3=bras gauche 4=jambe droite 5=jambe gauche. Le sprite 2 (bleu) se déplace et heurte le sprite 1 (Android) au niveau du bras gauche (tune 3). Ceci est signalé, puis le sprite bleu retourne à sa place. Voici le code: - Code:
-
' 2d_utilities.bas
label clic
dim sprites(500,6) : ' jusqu'à 500 sprites : ' ,0)=largeur ,1)=hauteur : ' ,2)=visible/invisible ,3)=impénétrable : ' ,4)=coordonnée x ,5)=coordonnée y : ' ,6)=numéro d'objet DLIST contenant les tunes dim nsprite% : ' dernier numéro de sprite créé dim sprite_trouve% : ' numéro du sprite trouvé par un clic (ou 0 si non trouvé) dim sprite_collision% : ' numéro du sprite touché par une collision dim tune_collision% : ' numéro du tune touché (ou 0 si non trouvé) dim scene_2d% : ' numéro d'objet du scene2d dim i%
scene_2d% = 17 : ' juste un exemple scene2d scene_2d% : ' créer le scene2d sprite_target_is scene_2d% : ' assurer du bon ciblage on_click scene_2d%,clic
dlist 101 : ' pour recevoir la liste des tunes pour sprite 1
full_space 0 full_space scene_2d% picture 10 : hide 10 : width 10,200 : height 10,200 image 11 2d_target_is 10
' color 10,255,0,0 ' 2d_image_copy 11,0,0,200,200 ' creer_sprite(50,50,11,1) : ' sprite rouge impénétrable file_load 10,"Android.bmp" 2d_image_copy 11,0,0,200,200 file_load 101,"Android_mask_tuned_list.txt" creer_sprite_avec_tunes(50,50,11,1,101) : ' sprite "Android" impénétrable, avec tunes
color 10,0,0,255 2d_image_copy 11,0,0,200,200 : ' sprite bleu impénétrable creer_sprite(400,120,11,1)
color 10,255,255,0 2d_image_copy 11,0,0,200,200 : ' sprite jaune pénétrable creer_sprite(280,180,11,0)
for i%=399 to 0 step -1 deplacer_sprite(2,0,i%,sprites(2,5)) : ' déplacer horizontalement en absolu display tester_si_collision(2,1) if sprite_collision%>0 message "collision avec sprite "+str$(sprite_collision%)+" tune "+str$(tune_collision%) exit_for end_if next i%
for i%=sprites(2,4) to 400 deplacer_sprite(2,0,i%,sprites(2,5)) : ' déplacer horizontalement en absolu display next i%
end
clic: chercher_sprite_selon_clic() if sprite_trouve%>0 message "clic sur sprite "+str$(sprite_trouve%) else message "aucun sprite cliqué" end_if return
sub creer_sprite(x%,y%,img%,dur%) nsprite% = nsprite% + 1 : ' passer au numéro de sprite suivant sprite nsprite% : ' créer le sprite sprites(nsprite%,0) = 200 : ' mémoriser sa largeur sprites(nsprite%,1) = 200 : ' et sa hauteur sprites(nsprite%,2) = 1 : ' marquer "visible" sprites(nsprite%,3) = dur% : ' marquer 0="pénétrable" ou 1="impénétrable" sprites(nsprite%,4) = x% : ' position horizontale du sprite sprites(nsprite%,5) = y% : ' position verticale du sprite sprites(nsprite%,6) = 0 : ' pas de tunes if img%>0 then sprite_image_load nsprite%,img% : ' copier une image dans le sprite sprite_position nsprite%,x%,y% : ' positionner le sprite à l'endroit voulu display end_sub
sub creer_sprite_avec_tunes(x%,y%,img%,dur%,dl%) if object_exists(dl%)=0 then exit_sub : ' impossible si l'objet n'existe pas if object_type(dl%)<>26 then exit_sub : ' impossible si l'objet n'est pas une DLIST if count(dl%)=0 then exit_sub : ' impossible si la liste des tunes est vide nsprite% = nsprite% + 1 : ' passer au numéro de sprite suivant sprite nsprite% : ' créer le sprite sprites(nsprite%,0) = 200 : ' mémoriser sa largeur sprites(nsprite%,1) = 200 : ' et sa hauteur sprites(nsprite%,2) = 1 : ' marquer "visible" sprites(nsprite%,3) = dur% : ' marquer 0="pénétrable" ou 1="impénétrable" sprites(nsprite%,4) = x% : ' position horizontale du sprite sprites(nsprite%,5) = y% : ' position verticale du sprite sprites(nsprite%,6) = dl% : ' liste des tunes if img%>0 then sprite_image_load nsprite%,img% : ' copier une image dans le sprite sprite_position nsprite%,x%,y% : ' positionner le sprite à l'endroit voulu display end_sub
sub deplacer_sprite(n%,rel%,x%,y%) if (n%<1) or (n%>nsprite%) then exit_sub : ' sécuriser if rel%=1 : ' positionnement relatif ? sprites(n%,4) = sprites(n%,4) + x% sprites(n%,5) = sprites(n%,5) + y% else : ' positionnement absolu ! sprites(n%,4) = x% sprites(n%,5) = y% end_if if sprites(nsprite%,2)=1 : ' sprite visible ? sprite_position n%,x%,y% : ' positionner le sprite visible à l'endroit voulu else : ' sprite caché ! sprite_position n%,x%+4000,y% : ' positionner le sprite caché à l'endroit voulu end_if end_sub
sub redimensionner_sprite_x(n%,c) if (n%<1) or (n%>nsprite%) then exit_sub : ' sécuriser sprite_x_scale n%,c : ' ajuster la largeur sprites(n%,0) = sprites(n%,0)*c : ' et mémoriser end_sub
sub redimensionner_sprite_y(n%,c) if (n%<1) or (n%>nsprite%) then exit_sub : ' sécuriser sprite_y_scale n%,c : ' ajuster la hauteur sprites(n%,1) = sprites(n%,1)*c : ' et mémoriser end_sub
sub redimensionner_sprite_xy(n%,cx,cy) if (n%<1) or (n%>nsprite%) then exit_sub : ' sécuriser sprite_scale n%,cx,cy : ' ajuster largeur et hauteur sprites(n%,0) = sprites(n%,0)*cx : ' et mémoriser la largeur sprites(n%,1) = sprites(n%,1)*cy : ' et mémoriser la hauteur end_sub
sub cacher_sprite(n%) if (n%<1) or (n%>nsprite%) then exit_sub : ' sécuriser if sprites(n%,2)=1 : ' est-ce que le sprite est visible ? sprite_x_position n%,sprite_x_position(n%) + 4000 : ' déplacer hors de la vue sprites(n%,2) = 0 : ' signaler "invisible" end_if end_sub
sub montrer_sprite(n%) if (n%<1) or (n%>nsprite%) then exit_sub : ' sécuriser if sprites(n%,2)=0 : ' est-ce que le sprite est invisible ? sprite_x_position n%,sprite_x_position(n%) - 4000 : ' replacer dans la partie visible sprites(n%,2) = 1 : ' signaler "visible" end_if end_sub
sub chercher_sprite_selon_clic() dim_local i%, x%, y%, xs%, ys% sprite_trouve% = 0 : ' supposer "sprite non trouvé" if number_click<>scene_2d% then exit : ' on n'a pas cliqué dans le scene2d ? if nsprite%=0 then exit_sub : ' pas de sprites créés ? x% = mouse_x_left_down(scene_2d%) : ' mémoriser la position horizontale du clic y% = mouse_y_left_down(scene_2d%) : ' mémoriser la position verticale du clic for i%=nsprite% to 1 step -1 : ' boucle sur tous les sprites xs% = sprite_x_position(i%) : ' mémoriser la position horizontale du sprite i% ys% = sprite_y_position(i%) : ' mémoriser la position verticale dusprite i% if (xs%<x%) : ' le bord gauche du sprite est plus à gauche que l'abscisse du clic ? if (ys%<y%) : ' le bord haut du sprite est plus haute que l'ordonnée du sprite ? if xs%+sprites(i%,0)>=x% : ' le bord droit du sprite est plus à droite que l'abscisse du clic ? if ys%+sprites(i%,1)>=y% : ' le bord bas du sprite est plus en bas que l'ordonnée du clic ? sprite_trouve% = i% : ' alors, on a trouvé le sprite exit_sub : ' et on sort end_if : ' fin test sur le bord bas du sprite end_if : ' fin test sur le bord droit du sprite end_if : ' fin test sur le bord haut du sprite end_if : ' fin test sur le bord gauche du sprite next i% : ' fin boucle sur les sprites message "a4" end_sub
sub tester_si_collision(n%,dir%) dim_local i%, x%, y%, w%, h%, xs%, ys%, ws, hs, t%, nt%, s$, s1$, p%, p2%, ws%, hs% sprite_collision% = 0 : ' supposer "pas de collision" tune_collision% = 0 if nsprite%<2 then exit_sub : ' pas de collisions possibles ? if sprites(n%,2)=0 then exit_sub : ' le sprite mobile est "invisible" ? if sprites(n%,3)=0 then exit_sub : ' le sprite mobile est "pénétrable" ? x% = sprite_x_position(n%) : ' position horizontale du sprite en movement y% = sprite_y_position(n%) : ' position verticale du sprite en movement ws = sprites(n%,0) : ' largeur du sprite en movement hs = sprites(n%,1) : ' hauteur du sprite en movement for i%=nsprite% to 1 step -1 : ' boucle sur tous les sprites if i%<>n% : ' on est sur un sprite autre que celui qui bouge ? if sprites(i%,3)<>0 : ' sprite en dur ? xs% = sprite_x_position(i%) : ' position horizontale du sprite à tester ys% = sprite_y_position(i%) : ' position verticale du sprite à tester ws = sprites(i%,0) : ' largeur du sprite à tester hs = sprites(i%,1) : ' hauteur du sprite à tester select dir% : ' distinction par direction du mouvement case 1: ' gauche if (xs%+ws)>=(x%-1) then sprite_collision% = i% case 2: ' haut if (ys%+hs)>=(y%-1) then sprite_collision% = i% case 3: ' droite if (xs%-1)<=(x%+w%) then sprite_collision% = i% case 4: ' bas if (ys%-1)<=(y%+h%) then sprite_collision% = i% end_select : ' fin distintion par direction if sprite_collision%>0 : ' une collision est possible ? if sprites(i%,6)>0 : ' le sprite a des tunes ? nt% = count(sprites(i%,6)) : ' nombre de tunes for t%=1 to nt% : ' boucle sur les tunes du sprite touché s$ = item_read$(sprites(i%,6),t%)+"," : ' lire la définition du sprite p% = instr(s$,",") : ' s1$ = mid$(s$,p%+1,100) : ' éliminer le numéro de tune p% = instr(s1$,",") : ' chercher la fin du premier paramètre xs% = val(left$(s1$,p%-1)) : ' c'est l'abscisse du coin en haut à gauche s1$ = mid$(s1$,p%+1,100) : ' éliminer le premier paramètre p% = instr(s1$,",") : ' chercher la fin du deuxième paramètre ys% = val(left$(s1$,p%-1)) : ' c'est l'ordonnée du coin en haut à gauche s1$ = mid$(s1$,p%+1,100) : ' éliminer le deuxième paramètre p% = instr(s1$,",") : ' chercher la fin du troisième paramètre ws% = val(left$(s1$,p%-1))-xs%+1 : ' c'est l'abscisse du coin en bas à droite s1$ = mid$(s1$,p%+1,100) : ' éliminer le troisième paramètre p% = instr(s1$,",") : ' chercher la fin du quatrième paramètre hs% = val(left$(s1$,p%-1))-ys%+1 : ' c'est l'ordonnée du coin en bas à droite xs% = xs% + sprites(i%,4) : ' l'adresse du tune est relative ! ys% = ys% + sprites(i%,5) : ' l'adresse du tune est relative ! if xs%<x% : ' le bord gauche du tune est plus à gauche que l'abscisse du clic ? if ys%<y% : ' le bord haut du tune est plus haute que l'ordonnée du sprite ? if (xs%+ws%)>=x% : ' le bord droit du tune est plus à droite que l'abscisse du clic ? if (ys%+hs%)>=y% : ' le bord bas du tune est plus en bas que l'ordonnée du clic ? sprite_collision% = i% : ' alors, on a trouvé le sprite tune_collision% = val(left$(s$,instr(s$,",")-1)) : ' et le tune trouvé exit_sub : ' ici, on a trouvé le tune touché end_if : ' fin test sur le bord bas du tune end_if : ' fin test sur le bord droit du tune end_if : ' fin test sur le bord haut du tune end_if : ' fin test sur le bord gauche du tune next t% : ' fin boucle sur les tunes du sprite touché sprite_collision% = 0 : ' aucun tune du sprite n'est touché else : ' le sprite n'a pas de tunes ! exit_sub : ' donc, sortie immédiate car colision globale end_if : ' fin test si sprite a des tunes end_if : ' fin collision possible end_if : ' fin test sprite en dur end_if : ' fin test sur sprite "autre" next i% : ' fin boucle sur les sprites end_sub
Voici le sprite Andoid.bmp: Et voici le fichier Android_mask_tuned_list.txt avec la liste des tunes: - Citation :
- 1,43,0,159,69
2,23,67,64,140 3,140,67,181,136 4,51,131,96,200 5,111,131,152,197 Vous verrez que le sprite bleu avance vraiment au contact du bras gauche (à droit sur l'écran, bien sûr !), bien que le sprite Android s'étende plus loin - il y a une partie noire qui est transparente dans le scene2d. Mais la procédure de détection de collision détecte bien que le sprite a des tunes et réagit alors aux tunes. Sinon, il réagit dès le premier contact avec le sprite.
Dernière édition par Klaus le Mar 26 Mai 2015 - 0:08, édité 1 fois | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Lun 25 Mai 2015 - 23:49 | |
| Il manque la déclaration suivante : dim tune_trouve% Ceci dit beau travail Klaus, le résultat est fluide. Je pense que l' on peut vraiment se servir de ce programme comme base des jeux avec des sprites | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Des procédures pour la 2D Mar 26 Mai 2015 - 0:13 | |
| J'ai supprimé la ligne qui initialisait cette variable - c'était un résidu d'une tentative, et j'avais oublié de l'enlever.
Oui, ça marche déjà pas mal. On peut, pour chaque sprite, déclarer jusqu'à 63 zones "réactives" (des tunes). Ces zones réagissent à une collision, en donnant le numéro du sprite et le numéro du tune. Histoire de savoir exactement où le contact a eu lieu.
Il reste un truc à faire; les tunes sont pris en compte pour tous les sprites immobiles, susceptibles d'être touchés par un sprite en mouvement. Mais pour le sprite en mouvement, je ne gère pas encore les tunes. Mais c'est en cours. Le présent programme laisse déjà entrevoir, sous forme de maquette, ce que sera la détection de collision une fois que ce dernier aspect sera codé. | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Des procédures pour la 2D Mar 26 Mai 2015 - 0:31 | |
| Bravo Klaus, c'est un excellent départ. Le principe et là et c'est rapide. Après il faudra que l'on teste avec plusieurs sprites pour voir si ça reste performant avec 50 sprites en mouvements par exemple. Si ça tient la cdence, avec 100 et si ça tient, avec 200. Si ça tient avec 200 sprites, on peu quasiment dire qu'il n'y aurait pas de limite car peu de jeux font evoluer 200 sprites à l'écran... Mais il y en aura sans doute une avant. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Des procédures pour la 2D Mar 26 Mai 2015 - 0:47 | |
| Effectivement, à un moment donné, le problème des performances se posera. Je suis en 100 % Panoramic. C'est intentionnel, pour montrer le principe, la faisabilité.
Ensuite, l'idéal, ce serait que la collision serait implémentée dans le moteur de Panoramic. Je suis curieux de voir sur quel principe elle fonctionnera. Mais ce qui est sûr, c'est que la fonction de détection peut se coder comme une fonction de KGF.dll. A voir plus tard. | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Des procédures pour la 2D Mar 26 Mai 2015 - 8:10 | |
| Je pense que l'on aura du nouveau bientôt par Jack car il semblait bien avancé sur le sujet. Le truc c'est que j'espère que ce sera directement dans le Panoramic classic et pas dans une version à part... Je croise les doigts et je pense ue je vais attendre un moi pour faire la seconde partie pour les collisions car ce sujet risque d'évoluer avec ces changements. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Des procédures pour la 2D Mer 27 Mai 2015 - 2:16 | |
| Je suis en train d'adapter le mécanisme à des collision de 3 types: - sprite simple contre sprite simple - sprite simple contre sprite avec tunes - sprite avec tunes contre sprite avec tunes
Les premiers résultats sont prometteurs, et j'ai trouvé un algorithme qui donne des performances raisonnables, pour un programme codé en 100 % Panoramic. Autant dire qu'en compilé, se sera très rapide. En tout cas, les tests avancent bien. | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Des procédures pour la 2D Mer 27 Mai 2015 - 8:26 | |
| Je m'en doutais comme tu n'avais rien mis hier. Tu peux mettre la proc que j'ai mis dans l'article aussi pour la détection circulaire, car c'est souvent utilisé aussi (le plus et de loin, c'est rectangulaire, après loin derriere c'est le cercle et le masque) Et souvent en effet il y a une seule forme complexe (un vaisseau par exemple) et des détections rectangulaires pour le décor et les énemmis et les tirs pour des raisons de performances) | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Des procédures pour la 2D Mer 27 Mai 2015 - 8:43 | |
| J'ai prévu d'ajouter la détection par cercle lorsque la détection par rectangle marchera. Pour le masque, cela ne me paraît pas faisable en Panoramic pur, pour des raisons de performance. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Des procédures pour la 2D Mer 27 Mai 2015 - 9:22 | |
| Voici une première version de détection de collision entre 2 sprites ayant chacun des tunes. J'ai pris mon sprite Andoid dans les deux cas. Il est posté ci-dessus, avec son image Android.bmp et son fichier des tunes Android_mask_tuned_list.txt. Le programme utilise les 4 flèches pour déplacer l'Android de droite, comme on veut. Dès qu'il touche l'Android de gauche, la collision est signalé. Voici les références numériques utilisées: liste des sprites:sprite 1 = Android fixe, à gauche, impénétrable sprite 2 = Android mobile, à droite, impénétrable sprite 3 = carré jaune, fixe, pénétrable liste des tunes pour chaque Android:1 = tête 2 = bras droit (à gauche de l'écran) 3 = bras gauche (à droite de l'écran) 4 = jambe droite (à gauche de l'écran) 5 = jambe gauche (à droite de l'écran) Voici le code: - Code:
-
' 2d_utilities.bas
label clic, key
dim sprites(500,7) : ' jusqu'à 500 sprites : ' ,0)=largeur ,1)=hauteur : ' ,2)=visible/invisible ,3)=impénétrable : ' ,4)=coordonnée x ,5)=coordonnée y : ' ,6)=numéro d'objet DLIST contenant les tunes : ' ,6)=transformé en index dans tunes(..,..) : ' ,7)=nombre de tunes dim ntunes% : ' nombre de tunes dans tunes(..,..) dim tunes(3000,4) : ' jusqu'à 3000 tunes : ' ,0)=sprite ,1)=coordonnée x ,2)=coordonnée y : ' ,3)=largeur ,4)=hauteur dim nsprite% : ' dernier numéro de sprite créé dim sprite_trouve% : ' numéro du sprite trouvé par un clic (ou 0 si non trouvé) dim sprite_collision% : ' numéro du sprite touché par une collision dim tune_collision% : ' numéro du tune touché (ou 0 si non trouvé) dim tune_collision_mobile% : ' numéro du tune touché (ou 0 si non trouvé) dim scene_2d% : ' numéro d'objet du scene2d dim trace% : trace% = 0 : ' mettre 1 pour afficher une trace des calculs dim i%, d%, dx%, dy%
scene_2d% = 17 : ' juste un exemple scene2d scene_2d% : ' créer le scene2d sprite_target_is scene_2d% : ' assurer du bon ciblage on_click scene_2d%,clic
dlist 101 : ' pour recevoir la liste des tunes pour sprite 1 if trace%=1 then list 102 : top 102,500 : width 102,1000 : height 102,200
full_space 0 full_space scene_2d% picture 10 : hide 10 : width 10,200 : height 10,200 image 11 2d_target_is 10
' color 10,255,0,0 ' 2d_image_copy 11,0,0,200,200 ' creer_sprite(50,50,11,1) : ' sprite rouge impénétrable file_load 10,"Android.bmp" 2d_image_copy 11,0,0,200,200 file_load 101,"Android_mask_tuned_list.txt" creer_sprite_avec_tunes(50,50,11,1,101) : ' sprite "Android" impénétrable, avec tunes
' color 10,0,0,255 ' 2d_image_copy 11,0,0,200,200 : ' sprite bleu impénétrable ' creer_sprite(400,120,11,1) file_load 10,"Android.bmp" 2d_image_copy 11,0,0,200,200 ' file_load 101,"Android_mask_tuned_list.txt" : ' déjà chargé creer_sprite_avec_tunes(400,130,11,1,101) : ' sprite "Android" impénétrable, avec tunes
color 10,255,255,0 2d_image_copy 11,0,0,200,200 : ' sprite jaune pénétrable creer_sprite(280,180,11,0)
on_key_down 0,key
end
' ***** frappe d'une touche au clavier key: d% = scancode if d%=37 : ' gauche dx% = 0 - 1 dy% = 0 end_if if d%=38 : ' haut dx% = 0 dy% = 0 - 1 end_if if d%=39 : ' droite dx% = 1 dy% = 0 end_if if d%=40 : ' bas dx% = 0 dy% = 1 end_if for i%=1 to 30 : ' pas de 30 pixels par frappe d'une flèche deplacer_sprite(2,1,dx%,dy%) : ' déplacement relatif tester_si_collision(2,1) : ' suivi du test de collision if sprite_collision%>0 : ' une collision a eu lieu ? message "collision avec sprite "+str$(sprite_collision%)+" tune "+str$(tune_collision%)+" touché par sprite 2 tune "+str$(tune_collision_mobile%) deplacer_sprite(2,1,0-dx%,0-dy%) : ' annuler le déplacement en cas de collision exit_for : ' et arrêter le déplacement end_if : ' fin test si collision next i% : ' fin boucle de déplacement return
' ***** reste du programme initial, à conserver pour le moment... for i%=399 to 0 step -1 deplacer_sprite(2,0,i%,sprites(2,5)) : ' déplacer horizontalement en absolu display tester_si_collision(2,1) if sprite_collision%>0 message "collision avec sprite "+str$(sprite_collision%)+" tune "+str$(tune_collision%)+" touché par sprite 2 tune "+str$(tune_collision_mobile%) exit_for end_if next i%
for i%=sprites(2,4) to 400 deplacer_sprite(2,0,i%,sprites(2,5)) : ' déplacer horizontalement en absolu display next i%
end ' ***** fin reste du programme initial
' ***** clic dans la scene2d clic: chercher_sprite_selon_clic() if sprite_trouve%>0 message "clic sur sprite "+str$(sprite_trouve%) else message "aucun sprite cliqué" end_if return
sub creer_sprite(x%,y%,img%,dur%) nsprite% = nsprite% + 1 : ' passer au numéro de sprite suivant sprite nsprite% : ' créer le sprite sprites(nsprite%,0) = 200 : ' mémoriser sa largeur sprites(nsprite%,1) = 200 : ' et sa hauteur sprites(nsprite%,2) = 1 : ' marquer "visible" sprites(nsprite%,3) = dur% : ' marquer 0="pénétrable" ou 1="impénétrable" sprites(nsprite%,4) = x% : ' position horizontale du sprite sprites(nsprite%,5) = y% : ' position verticale du sprite sprites(nsprite%,6) = 0 : ' pas de tunes sprites(nsprite%,7) = 0 : ' pas de tunes if img%>0 then sprite_image_load nsprite%,img% : ' copier une image dans le sprite sprite_position nsprite%,x%,y% : ' positionner le sprite à l'endroit voulu display end_sub
sub creer_sprite_avec_tunes(x%,y%,img%,dur%,dl%) dim_local t%, s$, p% if object_exists(dl%)=0 then exit_sub : ' impossible si l'objet n'existe pas if object_type(dl%)<>26 then exit_sub : ' impossible si l'objet n'est pas une DLIST if count(dl%)=0 then exit_sub : ' impossible si la liste des tunes est vide nsprite% = nsprite% + 1 : ' passer au numéro de sprite suivant sprite nsprite% : ' créer le sprite sprites(nsprite%,0) = 200 : ' mémoriser sa largeur sprites(nsprite%,1) = 200 : ' et sa hauteur sprites(nsprite%,2) = 1 : ' marquer "visible" sprites(nsprite%,3) = dur% : ' marquer 0="pénétrable" ou 1="impénétrable" sprites(nsprite%,4) = x% : ' position horizontale du sprite sprites(nsprite%,5) = y% : ' position verticale du sprite sprites(nsprite%,6) = ntunes%+1 : ' indice dans la liste des tunes sprites(nsprite%,7) = count(dl%) : ' nombre de tunes for t%=1 to count(dl%) : ' boucle sur les lignes des tunes ntunes% = ntunes% + 1 : ' compter le nouveau tune tunes(ntunes%,0) = nsprite% : ' mémoriser le numéro du sprite pour ce tune s$ = item_read$(dl%,t%)+"," : ' lire un eligne de tunes p% = instr(s$,",") s$ = mid$(s$,p%+1,100) : ' ignorer le numéro de tune p% = instr(s$,",") tunes(ntunes%,1) = val(left$(s$,p%-1)) : ' mémoriser coordonnée x du tune s$ = mid$(s$,p%+1,100) : ' dépasser la coordonnée x du tune p% = instr(s$,",") tunes(ntunes%,2) = val(left$(s$,p%-1)) : ' mémoriser coordonnée y du tune s$ = mid$(s$,p%+1,100) : ' dépasser la coordonnée y du tune p% = instr(s$,",") tunes(ntunes%,3) = val(left$(s$,p%-1)) - tunes(ntunes%,1)+1 : ' mémoriser largeur du tune s$ = mid$(s$,p%+1,100) : ' dépasser la largeur du tune p% = instr(s$,",") tunes(ntunes%,4) = val(left$(s$,p%-1)) - tunes(ntunes%,2)+1 : ' mémoriser hauteur du tune s$ = mid$(s$,p%+1,100) : ' dépasser la hauteur du tune next t% : ' fin boucle sur les lignes des tunes if img%>0 then sprite_image_load nsprite%,img% : ' copier une image dans le sprite sprite_position nsprite%,x%,y% : ' positionner le sprite à l'endroit voulu
display end_sub
sub deplacer_sprite(n%,rel%,x%,y%) if (n%<1) or (n%>nsprite%) then exit_sub : ' sécuriser if rel%=1 : ' positionnement relatif ? sprites(n%,4) = sprites(n%,4) + x% sprites(n%,5) = sprites(n%,5) + y% else : ' positionnement absolu ! sprites(n%,4) = x% sprites(n%,5) = y% end_if if sprites(nsprite%,2)=1 : ' sprite visible ? sprite_position n%,sprites(n%,4),sprites(n%,5) : ' positionner le sprite visible à l'endroit voulu else : ' sprite caché ! sprite_position n%,sprites(n%,4)+4000,sprites(n%,5) : ' positionner le sprite caché à l'endroit voulu end_if end_sub
sub redimensionner_sprite_x(n%,c) if (n%<1) or (n%>nsprite%) then exit_sub : ' sécuriser sprite_x_scale n%,c : ' ajuster la largeur sprites(n%,0) = sprites(n%,0)*c : ' et mémoriser end_sub
sub redimensionner_sprite_y(n%,c) if (n%<1) or (n%>nsprite%) then exit_sub : ' sécuriser sprite_y_scale n%,c : ' ajuster la hauteur sprites(n%,1) = sprites(n%,1)*c : ' et mémoriser end_sub
sub redimensionner_sprite_xy(n%,cx,cy) if (n%<1) or (n%>nsprite%) then exit_sub : ' sécuriser sprite_scale n%,cx,cy : ' ajuster largeur et hauteur sprites(n%,0) = sprites(n%,0)*cx : ' et mémoriser la largeur sprites(n%,1) = sprites(n%,1)*cy : ' et mémoriser la hauteur end_sub
sub cacher_sprite(n%) if (n%<1) or (n%>nsprite%) then exit_sub : ' sécuriser if sprites(n%,2)=1 : ' est-ce que le sprite est visible ? sprite_x_position n%,sprite_x_position(n%) + 4000 : ' déplacer hors de la vue sprites(n%,2) = 0 : ' signaler "invisible" end_if end_sub
sub montrer_sprite(n%) if (n%<1) or (n%>nsprite%) then exit_sub : ' sécuriser if sprites(n%,2)=0 : ' est-ce que le sprite est invisible ? sprite_x_position n%,sprite_x_position(n%) - 4000 : ' replacer dans la partie visible sprites(n%,2) = 1 : ' signaler "visible" end_if end_sub
sub chercher_sprite_selon_clic() dim_local i%, x%, y%, xs%, ys% sprite_trouve% = 0 : ' supposer "sprite non trouvé" if number_click<>scene_2d% then exit : ' on n'a pas cliqué dans le scene2d ? if nsprite%=0 then exit_sub : ' pas de sprites créés ? x% = mouse_x_left_down(scene_2d%) : ' mémoriser la position horizontale du clic y% = mouse_y_left_down(scene_2d%) : ' mémoriser la position verticale du clic for i%=nsprite% to 1 step -1 : ' boucle sur tous les sprites xs% = sprite_x_position(i%) : ' mémoriser la position horizontale du sprite i% ys% = sprite_y_position(i%) : ' mémoriser la position verticale dusprite i% if (xs%<x%) : ' le bord gauche du sprite est plus à gauche que l'abscisse du clic ? if (ys%<y%) : ' le bord haut du sprite est plus haute que l'ordonnée du sprite ? if xs%+sprites(i%,0)>=x% : ' le bord droit du sprite est plus à droite que l'abscisse du clic ? if ys%+sprites(i%,1)>=y% : ' le bord bas du sprite est plus en bas que l'ordonnée du clic ? sprite_trouve% = i% : ' alors, on a trouvé le sprite exit_sub : ' et on sort end_if : ' fin test sur le bord bas du sprite end_if : ' fin test sur le bord droit du sprite end_if : ' fin test sur le bord haut du sprite end_if : ' fin test sur le bord gauche du sprite next i% : ' fin boucle sur les sprites message "a4" end_sub
sub tester_si_collision(n%,dir%) dim_local i%, x%, y%, w%, h%, xs%, ys%, w, h, ws, hs, t%, nt%, dim_local s$, s1$, ss$, ss1$, p%, p2%, pp%, pp2%, dim_local ntm%, tm%, xsm%, ysm%, wsm, hsm, ind%, indm% sprite_collision% = 0 : ' supposer "pas de collision" tune_collision% = 0 tune_collision_mobile% = 0 if nsprite%<2 then exit_sub : ' pas de collisions possibles ? if sprites(n%,2)=0 then exit_sub : ' le sprite mobile est "invisible" ? if sprites(n%,3)=0 then exit_sub : ' le sprite mobile est "pénétrable" ? x% = sprites(n%,4) : ' position horizontale du sprite en movement y% = sprites(n%,5) : ' position verticale du sprite en movement w = sprites(n%,0) : ' largeur du sprite en movement h = sprites(n%,1) : ' hauteur du sprite en movement for i%=nsprite% to 1 step -1 : ' boucle sur tous les sprites if i%<>n% : ' on est sur un sprite autre que celui qui bouge ? if sprites(i%,3)<>0 : ' sprite en dur ? xs% = sprites(i%,4) : ' position horizontale du sprite à tester ys% = sprites(i%,5) : ' position verticale du sprite à tester ws = sprites(i%,0) : ' largeur du sprite à tester hs = sprites(i%,1) : ' hauteur du sprite à tester select dir% : ' distinction par direction du mouvement case 1: ' gauche if (x%-1)<=(xs%+ws) : ' bord droit fixe peut toucher bord gauche mobile ? if (x%+w)>=(xs%-1) if (ys%+hs)>=y% : ' bord bas mobile plus bas que bord haut fixe ? if ys%<=(y%+h) : ' bord haut mobile plus que bord bas fixe ? sprite_collision% = i% : ' alors collision ' message "collision à gauche avec "+str$(sprite_collision%) end_if end_if end_if end_if case 2: ' haut if (y%-1)<=(ys%+hs) : ' bord bas fixe peut toucher bord haut mobile ? if (y%+h)>=(ys%-1) if (xs%+hs)>=x% : ' bord droit mobile plus à gauche que bord gauche fixe ? if xs%<=(x%+h) : ' bord gauche mobile plus à gauche que bord droit fixe ? sprite_collision% = i% : ' alors collision end_if end_if end_if end_if case 3: ' droite : ' à adapter if (x%+w)=(xs%-1) : ' bord gauche fixe peut toucher bord droit mobile ? if (ys%+hs)>=y% : ' bord bas mobile plus bas que bord haut fixe ? if ys%<=(y%+h) : ' bord haut mobile plus que bord bas fixe ? sprite_collision% = i% : ' alors collision end_if end_if end_if case 4: ' bas : ' à adapter if (y%+h)=(ys%-1) : ' bord haut fixe peut toucher bord bas mobile ? if (xs%+hs)>=x% : ' bord droit mobile plus à gauche que bord gauche fixe ? if xs%<=(x%+h) : ' bord gauche mobile plus à gauche que bord droit fixe ? sprite_collision% = i% : ' alors collision end_if end_if end_if end_select : ' fin distinction par direction ' message str$(sprite_collision%) if sprite_collision%>0 : ' une collision est possible ? if sprites(i%,6)>0 : ' le sprite a des tunes ? if trace%=1 then clear 102 nt% = sprites(i%,7) : ' nombre de tunes ind% = sprites(i%,6)-1 : ' prendre l'indice dans tunes() for t%=1 to nt% : ' boucle sur les tunes du sprite touché xs% = tunes(ind%+t%,1) : ' c'est l'abscisse du coin en haut à gauche ys% = tunes(ind%+t%,2) : ' c'est l'ordonnée du coin en haut à gauche ws = tunes(ind%+t%,3) : ' c'est la largeur hs = tunes(ind%+t%,4) : ' c'est la hauteur xs% = xs% + sprites(i%,4) : ' l'adresse du tune est relative ! ys% = ys% + sprites(i%,5) : ' l'adresse du tune est relative !
if sprites(n%,6)>0 : ' le sprite mobile a des tunes ? ntm% = sprites(n%,7) : ' nombre de tunes du sprite mobile indm% = sprites(n%,6)-1 : ' prendre l'indice dans tunes() for tm%=1 to ntm% : ' boucle sur les tunes du sprite mobileé xsm% = tunes(indm%+tm%,1) : ' c'est l'abscisse du coin en haut à gauche ysm% = tunes(indm%+tm%,2) : ' c'est l'ordonnée du coin en haut à gauche wsm = tunes(indm%+tm%,3) : ' c'est la largeur hsm = tunes(indm%+tm%,4) : ' c'est la hauteur xsm% = xsm% + sprites(n%,4) : ' l'adresse du tune est relative ! ysm% = ysm% + sprites(n%,5) : ' l'adresse du tune est relative ! if trace%=1 item_add 102,str$(t%)+": "+str$(xs%)+","+str$(ys%)+"/"+str$(ws)+","+str$(hs) item_add 102,str$(tm%)+": "+str$(xsm%)+","+str$(ysm%)+"/"+str$(wsm)+","+str$(hsm) item_add 102,"" end_if if (xs%-1)<=(xsm%+wsm) : ' bord gauche tune fixe plus à gauche que bord droit tune mobile ? if (xs%+ws)>=(xsm%-1) : ' bord droit tune fixe plus à droite que bord gauche tune mobile ? if (ysm%+hsm)>=ys% : ' bord bas tune mobile plus bas que bord haut tune fixe ? if ysm%<=(ys%+hs) : ' bord haut tune mobile plus haut que bord bas tune fixe ? sprite_collision% = i% : ' alors collision tune_collision% = t% tune_collision_mobile% = tm% if trace%=1 then item_add 102,str$(ind%)+" "+str$(indm%) exit_sub : ' sortie car on a trouvé une collision end_if : ' fin test sur bord haut tune mobile end_if : ' fin test sur bord bas tune mobile end_if : ' fin test sur bord droit tune fixe end_if : ' fin test sur bord gauche tune fixe
next tm% : ' fin boucle sur les tune du mobile else : ' le sprite mobile n'a pas de tunes ! ' ...à faire... end_if : ' fin sprite mobile a des tunes next t% : ' fin boucle sur les tunes du sprite touché sprite_collision% = 0 : ' aucun tune du sprite n'est touché else : ' le sprite n'a pas de tunes ! exit_sub : ' donc, sortie immédiate car colision globale end_if : ' fin test si sprite a des tunes end_if : ' fin collision possible end_if : ' fin test sprite en dur end_if : ' fin test sur sprite "autre" next i% : ' fin boucle sur les sprites end_sub
En ligne 22, il y a une variable trace. On peut mettre sa valeur à 1 pour afficher une liste des calculs de détection... | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Des procédures pour la 2D Mer 27 Mai 2015 - 10:41 | |
| T'inquiète Klaus, les Tunes permettront sans doute déjà de repondre à 99% des cas Cette nouvelle souplesse permet déjà de retirer la pluspart des zones tranparentes du sprite. Ca permet aussi de faire un traitement pour une comportement particulier. Par exemple pour Barbarian, si on touche la zone tête avec la zone épée de l'autre sprite alors on déclenche l'animation "couper la tête" et on affiche la série de sprites correspondante sauf si on touche le tunne correpondant à l'épée avant, ce qui voudrait dire que le joueur s'est mis en protection. Après pour le moment c'est à nous d'être malins et d'essayer de faire des formes les plus rectangulaires possibles et d'éviter au maximum les grosses formes triangulaires qui nécessiteraient beaucoup de Tunes pour avoir une précision de détection correcte (pour les petits triangles, 2 ou 3 tunes suffisent donc on s'en fiche ). En tout cas, le programme fonctionne et les collissions sont bien détéctées pour les zones correspondants au sprites | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Des procédures pour la 2D Mer 27 Mai 2015 - 11:11 | |
| Et voici le programme de démo de collisions, avec l'affichage du nom des tunes concernés par une collision: - Code:
-
' 2d_utilities.bas
label clic, key
dim sprites(500,7) : ' jusqu'à 500 sprites : ' ,0)=largeur ,1)=hauteur : ' ,2)=visible/invisible ,3)=impénétrable : ' ,4)=coordonnée x ,5)=coordonnée y : ' ,6)=numéro d'objet DLIST contenant les tunes : ' ,6)=transformé en index dans tunes(..,..) : ' ,7)=nombre de tunes dim ntunes% : ' nombre de tunes dans tunes(..,..) dim tunes(3000,4) : ' jusqu'à 3000 tunes : ' ,0)=sprite ,1)=coordonnée x ,2)=coordonnée y : ' ,3)=largeur ,4)=hauteur dim tnames$(3000) : ' noms des tunes dim nsprite% : ' dernier numéro de sprite créé dim sprite_trouve% : ' numéro du sprite trouvé par un clic (ou 0 si non trouvé) dim sprite_collision% : ' numéro du sprite touché par une collision dim tune_collision% : ' numéro du tune fixe touché (ou 0 si non trouvé) dim tune_collision_mobile% : ' numéro du tune mobile touché (ou 0 si non trouvé) dim name_collision$ : ' nom du tune fixe touché dim name_collision_mobile$ : ' nom du tune mobile touché dim scene_2d% : ' numéro d'objet du scene2d dim trace% : trace% = 0 : ' mettre 1 pour afficher une trace des calculs dim i%, j%, d%, dx%, dy%, s$, sm$
scene_2d% = 17 : ' juste un exemple scene2d scene_2d% : ' créer le scene2d sprite_target_is scene_2d% : ' assurer du bon ciblage on_click scene_2d%,clic
dlist 101 : ' pour recevoir la liste des tunes pour sprite 1 if trace%=1 then list 102 : top 102,500 : width 102,1000 : height 102,200
full_space 0 full_space scene_2d% picture 10 : hide 10 : width 10,200 : height 10,200 image 11 2d_target_is 10
' color 10,255,0,0 ' 2d_image_copy 11,0,0,200,200 ' creer_sprite(50,50,11,1) : ' sprite rouge impénétrable file_load 10,"Android.bmp" 2d_image_copy 11,0,0,200,200 file_load 101,"Android_mask_tuned_list.txt" creer_sprite_avec_tunes(50,50,11,1,101) : ' sprite "Android" impénétrable, avec tunes
' color 10,0,0,255 ' 2d_image_copy 11,0,0,200,200 : ' sprite bleu impénétrable ' creer_sprite(400,120,11,1) file_load 10,"Android.bmp" 2d_image_copy 11,0,0,200,200 ' file_load 101,"Android_mask_tuned_list.txt" : ' déjà chargé creer_sprite_avec_tunes(400,130,11,1,101) : ' sprite "Android" impénétrable, avec tunes
color 10,255,255,0 2d_image_copy 11,0,0,200,200 : ' sprite jaune pénétrable creer_sprite(280,180,11,0)
on_key_down 0,key
end
' ***** frappe d'une touche au clavier key: d% = scancode if d%=37 : ' gauche dx% = 0 - 1 dy% = 0 end_if if d%=38 : ' haut dx% = 0 dy% = 0 - 1 end_if if d%=39 : ' droite dx% = 1 dy% = 0 end_if if d%=40 : ' bas dx% = 0 dy% = 1 end_if for i%=1 to 30 : ' pas de 30 pixels par frappe d'une flèche deplacer_sprite(2,1,dx%,dy%) : ' déplacement relatif tester_si_collision(2,1) : ' suivi du test de collision s$ = "" if sprite_collision%>0 : ' une collision a eu lieu ? s$ = "collision avec sprite "+str$(sprite_collision%)+" tune "+str$(tune_collision%)+"=["+name_collision$ sm$ = "] touché par sprite 2 tune "+str$(tune_collision_mobile%)+"=["+name_collision_mobile$+"]" message s$ + sm$ deplacer_sprite(2,1,0-dx%,0-dy%) : ' annuler le déplacement en cas de collision exit_for : ' et arrêter le déplacement end_if : ' fin test si collision next i% : ' fin boucle de déplacement return
' ***** reste du programme initial, à conserver pour le moment... for i%=399 to 0 step -1 deplacer_sprite(2,0,i%,sprites(2,5)) : ' déplacer horizontalement en absolu display tester_si_collision(2,1) if sprite_collision%>0 message "collision avec sprite "+str$(sprite_collision%)+" tune "+str$(tune_collision%)+" touché par sprite 2 tune "+str$(tune_collision_mobile%) exit_for end_if next i%
for i%=sprites(2,4) to 400 deplacer_sprite(2,0,i%,sprites(2,5)) : ' déplacer horizontalement en absolu display next i%
end ' ***** fin reste du programme initial
' ***** clic dans la scene2d clic: chercher_sprite_selon_clic() if sprite_trouve%>0 message "clic sur sprite "+str$(sprite_trouve%) else message "aucun sprite cliqué" end_if return
sub creer_sprite(x%,y%,img%,dur%) nsprite% = nsprite% + 1 : ' passer au numéro de sprite suivant sprite nsprite% : ' créer le sprite sprites(nsprite%,0) = 200 : ' mémoriser sa largeur sprites(nsprite%,1) = 200 : ' et sa hauteur sprites(nsprite%,2) = 1 : ' marquer "visible" sprites(nsprite%,3) = dur% : ' marquer 0="pénétrable" ou 1="impénétrable" sprites(nsprite%,4) = x% : ' position horizontale du sprite sprites(nsprite%,5) = y% : ' position verticale du sprite sprites(nsprite%,6) = 0 : ' pas de tunes sprites(nsprite%,7) = 0 : ' pas de tunes if img%>0 then sprite_image_load nsprite%,img% : ' copier une image dans le sprite sprite_position nsprite%,x%,y% : ' positionner le sprite à l'endroit voulu display end_sub
sub creer_sprite_avec_tunes(x%,y%,img%,dur%,dl%) dim_local t%, s$, p%, n% if object_exists(dl%)=0 then exit_sub : ' impossible si l'objet n'existe pas if object_type(dl%)<>26 then exit_sub : ' impossible si l'objet n'est pas une DLIST if count(dl%)=0 then exit_sub : ' impossible si la liste des tunes est vide nsprite% = nsprite% + 1 : ' passer au numéro de sprite suivant sprite nsprite% : ' créer le sprite sprites(nsprite%,0) = 200 : ' mémoriser sa largeur sprites(nsprite%,1) = 200 : ' et sa hauteur sprites(nsprite%,2) = 1 : ' marquer "visible" sprites(nsprite%,3) = dur% : ' marquer 0="pénétrable" ou 1="impénétrable" sprites(nsprite%,4) = x% : ' position horizontale du sprite sprites(nsprite%,5) = y% : ' position verticale du sprite sprites(nsprite%,6) = ntunes%+1 : ' indice dans la liste des tunes sprites(nsprite%,7) = count(dl%) : ' nombre de tunes for t%=1 to count(dl%) : ' boucle sur les lignes des tunes ntunes% = ntunes% + 1 : ' compter le nouveau tune tunes(ntunes%,0) = nsprite% : ' mémoriser le numéro du sprite pour ce tune s$ = item_read$(dl%,t%)+"," : ' lire un eligne de tunes p% = instr(s$,",") n% = val(left$(s$,p%-1)) : ' garder le numéro du tune s$ = mid$(s$,p%+1,100) : ' dépasser le numéro de tune p% = instr(s$,",") tunes(ntunes%,1) = val(left$(s$,p%-1)) : ' mémoriser coordonnée x du tune s$ = mid$(s$,p%+1,100) : ' dépasser la coordonnée x du tune p% = instr(s$,",") tunes(ntunes%,2) = val(left$(s$,p%-1)) : ' mémoriser coordonnée y du tune s$ = mid$(s$,p%+1,100) : ' dépasser la coordonnée y du tune p% = instr(s$,",") tunes(ntunes%,3) = val(left$(s$,p%-1)) - tunes(ntunes%,1)+1 : ' mémoriser largeur du tune s$ = mid$(s$,p%+1,100) : ' dépasser la largeur du tune p% = instr(s$,",") tunes(ntunes%,4) = val(left$(s$,p%-1)) - tunes(ntunes%,2)+1 : ' mémoriser hauteur du tune s$ = mid$(s$,p%+1,100) : ' dépasser la hauteur du tune if s$="" then s$ = "Tune "+str$(n%) tnames$(ntunes%) = s$ next t% : ' fin boucle sur les lignes des tunes if img%>0 then sprite_image_load nsprite%,img% : ' copier une image dans le sprite sprite_position nsprite%,x%,y% : ' positionner le sprite à l'endroit voulu
display end_sub
sub deplacer_sprite(n%,rel%,x%,y%) if (n%<1) or (n%>nsprite%) then exit_sub : ' sécuriser if rel%=1 : ' positionnement relatif ? sprites(n%,4) = sprites(n%,4) + x% sprites(n%,5) = sprites(n%,5) + y% else : ' positionnement absolu ! sprites(n%,4) = x% sprites(n%,5) = y% end_if if sprites(nsprite%,2)=1 : ' sprite visible ? sprite_position n%,sprites(n%,4),sprites(n%,5) : ' positionner le sprite visible à l'endroit voulu else : ' sprite caché ! sprite_position n%,sprites(n%,4)+4000,sprites(n%,5) : ' positionner le sprite caché à l'endroit voulu end_if end_sub
sub redimensionner_sprite_x(n%,c) if (n%<1) or (n%>nsprite%) then exit_sub : ' sécuriser sprite_x_scale n%,c : ' ajuster la largeur sprites(n%,0) = sprites(n%,0)*c : ' et mémoriser end_sub
sub redimensionner_sprite_y(n%,c) if (n%<1) or (n%>nsprite%) then exit_sub : ' sécuriser sprite_y_scale n%,c : ' ajuster la hauteur sprites(n%,1) = sprites(n%,1)*c : ' et mémoriser end_sub
sub redimensionner_sprite_xy(n%,cx,cy) if (n%<1) or (n%>nsprite%) then exit_sub : ' sécuriser sprite_scale n%,cx,cy : ' ajuster largeur et hauteur sprites(n%,0) = sprites(n%,0)*cx : ' et mémoriser la largeur sprites(n%,1) = sprites(n%,1)*cy : ' et mémoriser la hauteur end_sub
sub cacher_sprite(n%) if (n%<1) or (n%>nsprite%) then exit_sub : ' sécuriser if sprites(n%,2)=1 : ' est-ce que le sprite est visible ? sprite_x_position n%,sprite_x_position(n%) + 4000 : ' déplacer hors de la vue sprites(n%,2) = 0 : ' signaler "invisible" end_if end_sub
sub montrer_sprite(n%) if (n%<1) or (n%>nsprite%) then exit_sub : ' sécuriser if sprites(n%,2)=0 : ' est-ce que le sprite est invisible ? sprite_x_position n%,sprite_x_position(n%) - 4000 : ' replacer dans la partie visible sprites(n%,2) = 1 : ' signaler "visible" end_if end_sub
sub chercher_sprite_selon_clic() dim_local i%, x%, y%, xs%, ys% sprite_trouve% = 0 : ' supposer "sprite non trouvé" if number_click<>scene_2d% then exit : ' on n'a pas cliqué dans le scene2d ? if nsprite%=0 then exit_sub : ' pas de sprites créés ? x% = mouse_x_left_down(scene_2d%) : ' mémoriser la position horizontale du clic y% = mouse_y_left_down(scene_2d%) : ' mémoriser la position verticale du clic for i%=nsprite% to 1 step -1 : ' boucle sur tous les sprites xs% = sprite_x_position(i%) : ' mémoriser la position horizontale du sprite i% ys% = sprite_y_position(i%) : ' mémoriser la position verticale dusprite i% if (xs%<x%) : ' le bord gauche du sprite est plus à gauche que l'abscisse du clic ? if (ys%<y%) : ' le bord haut du sprite est plus haute que l'ordonnée du sprite ? if xs%+sprites(i%,0)>=x% : ' le bord droit du sprite est plus à droite que l'abscisse du clic ? if ys%+sprites(i%,1)>=y% : ' le bord bas du sprite est plus en bas que l'ordonnée du clic ? sprite_trouve% = i% : ' alors, on a trouvé le sprite exit_sub : ' et on sort end_if : ' fin test sur le bord bas du sprite end_if : ' fin test sur le bord droit du sprite end_if : ' fin test sur le bord haut du sprite end_if : ' fin test sur le bord gauche du sprite next i% : ' fin boucle sur les sprites message "a4" end_sub
sub tester_si_collision(n%,dir%) dim_local i%, x%, y%, w%, h%, xs%, ys%, w, h, ws, hs, t%, nt%, dim_local s$, s1$, ss$, ss1$, p%, p2%, pp%, pp2%, dim_local ntm%, tm%, xsm%, ysm%, wsm, hsm, ind%, indm% sprite_collision% = 0 : ' supposer "pas de collision" tune_collision% = 0 tune_collision_mobile% = 0 if nsprite%<2 then exit_sub : ' pas de collisions possibles ? if sprites(n%,2)=0 then exit_sub : ' le sprite mobile est "invisible" ? if sprites(n%,3)=0 then exit_sub : ' le sprite mobile est "pénétrable" ? x% = sprites(n%,4) : ' position horizontale du sprite en movement y% = sprites(n%,5) : ' position verticale du sprite en movement w = sprites(n%,0) : ' largeur du sprite en movement h = sprites(n%,1) : ' hauteur du sprite en movement for i%=nsprite% to 1 step -1 : ' boucle sur tous les sprites if i%<>n% : ' on est sur un sprite autre que celui qui bouge ? if sprites(i%,3)<>0 : ' sprite en dur ? xs% = sprites(i%,4) : ' position horizontale du sprite à tester ys% = sprites(i%,5) : ' position verticale du sprite à tester ws = sprites(i%,0) : ' largeur du sprite à tester hs = sprites(i%,1) : ' hauteur du sprite à tester select dir% : ' distinction par direction du mouvement case 1: ' gauche if (x%-1)<=(xs%+ws) : ' bord droit fixe peut toucher bord gauche mobile ? if (x%+w)>=(xs%-1) if (ys%+hs)>=y% : ' bord bas mobile plus bas que bord haut fixe ? if ys%<=(y%+h) : ' bord haut mobile plus que bord bas fixe ? sprite_collision% = i% : ' alors collision ' message "collision à gauche avec "+str$(sprite_collision%) end_if end_if end_if end_if case 2: ' haut if (y%-1)<=(ys%+hs) : ' bord bas fixe peut toucher bord haut mobile ? if (y%+h)>=(ys%-1) if (xs%+hs)>=x% : ' bord droit mobile plus à gauche que bord gauche fixe ? if xs%<=(x%+h) : ' bord gauche mobile plus à gauche que bord droit fixe ? sprite_collision% = i% : ' alors collision end_if end_if end_if end_if case 3: ' droite : ' à adapter if (x%+w)=(xs%-1) : ' bord gauche fixe peut toucher bord droit mobile ? if (ys%+hs)>=y% : ' bord bas mobile plus bas que bord haut fixe ? if ys%<=(y%+h) : ' bord haut mobile plus que bord bas fixe ? sprite_collision% = i% : ' alors collision end_if end_if end_if case 4: ' bas : ' à adapter if (y%+h)=(ys%-1) : ' bord haut fixe peut toucher bord bas mobile ? if (xs%+hs)>=x% : ' bord droit mobile plus à gauche que bord gauche fixe ? if xs%<=(x%+h) : ' bord gauche mobile plus à gauche que bord droit fixe ? sprite_collision% = i% : ' alors collision end_if end_if end_if end_select : ' fin distinction par direction ' message str$(sprite_collision%) if sprite_collision%>0 : ' une collision est possible ? if sprites(i%,6)>0 : ' le sprite a des tunes ? if trace%=1 then clear 102 nt% = sprites(i%,7) : ' nombre de tunes ind% = sprites(i%,6)-1 : ' prendre l'indice dans tunes() for t%=1 to nt% : ' boucle sur les tunes du sprite touché xs% = tunes(ind%+t%,1) : ' c'est l'abscisse du coin en haut à gauche ys% = tunes(ind%+t%,2) : ' c'est l'ordonnée du coin en haut à gauche ws = tunes(ind%+t%,3) : ' c'est la largeur hs = tunes(ind%+t%,4) : ' c'est la hauteur xs% = xs% + sprites(i%,4) : ' l'adresse du tune est relative ! ys% = ys% + sprites(i%,5) : ' l'adresse du tune est relative !
if sprites(n%,6)>0 : ' le sprite mobile a des tunes ? ntm% = sprites(n%,7) : ' nombre de tunes du sprite mobile indm% = sprites(n%,6)-1 : ' prendre l'indice dans tunes() for tm%=1 to ntm% : ' boucle sur les tunes du sprite mobileé xsm% = tunes(indm%+tm%,1) : ' c'est l'abscisse du coin en haut à gauche ysm% = tunes(indm%+tm%,2) : ' c'est l'ordonnée du coin en haut à gauche wsm = tunes(indm%+tm%,3) : ' c'est la largeur hsm = tunes(indm%+tm%,4) : ' c'est la hauteur xsm% = xsm% + sprites(n%,4) : ' l'adresse du tune est relative ! ysm% = ysm% + sprites(n%,5) : ' l'adresse du tune est relative ! if trace%=1 item_add 102,str$(t%)+": "+str$(xs%)+","+str$(ys%)+"/"+str$(ws)+","+str$(hs) item_add 102,str$(tm%)+": "+str$(xsm%)+","+str$(ysm%)+"/"+str$(wsm)+","+str$(hsm) item_add 102,"" end_if if (xs%-1)<=(xsm%+wsm) : ' bord gauche tune fixe plus à gauche que bord droit tune mobile ? if (xs%+ws)>=(xsm%-1) : ' bord droit tune fixe plus à droite que bord gauche tune mobile ? if (ysm%+hsm)>=ys% : ' bord bas tune mobile plus bas que bord haut tune fixe ? if ysm%<=(ys%+hs) : ' bord haut tune mobile plus haut que bord bas tune fixe ? sprite_collision% = i% : ' alors collision tune_collision% = t% tune_collision_mobile% = tm% chercher_noms() : ' chercher les noms des tunes if trace%=1 then item_add 102,str$(ind%)+" "+str$(indm%) exit_sub : ' sortie car on a trouvé une collision end_if : ' fin test sur bord haut tune mobile end_if : ' fin test sur bord bas tune mobile end_if : ' fin test sur bord droit tune fixe end_if : ' fin test sur bord gauche tune fixe
next tm% : ' fin boucle sur les tune du mobile else : ' le sprite mobile n'a pas de tunes ! ' ...à faire... end_if : ' fin sprite mobile a des tunes next t% : ' fin boucle sur les tunes du sprite touché sprite_collision% = 0 : ' aucun tune du sprite n'est touché else : ' le sprite n'a pas de tunes ! exit_sub : ' donc, sortie immédiate car colision globale end_if : ' fin test si sprite a des tunes end_if : ' fin collision possible end_if : ' fin test sprite en dur end_if : ' fin test sur sprite "autre" next i% : ' fin boucle sur les sprites end_sub
sub chercher_noms() if tune_collision%>0 : ' est-ce qu'un tune a été touché ? for j%=1 to ntunes% : ' boucle de recherche du sprite concerné if tunes(j%,0)=sprite_collision% : ' est-ce le sprite touché ? name_collision$ = tnames$(j%+tune_collision%-1) : ' prendre le nom du tune exit_for : ' et sortir end_if : ' fin de traitement du sprite trouvé next j% : ' fin boucle sur les tunes else name_collision$ = "" end_if : ' fin traitement du tune touché if name_collision$="" then name_collision$ = "Tune "+tune_collision% : ' nom par défaut if tune_collision_mobile%>0 : ' est-ce qu'un tune mobile a touché ? for j%=1 to ntunes% : ' boucle de recherche du sprite concerné if tunes(j%,0)=2 : ' est-ce le sprite mobile ? name_collision_mobile$ = tnames$(j%+tune_collision_mobile%-1) : ' prendre le nom du tune exit_for : ' et sortir end_if : ' fin de traitement du sprite trouvé next j% : ' fin boucle sur les tunes else name_collision_mobile$ = "" end_if : ' fin traitement du tune touché if name_collision_mobile$="" then name_collision_mobile$ = "Tune "+tune_collision_mobile% : ' nom par défaut end_sub Le fichier Android_mask_tuned_list.txt avec les noms: - Citation :
- 1,43,0,159,69,Tête
2,23,67,64,140,Bras droit 3,140,67,181,136,Bras gauche 4,51,131,96,200,Jambe droite 5,111,131,152,197,Jambe gauche
| |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Des procédures pour la 2D Mer 27 Mai 2015 - 11:37 | |
| Nickel PS: Ah non, pas du tout nickel : Le commentaire qui donne le nom du programme ne correspond pas au programme !! Intolérable ! catastrophique ! Dramatique ! C'est du grand n'importe quoi ... ... D'accord, je sors ... | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Des procédures pour la 2D Mer 27 Mai 2015 - 11:41 | |
| Chez moi, le programme s'appelle bien "build_sprite_mask.bas" !
Mais je suis content que tu apprécies. | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Des procédures pour la 2D Mer 27 Mai 2015 - 13:50 | |
| C'était une boutade, par ce que tu as laissé ' 2d_utilities.bas comme première ligne comme pour l'utilitaire pour construire les Tunes au lieu de mettre ' Programme de test des collisions entre plusieures Tunes par exemple. Mais bon tu as bien compris que c'était une boutade... | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Des procédures pour la 2D Mer 27 Mai 2015 - 14:02 | |
| Dans tes fonctions, je pense que ce serait bien aussi d'avoir un copier_sprite(N1,N2) qui recopie le sprite N1 dans N2 (si N2 n'existe pas, il le créé, sinon il recopie l'image et les propriétés comme les tunes sont identiques, il faudra juste recopier les emplacement 6 et 7 du tableau s'il y en a ... carrément facile avec le tableau. Le seul truc un peu tordu c'est pour sauvegarder l'image du sprite... | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Des procédures pour la 2D Mer 27 Mai 2015 - 22:12 | |
| C'est une bonne idée, et je vais y réfléchir.
Pour le moment, je finalise des collisions avec tunes - c'est presque prêt. | |
| | | Contenu sponsorisé
| Sujet: Re: Des procédures pour la 2D | |
| |
| | | | Des procédures pour la 2D | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |