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 |
---|
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:49 | |
| Voici une version qui semble marcher. Il y a toujours 2 sprites. Les sprites 1 et 2 sont impénétrables, et séparément configurables en carré de couleur ou en Andoid. Le sprite 3 est un carré jaune pénétrable. Les lignes 5 et 7 contiennent le paramétrage des sprites 1 et 2, respectivement. Les commentaires sont explicites. La ligne 30 contient un paramétrage pour afficher une trace des processus de calcul, en cas de besoin. Par défaut, la variable est positionné à 0 ce qui inhibe la trace. Le sprite 2 (carré bleu ou Android) peut être dirigé par les 4 flèches. En cas de collision avec le sprite 1, le programme affiche les numéros des sprites concernés, ainsi que les numéros et les noms des tunes si le cas se présente, pour un Android. A l'aide des paramétrages des lignes 5 et 7, on peut tester les collisions entre: - 2 sprites simples (un carré rouge comme sprite fixe et un carré bleu comme sprite mobile) - 1 sprite simple (carré bleu fixe) contre 1 sprite à tunes (Android) - 1 sprite à tunes fixe (Andoid) contre 1 sprite simple (carré bleu) - 1 sprite à tunes fixe (Andoid) contre 1 sprite à tunes mobile (Andoid) Voici le code: - Code:
-
' 2d_utilities.bas
label clic, key
dim selection_sprite_1% : selection_sprite_1% = 1 : ' 0=carré rouge impénétrable : ' 1=Android impénétrable dim selection_sprite_2% : selection_sprite_2% = 2 : ' 0=carré bleu impénétrable : ' 1=Android impénétrable
dim sprites(500,7) : ' jusqu'à 500 sprites : ' ,0)=largeur ,1)=hauteur : ' ,2)=visible/invisible ,3)=impénétrable : ' ,4)=coordonnée x ,5)=coordonnée y : ' ,6)=numéro d'objet DLIST contenant les tunes : ' ,6)=transformé en index dans tunes(..,..) : ' ,7)=nombre de tunes dim ntunes% : ' nombre de tunes dans tunes(..,..) dim tunes(3000,4) : ' jusqu'à 3000 tunes : ' ,0)=sprite ,1)=coordonnée x ,2)=coordonnée y : ' ,3)=largeur ,4)=hauteur dim tnames$(3000) : ' noms des tunes dim 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
if selection_sprite_1%=0 color 10,255,0,0 2d_image_copy 11,0,0,200,200 creer_sprite(50,50,11,1) : ' sprite rouge impénétrable else file_load 10,"Android.bmp" 2d_image_copy 11,0,0,200,200 file_load 101,"Android_mask_tuned_list.txt" creer_sprite_avec_tunes(50,50,11,1,101) : ' sprite "Android" impénétrable, avec tunes end_if
if selection_sprite_2%=0 color 10,0,0,255 2d_image_copy 11,0,0,200,200 : ' sprite bleu impénétrable creer_sprite(400,120,11,1) else file_load 10,"Android.bmp" 2d_image_copy 11,0,0,200,200 file_load 101,"Android_mask_tuned_list.txt" : ' déjà chargé creer_sprite_avec_tunes(400,130,11,1,101) : ' sprite "Android" impénétrable, avec tunes end_if
color 10,255,255,0 2d_image_copy 11,0,0,200,200 : ' sprite jaune pénétrable creer_sprite(280,180,11,0)
on_key_down 0,key
end
' ***** frappe d'une touche au clavier key: d% = key_down_code 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 ! if (xs%-1)<=(x%+w) : ' bord gauche tune fixe plus à gauche que bord droit sprite mobile ? if (xs%+ws)>=(x%-1) : ' bord droit tune fixe plus à droite que bord gauche sprite mobile ? if (y%+h)>=ys% : ' bord bas sprite mobile plus bas que bord haut tune fixe ? if y%<=(ys%+hs) : ' bord haut sprite mobile plus haut que bord bas tune fixe ? sprite_collision% = i% : ' alors collision tune_collision% = t% tune_collision_mobile% = 0 chercher_noms() : ' chercher les noms des tunes if trace%=1 then item_add 102,str$(ind%)+" fixe" exit_sub : ' sortie car on a trouvé une collision end_if : ' fin test sur bord haut tune mobile end_if : ' fin test sur bord bas tune mobile end_if : ' fin test sur bord droit tune fixe end_if : ' fin test sur bord gauche tune fixe end_if : ' fin sprite mobile a des tunes next t% : ' fin boucle sur les tunes du sprite touché sprite_collision% = 0 : ' aucun tune du sprite n'est touché else : ' le sprite fixe n'a pas de tunes ! if sprites(n%,6)>0 : ' le sprite mobile a des tunes ? ntm% = sprites(n%,7) : ' nombre de tunes du sprite mobile indm% = sprites(n%,6)-1 : ' prendre l'indice dans tunes() for tm%=1 to ntm% : ' boucle sur les tunes du sprite mobileé xsm% = tunes(indm%+tm%,1) : ' c'est l'abscisse du coin en haut à gauche ysm% = tunes(indm%+tm%,2) : ' c'est l'ordonnée du coin en haut à gauche wsm = tunes(indm%+tm%,3) : ' c'est la largeur hsm = tunes(indm%+tm%,4) : ' c'est la hauteur xsm% = xsm% + sprites(n%,4) : ' l'adresse du tune est relative ! ysm% = ysm% + sprites(n%,5) : ' l'adresse du tune est relative ! if trace%=1 item_add 102,"fixe: "+str$(sprites(i%,4))+","+str$(sprites(i%,5))+" / "+str$(sprites(i%,0))+","+str$(sprites(i%,1)) item_add 102,"tune: "+str$(tm%)+": "+str$(xsm%)+","+str$(ysm%)+" / "+str$(wsm)+","+str$(hsm) item_add 102,"" end_if if (sprites(i%,4)-1)<=(xsm%+wsm) : ' bord gauche sprite fixe plus à gauche que bord droit tune mobile ? item_add 102,"a" if (sprites(i%,4)+sprites(i%,0))>=(xsm%-1) : ' bord droit sprite fixe plus à droite que bord gauche tune mobile ? item_add 102,"b" if (ysm%+hsm)>=sprites(i%,5) : ' bord bas tune mobile plus bas que bord haut sprite fixe ? item_add 102,"c" if ysm%<=(sprites(i%,5)+sprites(i%,1)) : ' bord haut tune mobile plus haut que bord bas sprite fixe ? item_add 102,"d" sprite_collision% = i% : ' alors collision tune_collision% = 0 tune_collision_mobile% = tm% chercher_noms() : ' chercher les noms des tunes if trace%=1 then item_add 102,str$(indm%)+" mobile" exit_sub : ' sortie car on a trouvé une collision end_if : ' fin test sur bord haut tune mobile end_if : ' fin test sur bord bas tune mobile end_if : ' fin test sur bord droit tune fixe end_if : ' fin test sur bord gauche tune fixe next tm% : ' fin boucle sur les tunes mobile sprite_collision% = 0 else : ' sprite mobile n'a pas de tunes ! chercher_noms() : ' alors, construire les noms par défaut end_if : ' fin de test sur les tunes du sprite mobile exit_sub : ' donc, sortie immédiate car colision globale end_if : ' fin test si sprite a des tunes end_if : ' fin collision possible end_if : ' fin test sprite en dur end_if : ' fin test sur sprite "autre" next i% : ' fin boucle sur les sprites end_sub
sub chercher_noms() 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$ = "Sprite entier" end_if : ' fin traitement du tune touché if name_collision$="" then name_collision$ = "Tune "+str$(tune_collision%) : ' nom par défaut if tune_collision_mobile%>0 : ' est-ce qu'un tune mobile a touché ? for j%=1 to ntunes% : ' boucle de recherche du sprite concerné if tunes(j%,0)=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$ = "Sprite entier" end_if : ' fin traitement du tune touché if name_collision_mobile$="" then name_collision_mobile$ = "Tune "+str$(tune_collision_mobile%) : ' nom par défaut end_sub L'algorithme semble être au point. A voir... | |
| | | 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 Jeu 28 Mai 2015 - 0:08 | |
| Et voici une version qui contient une SUB copier_sprite. Cette SUB copie un sprite dans un nouveau sprite, avec tous ses attributs, y compris sont image, sa visibilité etc, en lui affectant sa propre position. Le programme de démo l'utilise pour copier le sprite 1. La copie devient donc le sprite 3, et le sprite 2 (mobile) peut entrer en collision, aussi bien avec le sprite 1 qu'avec le sprite 4. Ceci est réalisé par la création d'un dossier temporaire .\Temp_Sprites, dans lequel on copie toutes les images sous forme d'un fichier sprite_xxx.bmp, xxx étant le numéro du sprite. - Code:
-
' 2d_utilities.bas
label clic, key, close0
dim selection_sprite_1% : selection_sprite_1% = 1 : ' 0=carré rouge impénétrable : ' 1=Android impénétrable dim selection_sprite_2% : selection_sprite_2% = 2 : ' 0=carré bleu impénétrable : ' 1=Android impénétrable
dim sprites(500,7) : ' jusqu'à 500 sprites : ' ,0)=largeur ,1)=hauteur : ' ,2)=visible/invisible ,3)=impénétrable : ' ,4)=coordonnée x ,5)=coordonnée y : ' ,6)=numéro d'objet DLIST contenant les tunes : ' ,6)=transformé en index dans tunes(..,..) : ' ,7)=nombre de tunes dim ntunes% : ' nombre de tunes dans tunes(..,..) dim tunes(3000,4) : ' jusqu'à 3000 tunes : ' ,0)=sprite ,1)=coordonnée x ,2)=coordonnée y : ' ,3)=largeur ,4)=hauteur dim tnames$(3000) : ' noms des tunes dim 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 images$ : ' nom de dossier temporaire pour copier les images des sprites 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
memoriser_images() : ' activer la mémorisation des images des sprites
if selection_sprite_1%=0 color 10,255,0,0 2d_image_copy 11,0,0,200,200 creer_sprite(50,50,11,1) : ' sprite rouge impénétrable else file_load 10,"Android.bmp" 2d_image_copy 11,0,0,200,200 file_load 101,"Android_mask_tuned_list.txt" creer_sprite_avec_tunes(50,50,11,1,101) : ' sprite "Android" impénétrable, avec tunes end_if
if selection_sprite_2%=0 color 10,0,0,255 2d_image_copy 11,0,0,200,200 : ' sprite bleu impénétrable creer_sprite(400,120,11,1) else file_load 10,"Android.bmp" 2d_image_copy 11,0,0,200,200 file_load 101,"Android_mask_tuned_list.txt" : ' déjà chargé creer_sprite_avec_tunes(400,130,11,1,101) : ' sprite "Android" impénétrable, avec tunes end_if
color 10,255,255,0 2d_image_copy 11,0,0,200,200 : ' sprite jaune pénétrable creer_sprite(280,180,11,0)
copier_sprite(1,300,500,11) : ' copie du sprite 1 (en sprite 4)
on_key_down 0,key on_close 0,close0
end
' ***** frappe d'une touche au clavier key: d% = key_down_code 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 ' ***** fermeture de la form 0 close0: effacer_images() : ' effacer éventuellement les images des sprites return
sub memoriser_images() dim_local d$ if images$<>"" then exit_sub : ' mémorisation déjà activé ? d$ = dir_current$ + "\Temp_Sprites" : ' construire dossier temporaire des images des sprites if dir_exists(d$)=0 : ' ce dossier n'existe pas ? dir_make d$ : ' alors créer ce dossier images$ = d$ : ' et mémoriser le chemin end_if : ' fin test existance du dossier temporaire end_sub
sub effacer_images() dim_local old$, f$ if images$="" then exit_sub : ' le dossier temporaire n'existe pas ? Rien à faire ! old$ = dir_current$ : ' mémoriser l'actuel dossier courant dir_change images$ : ' changer pour le dossier temporaire des images f$ = file_find_first$ : ' prendre le premier nom de fichier de ce dossier while f$<>"_" : ' tout est traité ? if left$(f$,1)<>"." then file_delete f$ : ' détruire si c'est un vrai fichier f$ = file_find_next$ : ' passer au fichier suivant end_while : ' fin de boucle de traitement file_find_close : ' clore la fonction de recherche dir_change old$ : ' remettre l'ancien dossier courant rmdir images$ : ' supprimer le dossier des images images$ = "" : ' et "oublier" ce dossier end_sub
sub creer_sprite(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 : ' une image est fournie ? sprite_image_load nsprite%,img% : ' copier une image dans le sprite if images$<>"" then file_save img%,images$+"\sprite_"+str$(nsprite%)+".bmp" : ' et la sauver end_if : ' fin test image fournie sprite_position nsprite%,x%,y% : ' positionner le sprite à l'endroit voulu display end_sub
sub creer_sprite_avec_tunes(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 : ' une image est fournie ? sprite_image_load nsprite%,img% : ' copier une image dans le sprite if images$<>"" then file_save img%,images$+"\sprite_"+str$(nsprite%)+".bmp" : ' et la sauver end_if : ' fin test image fournie sprite_position nsprite%,x%,y% : ' positionner le sprite à l'endroit voulu
display end_sub
sub copier_sprite(n%,x%,y%,img%) dim_local i%, nt% nsprite% = nsprite% + 1 : ' passer au numéro de sprite suivant sprite nsprite% : ' créer le sprite sprites(nsprite%,0) = sprites(n%,0) : ' mémoriser sa largeur sprites(nsprite%,1) = sprites(n%,1) : ' et sa hauteur sprites(nsprite%,2) = sprites(n%,2) : ' marquer "visible" sprites(nsprite%,3) = sprites(n%,3) : ' marquer 0="pénétrable" ou 1="impénétrable" sprites(nsprite%,4) = x% : ' position horizontale du sprite if sprites(n%,3)=0 then sprites(nsprite%,4) = sprites(nsprite%,4) + 4000 : ' traitement "invisible" sprites(nsprite%,5) = y% : ' position verticale du sprite if sprites(n%,6)=0 : ' le sprite source n'a pas de tunes ? sprites(nsprite%,6) = 0 : ' pas de tunes sprites(nsprite%,7) = 0 : ' pas de tunes else : ' le sprite source a des tunes nt% = sprites(n%,6) : ' alors mémoriser l'indice dans la liste des tunes sprites(nsprite%,6) = ntunes%+1 : ' indice dans la liste des tunes sprites(nsprite%,7) = sprites(n%,0) : ' nombre de tunes for i%=1 to sprites(n%,0) : ' boucle sur tous les tunes du sprite source ntunes% = ntunes% + 1 : ' compter le nouveau tune tunes(ntunes%,0) = nsprite% : ' mémoriser le numéro du sprite pour ce tune tunes(ntunes%,1) = tunes(nt%+i%-1,1) : ' et copier les autres valeurs tunes(ntunes%,2) = tunes(nt%+i%-1,2) tunes(ntunes%,3) = tunes(nt%+i%-1,3) tunes(ntunes%,4) = tunes(nt%+i%-1,4) tnames$(ntunes%) = tnames$(nt%+i%-1) : ' copier le nom du tune next i% : ' fin boucle de copie des tunes end_if : ' fin traitement des tunes
if images$<>"" : ' les images sont mémorisées ? if file_exists(images$+"\sprite_"+str$(n%)+".bmp")=1 file_load img%,images$+"\sprite_"+str$(n%)+".bmp" : ' charger l'image dans objet IMG% sprite_image_load nsprite%,img% : ' charger l'image dans le nouveau sprite file_save img%,images$+"\sprite_"+str$(nsprite%)+".bmp" : ' et la sauver end_if : ' fin test "image existante" end_if : ' fin test images mémorisées
sprite_position nsprite%,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 ! if (xs%-1)<=(x%+w) : ' bord gauche tune fixe plus à gauche que bord droit sprite mobile ? if (xs%+ws)>=(x%-1) : ' bord droit tune fixe plus à droite que bord gauche sprite mobile ? if (y%+h)>=ys% : ' bord bas sprite mobile plus bas que bord haut tune fixe ? if y%<=(ys%+hs) : ' bord haut sprite mobile plus haut que bord bas tune fixe ? sprite_collision% = i% : ' alors collision tune_collision% = t% tune_collision_mobile% = 0 chercher_noms() : ' chercher les noms des tunes if trace%=1 then item_add 102,str$(ind%)+" fixe" exit_sub : ' sortie car on a trouvé une collision end_if : ' fin test sur bord haut tune mobile end_if : ' fin test sur bord bas tune mobile end_if : ' fin test sur bord droit tune fixe end_if : ' fin test sur bord gauche tune fixe end_if : ' fin sprite mobile a des tunes next t% : ' fin boucle sur les tunes du sprite touché sprite_collision% = 0 : ' aucun tune du sprite n'est touché else : ' le sprite fixe n'a pas de tunes ! if sprites(n%,6)>0 : ' le sprite mobile a des tunes ? ntm% = sprites(n%,7) : ' nombre de tunes du sprite mobile indm% = sprites(n%,6)-1 : ' prendre l'indice dans tunes() for tm%=1 to ntm% : ' boucle sur les tunes du sprite mobileé xsm% = tunes(indm%+tm%,1) : ' c'est l'abscisse du coin en haut à gauche ysm% = tunes(indm%+tm%,2) : ' c'est l'ordonnée du coin en haut à gauche wsm = tunes(indm%+tm%,3) : ' c'est la largeur hsm = tunes(indm%+tm%,4) : ' c'est la hauteur xsm% = xsm% + sprites(n%,4) : ' l'adresse du tune est relative ! ysm% = ysm% + sprites(n%,5) : ' l'adresse du tune est relative ! if trace%=1 item_add 102,"fixe: "+str$(sprites(i%,4))+","+str$(sprites(i%,5))+" / "+str$(sprites(i%,0))+","+str$(sprites(i%,1)) item_add 102,"tune: "+str$(tm%)+": "+str$(xsm%)+","+str$(ysm%)+" / "+str$(wsm)+","+str$(hsm) item_add 102,"" end_if if (sprites(i%,4)-1)<=(xsm%+wsm) : ' bord gauche sprite fixe plus à gauche que bord droit tune mobile ? item_add 102,"a" if (sprites(i%,4)+sprites(i%,0))>=(xsm%-1) : ' bord droit sprite fixe plus à droite que bord gauche tune mobile ? item_add 102,"b" if (ysm%+hsm)>=sprites(i%,5) : ' bord bas tune mobile plus bas que bord haut sprite fixe ? item_add 102,"c" if ysm%<=(sprites(i%,5)+sprites(i%,1)) : ' bord haut tune mobile plus haut que bord bas sprite fixe ? item_add 102,"d" sprite_collision% = i% : ' alors collision tune_collision% = 0 tune_collision_mobile% = tm% chercher_noms() : ' chercher les noms des tunes if trace%=1 then item_add 102,str$(indm%)+" mobile" exit_sub : ' sortie car on a trouvé une collision end_if : ' fin test sur bord haut tune mobile end_if : ' fin test sur bord bas tune mobile end_if : ' fin test sur bord droit tune fixe end_if : ' fin test sur bord gauche tune fixe next tm% : ' fin boucle sur les tunes mobile sprite_collision% = 0 else : ' sprite mobile n'a pas de tunes ! chercher_noms() : ' alors, construire les noms par défaut end_if : ' fin de test sur les tunes du sprite mobile exit_sub : ' donc, sortie immédiate car colision globale end_if : ' fin test si sprite a des tunes end_if : ' fin collision possible end_if : ' fin test sprite en dur end_if : ' fin test sur sprite "autre" next i% : ' fin boucle sur les sprites end_sub
sub chercher_noms() 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$ = "Sprite entier" end_if : ' fin traitement du tune touché if name_collision$="" then name_collision$ = "Tune "+str$(tune_collision%) : ' nom par défaut if tune_collision_mobile%>0 : ' est-ce qu'un tune mobile a touché ? for j%=1 to ntunes% : ' boucle de recherche du sprite concerné if tunes(j%,0)=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$ = "Sprite entier" end_if : ' fin traitement du tune touché if name_collision_mobile$="" then name_collision_mobile$ = "Tune "+str$(tune_collision_mobile%) : ' nom par défaut end_sub | |
| | | 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 Jeu 28 Mai 2015 - 1:42 | |
| Il y a encore un problème en approche à partir de la gauche, en utilisant la flèche droite. je vais creuser cela... | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Des procédures pour la 2D Jeu 28 Mai 2015 - 10:09 | |
| Je ne suis pas intervenu comme tu travailles toujours dessus pour le moment, mais n'hésites pas à demander si tu as besoin de testeur. PS: Tu en pense quoi de mon idée de fonction copier_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 Jeu 28 Mai 2015 - 21:47 | |
| @Jicehel: - Citation :
- Tu en pense quoi de mon idée de fonction copier_sprite ?
Tu n'as pas vu que c'est déjà implémenté, dans mon dernier code de 0h08 ? | |
| | | 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 Jeu 28 Mai 2015 - 22:31 | |
| Et, avant d'aller plus loin dans la recherche du bug qui reste, voici une version qui gère, on seulement les noms des tunes, mais également les noms des sprites ! Oui, dans cette version, on peut donner des noms aux sprites ! - Code:
-
' 2d_utilities.bas
label clic, key, close0
dim selection_sprite_1% : selection_sprite_1% = 1 : ' 0=carré rouge impénétrable : ' 1=Android impénétrable dim selection_sprite_2% : selection_sprite_2% = 2 : ' 0=carré bleu impénétrable : ' 1=Android impénétrable
dim sprites(500,7) : ' jusqu'à 500 sprites : ' ,0)=largeur ,1)=hauteur : ' ,2)=visible/invisible ,3)=impénétrable : ' ,4)=coordonnée x ,5)=coordonnée y : ' ,6)=numéro d'objet DLIST contenant les tunes : ' ,6)=transformé en index dans tunes(..,..) : ' ,7)=nombre de tunes dim ntunes% : ' nombre de tunes dans tunes(..,..) dim tunes(3000,4) : ' jusqu'à 3000 tunes : ' ,0)=sprite ,1)=coordonnée x ,2)=coordonnée y : ' ,3)=largeur ,4)=hauteur dim tnames$(3000) : ' noms des tunes dim snames$(500) : ' noms des sprites dim nsprite% : ' dernier numéro de sprite créé dim sprite_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 sprite_collision_mobile% : ' numéro du sprite mobile touché dim tune_collision% : ' numéro du tune fixe touché (ou 0 si non trouvé) dim tune_collision_mobile% : ' numéro du tune mobile touché (ou 0 si non trouvé) dim tname_collision$ : ' nom du tune fixe touché dim tname_collision_mobile$ : ' nom du tune mobile touché dim sname_collision$ : ' nom du sprite fixe touché dim sname_collision_mobile$ : ' nom du sprite mobile touché dim scene_2d% : ' numéro d'objet du scene2d dim trace% : trace% = 0 : ' mettre 1 pour afficher une trace des calculs dim images$ : ' nom de dossier temporaire pour copier les images des sprites dim i%, j%, d%, dx%, dy%, s$, sm$
scene_2d% = 17 : ' juste un exemple scene2d scene_2d% : ' créer le scene2d sprite_target_is scene_2d% : ' assurer du bon ciblage on_click scene_2d%,clic
dlist 101 : ' pour recevoir la liste des tunes pour sprite 1 if trace%=1 then list 102 : top 102,500 : width 102,1000 : height 102,200
full_space 0 full_space scene_2d% picture 10 : hide 10 : width 10,200 : height 10,200 image 11 2d_target_is 10
memoriser_images() : ' activer la mémorisation des images des sprites
if selection_sprite_1%=0 color 10,255,0,0 2d_image_copy 11,0,0,200,200 creer_sprite("Carré rouge fixe",50,50,11,1) : ' sprite rouge impénétrable else file_load 10,"Android.bmp" 2d_image_copy 11,0,0,200,200 file_load 101,"Android_mask_tuned_list.txt" creer_sprite_avec_tunes("Andoid fixe",50,50,11,1,101) : ' sprite "Android" impénétrable, avec tunes end_if
if selection_sprite_2%=0 color 10,0,0,255 2d_image_copy 11,0,0,200,200 : ' sprite bleu impénétrable creer_sprite("Carré bleu fixe",400,120,11,1) else file_load 10,"Android.bmp" 2d_image_copy 11,0,0,200,200 file_load 101,"Android_mask_tuned_list.txt" creer_sprite_avec_tunes("Android mobile",400,130,11,1,101) : ' sprite "Android" impénétrable, avec tunes end_if
color 10,255,255,0 2d_image_copy 11,0,0,200,200 : ' sprite jaune pénétrable creer_sprite("Carré jaune fixe",280,180,11,0)
copier_sprite("Android fixe copié",1,600,500,11) : ' copie du sprite 1 (en sprite 4)
on_key_down 0,key on_close 0,close0
end
' ***** frappe d'une touche au clavier key: d% = key_down_code 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%)+"=["+sname_collision$+"] tune "+str$(tune_collision%)+"=["+tname_collision$ sm$ = "] touché par sprite "+str$(sprite_collision_mobile%)+"=["+sname_collision_mobile$+"] tune "+str$(tune_collision_mobile%)+"=["+tname_collision_mobile$+"]" message s$ + sm$ deplacer_sprite(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
' ***** 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 ' ***** fermeture de la form 0 close0: effacer_images() : ' effacer éventuellement les images des sprites return
sub memoriser_images() dim_local d$ if images$<>"" then exit_sub : ' mémorisation déjà activé ? d$ = dir_current$ + "\Temp_Sprites" : ' construire dossier temporaire des images des sprites if dir_exists(d$)=0 : ' ce dossier n'existe pas ? dir_make d$ : ' alors créer ce dossier images$ = d$ : ' et mémoriser le chemin end_if : ' fin test existance du dossier temporaire end_sub
sub effacer_images() dim_local old$, f$ if images$="" then exit_sub : ' le dossier temporaire n'existe pas ? Rien à faire ! old$ = dir_current$ : ' mémoriser l'actuel dossier courant dir_change images$ : ' changer pour le dossier temporaire des images f$ = file_find_first$ : ' prendre le premier nom de fichier de ce dossier while f$<>"_" : ' tout est traité ? if left$(f$,1)<>"." then file_delete f$ : ' détruire si c'est un vrai fichier f$ = file_find_next$ : ' passer au fichier suivant end_while : ' fin de boucle de traitement file_find_close : ' clore la fonction de recherche dir_change old$ : ' remettre l'ancien dossier courant rmdir images$ : ' supprimer le dossier des images images$ = "" : ' et "oublier" ce dossier end_sub
sub creer_sprite(nam$,x%,y%,img%,dur%) nsprite% = nsprite% + 1 : ' passer au numéro de sprite suivant sprite nsprite% : ' créer le sprite snames$(nsprite%) = nam$ : ' memoriser son nom sprites(nsprite%,0) = 200 : ' mémoriser sa largeur sprites(nsprite%,1) = 200 : ' et sa hauteur sprites(nsprite%,2) = 1 : ' marquer "visible" sprites(nsprite%,3) = dur% : ' marquer 0="pénétrable" ou 1="impénétrable" sprites(nsprite%,4) = x% : ' position horizontale du sprite sprites(nsprite%,5) = y% : ' position verticale du sprite sprites(nsprite%,6) = 0 : ' pas de tunes sprites(nsprite%,7) = 0 : ' pas de tunes if img%>0 : ' une image est fournie ? sprite_image_load nsprite%,img% : ' copier une image dans le sprite if images$<>"" then file_save img%,images$+"\sprite_"+str$(nsprite%)+".bmp" : ' et la sauver end_if : ' fin test image fournie sprite_position nsprite%,x%,y% : ' positionner le sprite à l'endroit voulu display end_sub
sub creer_sprite_avec_tunes(nam$,x%,y%,img%,dur%,dl%) dim_local t%, s$, p%, n% if object_exists(dl%)=0 then exit_sub : ' impossible si l'objet n'existe pas if object_type(dl%)<>26 then exit_sub : ' impossible si l'objet n'est pas une DLIST if count(dl%)=0 then exit_sub : ' impossible si la liste des tunes est vide nsprite% = nsprite% + 1 : ' passer au numéro de sprite suivant sprite nsprite% : ' créer le sprite snames$(nsprite%) = nam$ : ' memoriser son nom sprites(nsprite%,0) = 200 : ' mémoriser sa largeur sprites(nsprite%,1) = 200 : ' et sa hauteur sprites(nsprite%,2) = 1 : ' marquer "visible" sprites(nsprite%,3) = dur% : ' marquer 0="pénétrable" ou 1="impénétrable" sprites(nsprite%,4) = x% : ' position horizontale du sprite sprites(nsprite%,5) = y% : ' position verticale du sprite sprites(nsprite%,6) = ntunes%+1 : ' indice dans la liste des tunes sprites(nsprite%,7) = count(dl%) : ' nombre de tunes for t%=1 to count(dl%) : ' boucle sur les lignes des tunes ntunes% = ntunes% + 1 : ' compter le nouveau tune tunes(ntunes%,0) = nsprite% : ' mémoriser le numéro du sprite pour ce tune s$ = item_read$(dl%,t%)+"," : ' lire un eligne de tunes p% = instr(s$,",") n% = val(left$(s$,p%-1)) : ' garder le numéro du tune s$ = mid$(s$,p%+1,100) : ' dépasser le numéro de tune p% = instr(s$,",") tunes(ntunes%,1) = val(left$(s$,p%-1)) : ' mémoriser coordonnée x du tune s$ = mid$(s$,p%+1,100) : ' dépasser la coordonnée x du tune p% = instr(s$,",") tunes(ntunes%,2) = val(left$(s$,p%-1)) : ' mémoriser coordonnée y du tune s$ = mid$(s$,p%+1,100) : ' dépasser la coordonnée y du tune p% = instr(s$,",") tunes(ntunes%,3) = val(left$(s$,p%-1)) - tunes(ntunes%,1)+1 : ' mémoriser largeur du tune s$ = mid$(s$,p%+1,100) : ' dépasser la largeur du tune p% = instr(s$,",") tunes(ntunes%,4) = val(left$(s$,p%-1)) - tunes(ntunes%,2)+1 : ' mémoriser hauteur du tune s$ = mid$(s$,p%+1,100) : ' dépasser la hauteur du tune if s$="" then s$ = "Tune "+str$(n%) tnames$(ntunes%) = s$ next t% : ' fin boucle sur les lignes des tunes if img%>0 : ' une image est fournie ? sprite_image_load nsprite%,img% : ' copier une image dans le sprite if images$<>"" then file_save img%,images$+"\sprite_"+str$(nsprite%)+".bmp" : ' et la sauver end_if : ' fin test image fournie sprite_position nsprite%,x%,y% : ' positionner le sprite à l'endroit voulu
display end_sub
sub copier_sprite(nam$,n%,x%,y%,img%) dim_local i%, nt% nsprite% = nsprite% + 1 : ' passer au numéro de sprite suivant sprite nsprite% : ' créer le sprite snames$(nsprite%) = nam$ : ' memoriser son nom sprites(nsprite%,0) = sprites(n%,0) : ' mémoriser sa largeur sprites(nsprite%,1) = sprites(n%,1) : ' et sa hauteur sprites(nsprite%,2) = sprites(n%,2) : ' marquer "visible" sprites(nsprite%,3) = sprites(n%,3) : ' marquer 0="pénétrable" ou 1="impénétrable" sprites(nsprite%,4) = x% : ' position horizontale du sprite if sprites(n%,3)=0 then sprites(nsprite%,4) = sprites(nsprite%,4) + 4000 : ' traitement "invisible" sprites(nsprite%,5) = y% : ' position verticale du sprite if sprites(n%,6)=0 : ' le sprite source n'a pas de tunes ? sprites(nsprite%,6) = 0 : ' pas de tunes sprites(nsprite%,7) = 0 : ' pas de tunes else : ' le sprite source a des tunes nt% = sprites(n%,6) : ' alors mémoriser l'indice dans la liste des tunes sprites(nsprite%,6) = ntunes%+1 : ' indice dans la liste des tunes sprites(nsprite%,7) = sprites(n%,0) : ' nombre de tunes for i%=1 to sprites(n%,0) : ' boucle sur tous les tunes du sprite source ntunes% = ntunes% + 1 : ' compter le nouveau tune tunes(ntunes%,0) = nsprite% : ' mémoriser le numéro du sprite pour ce tune tunes(ntunes%,1) = tunes(nt%+i%-1,1) : ' et copier les autres valeurs tunes(ntunes%,2) = tunes(nt%+i%-1,2) tunes(ntunes%,3) = tunes(nt%+i%-1,3) tunes(ntunes%,4) = tunes(nt%+i%-1,4) tnames$(ntunes%) = tnames$(nt%+i%-1) : ' copier le nom du tune next i% : ' fin boucle de copie des tunes end_if : ' fin traitement des tunes
if images$<>"" : ' les images sont mémorisées ? if file_exists(images$+"\sprite_"+str$(n%)+".bmp")=1 file_load img%,images$+"\sprite_"+str$(n%)+".bmp" : ' charger l'image dans objet IMG% sprite_image_load nsprite%,img% : ' charger l'image dans le nouveau sprite file_save img%,images$+"\sprite_"+str$(nsprite%)+".bmp" : ' et la sauver end_if : ' fin test "image existante" end_if : ' fin test images mémorisées
sprite_position nsprite%,sprites(nsprite%,4),sprites(nsprite%,5) : ' positionner le sprite à l'endroit voulu
display end_sub
sub deplacer_sprite(n%,rel%,x%,y%) if (n%<1) or (n%>nsprite%) then exit_sub : ' sécuriser if rel%=1 : ' positionnement relatif ? sprites(n%,4) = sprites(n%,4) + x% sprites(n%,5) = sprites(n%,5) + y% else : ' positionnement absolu ! sprites(n%,4) = x% sprites(n%,5) = y% end_if if sprites(nsprite%,2)=1 : ' sprite visible ? sprite_position n%,sprites(n%,4),sprites(n%,5) : ' positionner le sprite visible à l'endroit voulu else : ' sprite caché ! sprite_position n%,sprites(n%,4)+4000,sprites(n%,5) : ' positionner le sprite caché à l'endroit voulu end_if end_sub
sub redimensionner_sprite_x(n%,c) if (n%<1) or (n%>nsprite%) then exit_sub : ' sécuriser sprite_x_scale n%,c : ' ajuster la largeur sprites(n%,0) = sprites(n%,0)*c : ' et mémoriser end_sub
sub redimensionner_sprite_y(n%,c) if (n%<1) or (n%>nsprite%) then exit_sub : ' sécuriser sprite_y_scale n%,c : ' ajuster la hauteur sprites(n%,1) = sprites(n%,1)*c : ' et mémoriser end_sub
sub redimensionner_sprite_xy(n%,cx,cy) if (n%<1) or (n%>nsprite%) then exit_sub : ' sécuriser sprite_scale n%,cx,cy : ' ajuster largeur et hauteur sprites(n%,0) = sprites(n%,0)*cx : ' et mémoriser la largeur sprites(n%,1) = sprites(n%,1)*cy : ' et mémoriser la hauteur end_sub
sub cacher_sprite(n%) if (n%<1) or (n%>nsprite%) then exit_sub : ' sécuriser if sprites(n%,2)=1 : ' est-ce que le sprite est visible ? sprite_x_position n%,sprite_x_position(n%) + 4000 : ' déplacer hors de la vue sprites(n%,2) = 0 : ' signaler "invisible" end_if end_sub
sub montrer_sprite(n%) if (n%<1) or (n%>nsprite%) then exit_sub : ' sécuriser if sprites(n%,2)=0 : ' est-ce que le sprite est invisible ? sprite_x_position n%,sprite_x_position(n%) - 4000 : ' replacer dans la partie visible sprites(n%,2) = 1 : ' signaler "visible" end_if end_sub
sub chercher_sprite_selon_clic() dim_local i%, x%, y%, xs%, ys% 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" sprite_collision_mobile% = 0 tune_collision% = 0 tune_collision_mobile% = 0 if nsprite%<2 then exit_sub : ' pas de collisions possibles ? if sprites(n%,2)=0 then exit_sub : ' le sprite mobile est "invisible" ? if sprites(n%,3)=0 then exit_sub : ' le sprite mobile est "pénétrable" ? x% = sprites(n%,4) : ' position horizontale du sprite en movement y% = sprites(n%,5) : ' position verticale du sprite en movement w = sprites(n%,0) : ' largeur du sprite en movement h = sprites(n%,1) : ' hauteur du sprite en movement for i%=nsprite% to 1 step -1 : ' boucle sur tous les sprites if i%<>n% : ' on est sur un sprite autre que celui qui bouge ? if sprites(i%,3)<>0 : ' sprite en dur ? xs% = sprites(i%,4) : ' position horizontale du sprite à tester ys% = sprites(i%,5) : ' position verticale du sprite à tester ws = sprites(i%,0) : ' largeur du sprite à tester hs = sprites(i%,1) : ' hauteur du sprite à tester select dir% : ' distinction par direction du mouvement case 1: ' gauche if (x%-1)<=(xs%+ws) : ' bord droit fixe peut toucher bord gauche mobile ? if (x%+w)>=(xs%-1) 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(n%) : ' chercher les noms des tunes if trace%=1 then item_add 102,str$(ind%)+" "+str$(indm%) exit_sub : ' sortie car on a trouvé une collision end_if : ' fin test sur bord haut tune mobile end_if : ' fin test sur bord bas tune mobile end_if : ' fin test sur bord droit tune fixe end_if : ' fin test sur bord gauche tune fixe
next tm% : ' fin boucle sur les tune du mobile else : ' le sprite mobile n'a pas de tunes ! if (xs%-1)<=(x%+w) : ' bord gauche tune fixe plus à gauche que bord droit sprite mobile ? if (xs%+ws)>=(x%-1) : ' bord droit tune fixe plus à droite que bord gauche sprite mobile ? if (y%+h)>=ys% : ' bord bas sprite mobile plus bas que bord haut tune fixe ? if y%<=(ys%+hs) : ' bord haut sprite mobile plus haut que bord bas tune fixe ? sprite_collision% = i% : ' alors collision tune_collision% = t% tune_collision_mobile% = 0 chercher_noms(n%) : ' chercher les noms des tunes if trace%=1 then item_add 102,str$(ind%)+" fixe" exit_sub : ' sortie car on a trouvé une collision end_if : ' fin test sur bord haut tune mobile end_if : ' fin test sur bord bas tune mobile end_if : ' fin test sur bord droit tune fixe end_if : ' fin test sur bord gauche tune fixe end_if : ' fin sprite mobile a des tunes next t% : ' fin boucle sur les tunes du sprite touché sprite_collision% = 0 : ' aucun tune du sprite n'est touché else : ' le sprite fixe n'a pas de tunes ! if sprites(n%,6)>0 : ' le sprite mobile a des tunes ? ntm% = sprites(n%,7) : ' nombre de tunes du sprite mobile indm% = sprites(n%,6)-1 : ' prendre l'indice dans tunes() for tm%=1 to ntm% : ' boucle sur les tunes du sprite mobileé xsm% = tunes(indm%+tm%,1) : ' c'est l'abscisse du coin en haut à gauche ysm% = tunes(indm%+tm%,2) : ' c'est l'ordonnée du coin en haut à gauche wsm = tunes(indm%+tm%,3) : ' c'est la largeur hsm = tunes(indm%+tm%,4) : ' c'est la hauteur xsm% = xsm% + sprites(n%,4) : ' l'adresse du tune est relative ! ysm% = ysm% + sprites(n%,5) : ' l'adresse du tune est relative ! if trace%=1 item_add 102,"fixe: "+str$(sprites(i%,4))+","+str$(sprites(i%,5))+" / "+str$(sprites(i%,0))+","+str$(sprites(i%,1)) item_add 102,"tune: "+str$(tm%)+": "+str$(xsm%)+","+str$(ysm%)+" / "+str$(wsm)+","+str$(hsm) item_add 102,"" end_if if (sprites(i%,4)-1)<=(xsm%+wsm) : ' bord gauche sprite fixe plus à gauche que bord droit tune mobile ? item_add 102,"a" if (sprites(i%,4)+sprites(i%,0))>=(xsm%-1) : ' bord droit sprite fixe plus à droite que bord gauche tune mobile ? item_add 102,"b" if (ysm%+hsm)>=sprites(i%,5) : ' bord bas tune mobile plus bas que bord haut sprite fixe ? item_add 102,"c" if ysm%<=(sprites(i%,5)+sprites(i%,1)) : ' bord haut tune mobile plus haut que bord bas sprite fixe ? item_add 102,"d" sprite_collision% = i% : ' alors collision tune_collision% = 0 tune_collision_mobile% = tm% chercher_noms(n%) : ' chercher les noms des tunes if trace%=1 then item_add 102,str$(indm%)+" mobile" exit_sub : ' sortie car on a trouvé une collision end_if : ' fin test sur bord haut tune mobile end_if : ' fin test sur bord bas tune mobile end_if : ' fin test sur bord droit tune fixe end_if : ' fin test sur bord gauche tune fixe next tm% : ' fin boucle sur les tunes mobile sprite_collision% = 0 else : ' sprite mobile n'a pas de tunes ! chercher_noms(n%) : ' alors, construire les noms par défaut end_if : ' fin de test sur les tunes du sprite mobile exit_sub : ' donc, sortie immédiate car colision globale end_if : ' fin test si sprite a des tunes end_if : ' fin collision possible end_if : ' fin test sprite en dur end_if : ' fin test sur sprite "autre" next i% : ' fin boucle sur les sprites end_sub
sub chercher_noms(mob%) sprite_collision_mobile% = mob% : ' retourner ne numéro du sprite mobile sname_collision$ = snames$(sprite_collision%) : ' retourner le nom du sprite touché sname_collision_mobile$ = snames$(mob%) : ' retourner le nom du sprite mobile if tune_collision%>0 : ' est-ce qu'un tune a été touché ? for j%=1 to ntunes% : ' boucle de recherche du sprite concerné if tunes(j%,0)=sprite_collision% : ' est-ce le sprite touché ? tname_collision$ = tnames$(j%+tune_collision%-1) : ' prendre le nom du tune exit_for : ' et sortir end_if : ' fin de traitement du sprite trouvé next j% : ' fin boucle sur les tunes else tname_collision$ = "Sprite entier" end_if : ' fin traitement du tune touché if tname_collision$="" then tname_collision$ = "Tune "+str$(tune_collision%) : ' nom par défaut if tune_collision_mobile%>0 : ' est-ce qu'un tune mobile a touché ? for j%=1 to ntunes% : ' boucle de recherche du sprite concerné if tunes(j%,0)=mob% : ' est-ce le sprite mobile ? tname_collision_mobile$ = tnames$(j%+tune_collision_mobile%-1) : ' prendre le nom du tune exit_for : ' et sortir end_if : ' fin de traitement du sprite trouvé next j% : ' fin boucle sur les tunes else tname_collision_mobile$ = "Sprite entier" end_if : ' fin traitement du tune touché if tname_collision_mobile$="" then tname_collision_mobile$ = "Tune "+str$(tune_collision_mobile%) : ' nom par défaut end_sub | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Des procédures pour la 2D Jeu 28 Mai 2015 - 22:33 | |
| oups, j'avais raté la proc ... Bon, je iens de voir la nouvelle version. Je teste de suite | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Des procédures pour la 2D Jeu 28 Mai 2015 - 22:51 | |
| Nickel et pas mal l'idée de faire la sauvegarde de l'image lors de la création. Ca permet en effet de pouvoir faire la copie simplement | |
| | | 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 Jeu 11 Juin 2015 - 14:53 | |
| Voici une version nettement évoluée de mes outils 2D. il y a la correction de quelques bugs, mais surtout la collision est détectée correctement pour un mouvement dans les 4 directions, maintenant sur tous les tunes, que ce soit du sprite mobile ou du sprite fixe rencontré. Et on signale les numéros et les noms des sprites ainsi que des tunes concernés par la collision. En plus, un clic sur un sprite identifie ce dernier par son numéro et son nom. Et si le clic a lieu dans un tune, le numéro du tune et son nom est également affiché. On peut ainsi cliquer sur un des Android. Dans le ventre, il reconnaît le sprite, mais il n'y a pas de tune. Par contre, la tête, les bras et les jambes sont reconnues comme tunes individuels. Dans le scene2d, 3 sprites Android vont apparaître: à gauche, un sprite fixe, au milieu le sprite Android mobile (piloté par les flèches), et à droite un sprite fixe qui est une copie du sprite à gauche. Il y a aussi un sprite sous forme d'un carré jaune. Il est fixe, mais "pénétrable" et ne génère donc pas de collision. Voici le code: - Code:
-
' 2d_utilities.bas
label clic, key, close0
dim selection_sprite_1% : selection_sprite_1% = 1 : ' 0=carré rouge impénétrable : ' 1=Android impénétrable dim selection_sprite_2% : selection_sprite_2% = 2 : ' 0=carré bleu impénétrable : ' 1=Android impénétrable
dim sprites(500,7) : ' jusqu'à 500 sprites : ' ,0)=largeur ,1)=hauteur : ' ,2)=visible/invisible ,3)=impénétrable : ' ,4)=coordonnée x ,5)=coordonnée y : ' ,6)=numéro d'objet DLIST contenant les tunes : ' ,6)=transformé en index dans tunes(..,..) : ' ,7)=nombre de tunes dim ntunes% : ' nombre de tunes dans tunes(..,..) dim tunes(3000,4) : ' jusqu'à 3000 tunes : ' ,0)=sprite ,1)=coordonnée x ,2)=coordonnée y : ' ,3)=largeur ,4)=hauteur dim tnames$(3000) : ' noms des tunes dim snames$(500) : ' noms des sprites dim nsprite% : ' dernier numéro de sprite créé dim sprite_mobile% : ' numéro du sprite mobile dim sprite_trouve% : ' numéro du sprite trouvé par un clic (ou 0 si non trouvé) dim tune_trouve% : ' numéro du tune trouvé par un clic (ou 0 si non trouvé) dim tune_trouve_nom$ : ' nom du tune trouvé dim sprite_collision% : ' numéro du sprite touché par une collision dim sprite_collision_mobile% : ' numéro du sprite mobile touché dim tune_collision% : ' numéro du tune fixe touché (ou 0 si non trouvé) dim tune_collision_mobile% : ' numéro du tune mobile touché (ou 0 si non trouvé) dim tname_collision$ : ' nom du tune fixe touché dim tname_collision_mobile$ : ' nom du tune mobile touché dim sname_collision$ : ' nom du sprite fixe touché dim sname_collision_mobile$ : ' nom du sprite mobile touché dim scene_2d% : ' numéro d'objet du scene2d dim trace% : trace% = 0 : ' mettre 1 pour afficher une trace des calculs dim images$ : ' nom de dossier temporaire pour copier les images des sprites dim i%, j%, d%, dx%, dy%, s$, sm$
scene_2d% = 17 : ' juste un exemple scene2d scene_2d% : ' créer le scene2d sprite_target_is scene_2d% : ' assurer du bon ciblage on_click scene_2d%,clic
dlist 101 : ' pour recevoir la liste des tunes pour sprite 1 if trace%=1 then list 102 : top 102,500 : width 102,1000 : height 102,200
full_space 0 full_space scene_2d% picture 10 : hide 10 : width 10,200 : height 10,200 image 11 2d_target_is 10
memoriser_images() : ' activer la mémorisation des images des sprites
if selection_sprite_1%=0 color 10,255,0,0 2d_image_copy 11,0,0,200,200 creer_sprite("Carré rouge initialement fixe",50,50,11,1) : ' sprite rouge impénétrable else file_load 10,"Android.bmp" 2d_image_copy 11,0,0,200,200 file_load 101,"Android_mask_tuned_list.txt" creer_sprite_avec_tunes("Andoid initialement fixe",50,50,11,1,101) : ' sprite "Android" impénétrable, avec tunes end_if
if selection_sprite_2%=0 color 10,0,0,255 2d_image_copy 11,0,0,200,200 : ' sprite bleu impénétrable creer_sprite("Carré bleu initialement fixe",400,120,11,1) else file_load 10,"Android.bmp" 2d_image_copy 11,0,0,200,200 file_load 101,"Android_mask_tuned_list.txt" creer_sprite_avec_tunes("Android initialement mobile",400,130,11,1,101) : ' sprite "Android" impénétrable, avec tunes end_if
color 10,255,255,0 2d_image_copy 11,0,0,200,200 : ' sprite jaune pénétrable creer_sprite("Carré jaune initialement fixe",280,180,11,0)
copier_sprite("Android initialement fixe copié",1,600,300,11) : ' copie du sprite 1 (en sprite 4)
on_key_down 0,key on_close 0,close0
sprite_mobile% = 2 : ' c'est le sprite mobile par défaut
end
' ***** frappe d'une touche au clavier key: d% = key_down_code 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(sprite_mobile%,1,dx%,dy%) : ' déplacement relatif tester_si_collision(sprite_mobile%,1) : ' suivi du test de collision s$ = "" if sprite_collision%>0 : ' une collision a eu lieu ? s$ = "collision avec sprite "+str$(sprite_collision%)+"=["+sname_collision$+"] tune "+str$(tune_collision%)+"=["+tname_collision$ sm$ = "] touché par sprite "+str$(sprite_collision_mobile%)+"=["+sname_collision_mobile$+"] tune "+str$(tune_collision_mobile%)+"=["+tname_collision_mobile$+"]" message s$ + sm$ deplacer_sprite(sprite_mobile%,1,0-dx%,0-dy%) : ' annuler le déplacement en cas de collision exit_for : ' et arrêter le déplacement end_if : ' fin test si collision next i% : ' fin boucle de déplacement return
' ***** clic dans la scene2d clic: chercher_sprite_selon_clic() if sprite_trouve%>0 sprite_mobile% = sprite_trouve% : ' sélectionner le sprite cliqué ! if tune_trouve%>0 message "clic sur sprite "+str$(sprite_trouve%)+"="+snames$(sprite_trouve%)+" tune "+str$(tune_trouve%)+"="+tune_trouve_nom$ else message "clic sur sprite "+str$(sprite_trouve%)+"="+snames$(sprite_trouve%)+" sans tune" end_if else message "aucun sprite cliqué" end_if return ' ***** fermeture de la form 0 close0: effacer_images() : ' effacer éventuellement les images des sprites return
sub memoriser_images() dim_local d$, dold$, f$ if images$<>"" then exit_sub : ' mémorisation déjà activé ? d$ = dir_current$ + "\Temp_Sprites" : ' construire dossier temporaire des images des sprites if dir_exists(d$)=1 : ' ce dossier existe ? dold$ = dir_current$ : ' mémoriser le dossier actuel dir_change d$ : ' passer dans le dossier des images f$ = file_find_first$ : ' chercher le premier fichier while f$<>"_" : ' tant qu'on trouve des fichiers if left$(f$,1)<>"." then file_delete f$ : ' les supprimer f$ = file_find_next$ : ' et passer au suivant end_while file_find_close : ' fin de recherche de fichiers dir_change dold$ : ' repositionner dans le dossier par défaut ancien dir_remove d$ : ' et supprimer le dossier des images end_if dir_make d$ : ' alors créer ce dossier images$ = d$ : ' et mémoriser le chemin end_sub
sub effacer_images() dim_local old$, f$ if images$="" then exit_sub : ' le dossier temporaire n'existe pas ? Rien à faire ! old$ = dir_current$ : ' mémoriser l'actuel dossier courant dir_change images$ : ' changer pour le dossier temporaire des images f$ = file_find_first$ : ' prendre le premier nom de fichier de ce dossier while f$<>"_" : ' tout est traité ? if left$(f$,1)<>"." then file_delete f$ : ' détruire si c'est un vrai fichier f$ = file_find_next$ : ' passer au fichier suivant end_while : ' fin de boucle de traitement file_find_close : ' clore la fonction de recherche dir_change old$ : ' remettre l'ancien dossier courant rmdir images$ : ' supprimer le dossier des images images$ = "" : ' et "oublier" ce dossier end_sub
sub creer_sprite(nam$,x%,y%,img%,dur%) nsprite% = nsprite% + 1 : ' passer au numéro de sprite suivant sprite nsprite% : ' créer le sprite snames$(nsprite%) = nam$ : ' memoriser son nom sprites(nsprite%,0) = 200 : ' mémoriser sa largeur sprites(nsprite%,1) = 200 : ' et sa hauteur sprites(nsprite%,2) = 1 : ' marquer "visible" sprites(nsprite%,3) = dur% : ' marquer 0="pénétrable" ou 1="impénétrable" sprites(nsprite%,4) = x% : ' position horizontale du sprite sprites(nsprite%,5) = y% : ' position verticale du sprite sprites(nsprite%,6) = 0 : ' pas de tunes sprites(nsprite%,7) = 0 : ' pas de tunes if img%>0 : ' une image est fournie ? sprite_image_load nsprite%,img% : ' copier une image dans le sprite if images$<>"" then file_save img%,images$+"\sprite_"+str$(nsprite%)+".bmp" : ' et la sauver end_if : ' fin test image fournie sprite_position nsprite%,x%,y% : ' positionner le sprite à l'endroit voulu display end_sub
sub creer_sprite_avec_tunes(nam$,x%,y%,img%,dur%,dl%) dim_local t%, s$, p%, n% if object_exists(dl%)=0 then exit_sub : ' impossible si l'objet n'existe pas if object_type(dl%)<>26 then exit_sub : ' impossible si l'objet n'est pas une DLIST if count(dl%)=0 then exit_sub : ' impossible si la liste des tunes est vide nsprite% = nsprite% + 1 : ' passer au numéro de sprite suivant sprite nsprite% : ' créer le sprite snames$(nsprite%) = nam$ : ' memoriser son nom sprites(nsprite%,0) = 200 : ' mémoriser sa largeur sprites(nsprite%,1) = 200 : ' et sa hauteur sprites(nsprite%,2) = 1 : ' marquer "visible" sprites(nsprite%,3) = dur% : ' marquer 0="pénétrable" ou 1="impénétrable" sprites(nsprite%,4) = x% : ' position horizontale du sprite sprites(nsprite%,5) = y% : ' position verticale du sprite sprites(nsprite%,6) = ntunes%+1 : ' indice dans la liste des tunes sprites(nsprite%,7) = count(dl%) : ' nombre de tunes for t%=1 to count(dl%) : ' boucle sur les lignes des tunes ntunes% = ntunes% + 1 : ' compter le nouveau tune tunes(ntunes%,0) = nsprite% : ' mémoriser le numéro du sprite pour ce tune s$ = item_read$(dl%,t%)+"," : ' lire un eligne de tunes p% = instr(s$,",") n% = val(left$(s$,p%-1)) : ' garder le numéro du tune s$ = mid$(s$,p%+1,100) : ' dépasser le numéro de tune p% = instr(s$,",") tunes(ntunes%,1) = val(left$(s$,p%-1)) : ' mémoriser coordonnée x du tune s$ = mid$(s$,p%+1,100) : ' dépasser la coordonnée x du tune p% = instr(s$,",") tunes(ntunes%,2) = val(left$(s$,p%-1)) : ' mémoriser coordonnée y du tune s$ = mid$(s$,p%+1,100) : ' dépasser la coordonnée y du tune p% = instr(s$,",") tunes(ntunes%,3) = val(left$(s$,p%-1)) - tunes(ntunes%,1)+1 : ' mémoriser largeur du tune s$ = mid$(s$,p%+1,100) : ' dépasser la largeur du tune p% = instr(s$,",") tunes(ntunes%,4) = val(left$(s$,p%-1)) - tunes(ntunes%,2)+1 : ' mémoriser hauteur du tune s$ = mid$(s$,p%+1,100) : ' dépasser la hauteur du tune if s$="" then s$ = "Tune "+str$(n%) tnames$(ntunes%) = s$ next t% : ' fin boucle sur les lignes des tunes if img%>0 : ' une image est fournie ? sprite_image_load nsprite%,img% : ' copier une image dans le sprite if images$<>"" then file_save img%,images$+"\sprite_"+str$(nsprite%)+".bmp" : ' et la sauver end_if : ' fin test image fournie sprite_position nsprite%,x%,y% : ' positionner le sprite à l'endroit voulu
display end_sub
sub copier_sprite(nam$,n%,x%,y%,img%) dim_local i%, nt% nsprite% = nsprite% + 1 : ' passer au numéro de sprite suivant sprite nsprite% : ' créer le sprite snames$(nsprite%) = nam$ : ' memoriser son nom sprites(nsprite%,0) = sprites(n%,0) : ' mémoriser sa largeur sprites(nsprite%,1) = sprites(n%,1) : ' et sa hauteur sprites(nsprite%,2) = sprites(n%,2) : ' marquer "visible" sprites(nsprite%,3) = sprites(n%,3) : ' marquer 0="pénétrable" ou 1="impénétrable" sprites(nsprite%,4) = x% : ' position horizontale du sprite if sprites(n%,3)=0 then sprites(nsprite%,4) = sprites(nsprite%,4) + 4000 : ' traitement "invisible" sprites(nsprite%,5) = y% : ' position verticale du sprite if sprites(n%,6)=0 : ' le sprite source n'a pas de tunes ? sprites(nsprite%,6) = 0 : ' pas de tunes sprites(nsprite%,7) = 0 : ' pas de tunes else : ' le sprite source a des tunes nt% = sprites(n%,6) : ' alors mémoriser l'indice dans la liste des tunes sprites(nsprite%,6) = ntunes%+1 : ' indice dans la liste des tunes sprites(nsprite%,7) = sprites(n%,7) : ' nombre de tunes for i%=1 to sprites(n%,0) : ' boucle sur tous les tunes du sprite source ntunes% = ntunes% + 1 : ' compter le nouveau tune tunes(ntunes%,0) = nsprite% : ' mémoriser le numéro du sprite pour ce tune tunes(ntunes%,1) = tunes(nt%+i%-1,1) : ' et copier les autres valeurs tunes(ntunes%,2) = tunes(nt%+i%-1,2) tunes(ntunes%,3) = tunes(nt%+i%-1,3) tunes(ntunes%,4) = tunes(nt%+i%-1,4) tnames$(ntunes%) = tnames$(nt%+i%-1) : ' copier le nom du tune next i% : ' fin boucle de copie des tunes end_if : ' fin traitement des tunes
if images$<>"" : ' les images sont mémorisées ? if file_exists(images$+"\sprite_"+str$(n%)+".bmp")=1 file_load img%,images$+"\sprite_"+str$(n%)+".bmp" : ' charger l'image dans objet IMG% sprite_image_load nsprite%,img% : ' charger l'image dans le nouveau sprite file_save img%,images$+"\sprite_"+str$(nsprite%)+".bmp" : ' et la sauver end_if : ' fin test "image existante" end_if : ' fin test images mémorisées
sprite_position nsprite%,sprites(nsprite%,4),sprites(nsprite%,5) : ' positionner le sprite à l'endroit voulu
display end_sub
sub deplacer_sprite(n%,rel%,x%,y%) if (n%<1) or (n%>nsprite%) then exit_sub : ' sécuriser if rel%=1 : ' positionnement relatif ? sprites(n%,4) = sprites(n%,4) + x% sprites(n%,5) = sprites(n%,5) + y% else : ' positionnement absolu ! sprites(n%,4) = x% sprites(n%,5) = y% end_if if sprites(nsprite%,2)=1 : ' sprite visible ? sprite_position n%,sprites(n%,4),sprites(n%,5) : ' positionner le sprite visible à l'endroit voulu else : ' sprite caché ! sprite_position n%,sprites(n%,4)+4000,sprites(n%,5) : ' positionner le sprite caché à l'endroit voulu end_if end_sub
sub redimensionner_sprite_x(n%,c) if (n%<1) or (n%>nsprite%) then exit_sub : ' sécuriser sprite_x_scale n%,c : ' ajuster la largeur sprites(n%,0) = sprites(n%,0)*c : ' et mémoriser end_sub
sub redimensionner_sprite_y(n%,c) if (n%<1) or (n%>nsprite%) then exit_sub : ' sécuriser sprite_y_scale n%,c : ' ajuster la hauteur sprites(n%,1) = sprites(n%,1)*c : ' et mémoriser end_sub
sub redimensionner_sprite_xy(n%,cx,cy) if (n%<1) or (n%>nsprite%) then exit_sub : ' sécuriser sprite_scale n%,cx,cy : ' ajuster largeur et hauteur sprites(n%,0) = sprites(n%,0)*cx : ' et mémoriser la largeur sprites(n%,1) = sprites(n%,1)*cy : ' et mémoriser la hauteur end_sub
sub cacher_sprite(n%) if (n%<1) or (n%>nsprite%) then exit_sub : ' sécuriser if sprites(n%,2)=1 : ' est-ce que le sprite est visible ? sprite_x_position n%,sprite_x_position(n%) + 4000 : ' déplacer hors de la vue sprites(n%,2) = 0 : ' signaler "invisible" end_if end_sub
sub montrer_sprite(n%) if (n%<1) or (n%>nsprite%) then exit_sub : ' sécuriser if sprites(n%,2)=0 : ' est-ce que le sprite est invisible ? sprite_x_position n%,sprite_x_position(n%) - 4000 : ' replacer dans la partie visible sprites(n%,2) = 1 : ' signaler "visible" end_if end_sub
sub chercher_sprite_selon_clic() dim_local i%, x%, y%, xs%, ys%, nt%, t%, ind%, ws, hs sprite_trouve% = 0 : ' supposer "sprite non trouvé" tune_trouve% = 0 : ' supposer "tune non trouvé" tune_trouve_nom$ = "" : ' donc, pas de nom... if number_click<>scene_2d% then exit : ' on n'a pas cliqué dans le scene2d ? if nsprite%=0 then exit_sub : ' pas de sprites créés ? x% = mouse_x_left_down(scene_2d%) : ' mémoriser la position horizontale du clic y% = mouse_y_left_down(scene_2d%) : ' mémoriser la position verticale du clic for i%=nsprite% to 1 step -1 : ' boucle sur tous les sprites xs% = sprite_x_position(i%) : ' mémoriser la position horizontale du sprite i% ys% = sprite_y_position(i%) : ' mémoriser la position verticale dusprite i% if (xs%<x%) : ' le bord gauche du sprite est plus à gauche que l'abscisse du clic ? if (ys%<y%) : ' le bord haut du sprite est plus haute que l'ordonnée du sprite ? if xs%+sprites(i%,0)>=x% : ' le bord droit du sprite est plus à droite que l'abscisse du clic ? if ys%+sprites(i%,1)>=y% : ' le bord bas du sprite est plus en bas que l'ordonnée du clic ? sprite_trouve% = i% : ' alors, on a trouvé le sprite if sprites(i%,7)>0 : ' le sprigte cliqué a des tunes ? nt% = sprites(i%,7) : ' prendre le nombre de tunes ind% = sprites(i%,6)-1 : ' prendre l'indice dans tunes() for t%=1 to nt% : ' boucle sur les tunes du sprite cliqué xs% = tunes(ind%+t%,1) : ' c'est l'abscisse du coin en haut à gauche ys% = tunes(ind%+t%,2) : ' c'est l'ordonnée du coin en haut à gauche ws = tunes(ind%+t%,3) : ' c'est la largeur hs = tunes(ind%+t%,4) : ' c'est la hauteur xs% = xs% + sprites(i%,4) : ' l'adresse du tune est relative ! ys% = ys% + sprites(i%,5) : ' l'adresse du tune est relative ! if (x%>=xs%) and (x%<(xs%+ws)) : ' horizontalement cliqué dans le tune ? if (y%>=ys%) and (y%<(ys%+hs)) : ' vertictalement cliqué dans le tune ? tune_trouve% = t% : ' retourner le numéro du tune cliqué tune_trouve_nom$ = tnames$(ind%+t%) : ' et son nom end_if end_if next t% : ' find de boucle sur les tunes end_if : ' in du traitement des tunes exit_sub : ' et on sort end_if : ' fin test sur le bord bas du sprite end_if : ' fin test sur le bord droit du sprite end_if : ' fin test sur le bord haut du sprite end_if : ' fin test sur le bord gauche du sprite next i% : ' fin boucle sur les sprites end_sub
sub tester_si_collision(n%,dir%) dim_local i%, x%, y%, w%, h%, xs%, ys%, w, h, ws, hs, t%, nt%, dim_local s$, s1$, ss$, ss1$, p%, p2%, pp%, pp2%, dim_local ntm%, tm%, xsm%, ysm%, wsm, hsm, ind%, indm% sprite_collision% = 0 : ' supposer "pas de collision" sprite_collision_mobile% = 0 tune_collision% = 0 tune_collision_mobile% = 0 if nsprite%<2 then exit_sub : ' pas de collisions possibles ? if sprites(n%,2)=0 then exit_sub : ' le sprite mobile est "invisible" ? if sprites(n%,3)=0 then exit_sub : ' le sprite mobile est "pénétrable" ? x% = sprites(n%,4) : ' position horizontale du sprite en movement y% = sprites(n%,5) : ' position verticale du sprite en movement w = sprites(n%,0) : ' largeur du sprite en movement h = sprites(n%,1) : ' hauteur du sprite en movement for i%=nsprite% to 1 step -1 : ' boucle sur tous les sprites if i%<>n% : ' on est sur un sprite autre que celui qui bouge ? if sprites(i%,3)<>0 : ' sprite en dur ? xs% = sprites(i%,4) : ' position horizontale du sprite à tester ys% = sprites(i%,5) : ' position verticale du sprite à tester ws = sprites(i%,0) : ' largeur du sprite à tester hs = sprites(i%,1) : ' hauteur du sprite à tester select dir% : ' distinction par direction du mouvement case 1: ' gauche if (x%-1)<=(xs%+ws) : ' bord droit fixe peut toucher bord gauche mobile ? if (x%+w)>=(xs%-1) : ' bord droit mobile plus à droite que bord gauche fixe ? if (ys%+hs)>=y% : ' bord bas mobile plus bas que bord haut fixe ? if ys%<=(y%+h) : ' bord haut mobile plus que bord bas fixe ? sprite_collision% = i% : ' alors collision ' 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) : ' bord bas mobile plus bas que bord haut fixe ? if (xs%+hs)>=x% : ' bord droit mobile plus à gauche que bord gauche fixe ? if xs%<=(x%+h) : ' bord gauche mobile plus à gauche que bord droit fixe ? sprite_collision% = i% : ' alors collision end_if end_if end_if end_if case 3: ' droite : ' à adapter if (x%+w)>=(xs%-1) : ' bord gauche fixe peut toucher bord droit mobile ? if x%<=(xs%+ws) : ' bord gauche mobile plus à gauche que bord droit fixe ? if (y%+h)>=(ys%-1) : ' bord bas mobile plus bas que bord haut fixe ? if ys%<=(y%+h) : ' bord haut mobile plus bas que bord bas fixe ? sprite_collision% = i% : ' alors collision end_if end_if end_if end_if case 4: ' bas : ' à adapter if (y%+h)=(ys%-1) : ' bord haut fixe peut toucher bord bas mobile ? if y%>=(ys%+hs) : ' bord haut mobile plus haut que bord bas fixe ? if (xs%+hs)>=x% : ' bord droit mobile plus à gauche que bord gauche fixe ? if xs%<=(x%+h) : ' bord gauche mobile plus à gauche que bord droit fixe ? sprite_collision% = i% : ' alors collision end_if end_if end_if end_if end_select : ' fin distinction par direction ' message str$(sprite_collision%)
if sprite_collision%>0 : ' une collision est possible ? if trace%=1 then clear 102 if sprites(i%,6)>0 : ' le sprite fixe a des tunes ? nt% = sprites(i%,7) : ' nombre de tunes ind% = sprites(i%,6)-1 : ' prendre l'indice dans tunes() for t%=1 to nt% : ' boucle sur les tunes du sprite touché xs% = tunes(ind%+t%,1) : ' c'est l'abscisse du coin en haut à gauche ys% = tunes(ind%+t%,2) : ' c'est l'ordonnée du coin en haut à gauche ws = tunes(ind%+t%,3) : ' c'est la largeur hs = tunes(ind%+t%,4) : ' c'est la hauteur xs% = xs% + sprites(i%,4) : ' l'adresse du tune est relative ! ys% = ys% + sprites(i%,5) : ' l'adresse du tune est relative !
if sprites(n%,6)>0 : ' le sprite mobile a des tunes ? ntm% = sprites(n%,7) : ' nombre de tunes du sprite mobile indm% = sprites(n%,6)-1 : ' prendre l'indice dans tunes() for tm%=1 to ntm% : ' boucle sur les tunes du sprite mobileé xsm% = tunes(indm%+tm%,1) : ' c'est l'abscisse du coin en haut à gauche ysm% = tunes(indm%+tm%,2) : ' c'est l'ordonnée du coin en haut à gauche wsm = tunes(indm%+tm%,3) : ' c'est la largeur hsm = tunes(indm%+tm%,4) : ' c'est la hauteur xsm% = xsm% + sprites(n%,4) : ' l'adresse du tune est relative ! ysm% = ysm% + sprites(n%,5) : ' l'adresse du tune est relative ! if trace%=1 item_add 102,"Fixe: tune "+str$(t%)+": "+str$(xs%)+","+str$(ys%)+"/"+str$(ws)+","+str$(hs) item_add 102,"Mobile: tune "+str$(tm%)+": "+str$(xsm%)+","+str$(ysm%)+"/"+str$(wsm)+","+str$(hsm) item_add 102,"" end_if if (xs%-1)<=(xsm%+wsm) : ' bord gauche tune fixe plus à gauche que bord droit tune mobile ? if (xs%+ws)>=(xsm%-1) : ' bord droit tune fixe plus à droite que bord gauche tune mobile ? if (ysm%+hsm)>=ys% : ' bord bas tune mobile plus bas que bord haut tune fixe ? if ysm%<=(ys%+hs) : ' bord haut tune mobile plus haut que bord bas tune fixe ? sprite_collision% = i% : ' alors collision tune_collision% = t% tune_collision_mobile% = tm% chercher_noms(n%) : ' chercher les noms des tunes if trace%=1 then item_add 102,str$(ind%)+" "+str$(indm%) exit_sub : ' sortie car on a trouvé une collision end_if : ' fin test sur bord haut tune mobile end_if : ' fin test sur bord bas tune mobile end_if : ' fin test sur bord droit tune fixe end_if : ' fin test sur bord gauche tune fixe
next tm% : ' fin boucle sur les tune du mobile else : ' le sprite mobile n'a pas de tunes ! if (xs%-1)<=(x%+w) : ' bord gauche tune fixe plus à gauche que bord droit sprite mobile ? if (xs%+ws)>=(x%-1) : ' bord droit tune fixe plus à droite que bord gauche sprite mobile ? if (y%+h)>=ys% : ' bord bas sprite mobile plus bas que bord haut tune fixe ? if y%<=(ys%+hs) : ' bord haut sprite mobile plus haut que bord bas tune fixe ? sprite_collision% = i% : ' alors collision tune_collision% = t% tune_collision_mobile% = 0 chercher_noms(n%) : ' chercher les noms des tunes if trace%=1 then item_add 102,str$(ind%)+" fixe" exit_sub : ' sortie car on a trouvé une collision end_if : ' fin test sur bord haut tune mobile end_if : ' fin test sur bord bas tune mobile end_if : ' fin test sur bord droit tune fixe end_if : ' fin test sur bord gauche tune fixe end_if : ' fin sprite mobile a des tunes next t% : ' fin boucle sur les tunes du sprite touché sprite_collision% = 0 : ' aucun tune du sprite n'est touché else : ' le sprite fixe n'a pas de tunes ! if sprites(n%,6)>0 : ' le sprite mobile a des tunes ? ntm% = sprites(n%,7) : ' nombre de tunes du sprite mobile indm% = sprites(n%,6)-1 : ' prendre l'indice dans tunes() for tm%=1 to ntm% : ' boucle sur les tunes du sprite mobileé xsm% = tunes(indm%+tm%,1) : ' c'est l'abscisse du coin en haut à gauche ysm% = tunes(indm%+tm%,2) : ' c'est l'ordonnée du coin en haut à gauche wsm = tunes(indm%+tm%,3) : ' c'est la largeur hsm = tunes(indm%+tm%,4) : ' c'est la hauteur xsm% = xsm% + sprites(n%,4) : ' l'adresse du tune est relative ! ysm% = ysm% + sprites(n%,5) : ' l'adresse du tune est relative ! if trace%=1 item_add 102,"fixe: "+str$(sprites(i%,4))+","+str$(sprites(i%,5))+" / "+str$(sprites(i%,0))+","+str$(sprites(i%,1)) item_add 102,"tune: "+str$(tm%)+": "+str$(xsm%)+","+str$(ysm%)+" / "+str$(wsm)+","+str$(hsm) item_add 102,"" end_if if (sprites(i%,4)-1)<=(xsm%+wsm) : ' bord gauche sprite fixe plus à gauche que bord droit tune mobile ? item_add 102,"a" if (sprites(i%,4)+sprites(i%,0))>=(xsm%-1) : ' bord droit sprite fixe plus à droite que bord gauche tune mobile ? item_add 102,"b" if (ysm%+hsm)>=sprites(i%,5) : ' bord bas tune mobile plus bas que bord haut sprite fixe ? item_add 102,"c" if ysm%<=(sprites(i%,5)+sprites(i%,1)) : ' bord haut tune mobile plus haut que bord bas sprite fixe ? item_add 102,"d" sprite_collision% = i% : ' alors collision tune_collision% = 0 tune_collision_mobile% = tm% chercher_noms(n%) : ' chercher les noms des tunes if trace%=1 then item_add 102,str$(indm%)+" mobile" exit_sub : ' sortie car on a trouvé une collision end_if : ' fin test sur bord haut tune mobile end_if : ' fin test sur bord bas tune mobile end_if : ' fin test sur bord droit tune fixe end_if : ' fin test sur bord gauche tune fixe next tm% : ' fin boucle sur les tunes mobile sprite_collision% = 0 else : ' sprite mobile n'a pas de tunes ! chercher_noms(n%) : ' alors, construire les noms par défaut end_if : ' fin de test sur les tunes du sprite mobile exit_sub : ' donc, sortie immédiate car colision globale end_if : ' fin test si sprite a des tunes end_if : ' fin collision possible end_if : ' fin test sprite en dur end_if : ' fin test sur sprite "autre" next i% : ' fin boucle sur les sprites end_sub
sub chercher_noms(mob%) sprite_collision_mobile% = mob% : ' retourner ne numéro du sprite mobile sname_collision$ = snames$(sprite_collision%) : ' retourner le nom du sprite touché sname_collision_mobile$ = snames$(mob%) : ' retourner le nom du sprite mobile if tune_collision%>0 : ' est-ce qu'un tune a été touché ? for j%=1 to ntunes% : ' boucle de recherche du sprite concerné if tunes(j%,0)=sprite_collision% : ' est-ce le sprite touché ? tname_collision$ = tnames$(j%+tune_collision%-1) : ' prendre le nom du tune exit_for : ' et sortir end_if : ' fin de traitement du sprite trouvé next j% : ' fin boucle sur les tunes else tname_collision$ = "Sprite entier" end_if : ' fin traitement du tune touché if tname_collision$="" then tname_collision$ = "Tune "+str$(tune_collision%) : ' nom par défaut if tune_collision_mobile%>0 : ' est-ce qu'un tune mobile a touché ? for j%=1 to ntunes% : ' boucle de recherche du sprite concerné if tunes(j%,0)=mob% : ' est-ce le sprite mobile ? tname_collision_mobile$ = tnames$(j%+tune_collision_mobile%-1) : ' prendre le nom du tune exit_for : ' et sortir end_if : ' fin de traitement du sprite trouvé next j% : ' fin boucle sur les tunes else tname_collision_mobile$ = "Sprite entier" end_if : ' fin traitement du tune touché if tname_collision_mobile$="" then tname_collision_mobile$ = "Tune "+str$(tune_collision_mobile%) : ' nom par défaut end_sub Essayez - c'est spectaculaire ! EDIT Et le code ci-dessus "sélectionne" maintenant le sprite cliqué pour le rendre mobile pour les prochaines frappes des flèches, même si ce sprite était fixe au départ ! | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Des procédures pour la 2D Jeu 11 Juin 2015 - 16:50 | |
| Je teste ça ce soir et en fait, je mets en standby l'article que j'avais prévu sur les collision et j'en fais un à la place juste sur tes fonctionnalités de detection de collisions (c'est l'orientation de l'article) pour le volet 2 des détection de collision. Ce sera plus léger. Si j'ai le courage et le temps je mettrais l'autre en 3. Par contre tu pourras relire l'article quand je l'aurais écrit pour vérifier que je ne dis pas de bétises par rapport à tes fonctions ? L'article utilisera toutes les fonctionnalités de ton programme mais n'appronfondira que celles relatives aux collisions. Si tu veux en faire un sur l'utilisation des sprites en règle général, ça me semblerait être une bonne idée, mais je ne veux pas te donner du travail en plus si tu n'en a pas envie. Tu es déjà sans doute le plus productif d'entre nous... | |
| | | 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 Jeu 11 Juin 2015 - 17:06 | |
| Je relirai ton article avec plaisir, Jicehel. Pour ce qui est de faire un article sur les sprites, je ne suis peut-être pas le mieux placé. Je m'en sers dans mon jeu "Eclater les billes", mais c'est à peu pris tout. Et je commence juste à appréhender les possibilités de ces objets. Enfin, on verra... Pour l'heure, j'ai fini les ajustements dans la gestion du FTP, avec la gestion paramétrable du cache. C'était complexe à diagnostiquer, mais finalement simple à corriger. On s'amuse, comme tu vois... | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Des procédures pour la 2D Jeu 11 Juin 2015 - 18:12 | |
| Remarques mettre à jour "eclater les bulles" avec la détection de collision sphérique et les procédure de gestion des sprites que tu as écrit, ça pourrait être sympa, cela dit, en passant Ce jeu était excellent, avec les nouvelles fonctions, et peut être aussi une petite amélioration graphique en ajoutant une tache blanche et une ombre avec un cercle légèrement décalé plus sombre sur les bulles pour donner une sensation de 3D, il n'en sera que meilleur... mais bon encore faut-il qu'il te reste encore un peu de temps pour le faire.. | |
| | | 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 Jeu 11 Juin 2015 - 18:33 | |
| @Klaus, J'ai testé: Ça marche bien et on a bien le numéro de tune de collision pour chaque sprite. (je veux dire par quel coté il y a collision) Je vais inspecter tout ça, car les choses ont beaucoup changées depuis les premières SUB(s) du début de ce post. Je pense qu'il y a de quoi faire un super jeu en 2D. A+ | |
| | | 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 Jeu 11 Juin 2015 - 18:38 | |
| Et même en cliquant sur un bras, une jambe etc, on sait sur quel tune on clique ! | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Des procédures pour la 2D Jeu 11 Juin 2015 - 22:38 | |
| Pas mal du tout, ça donne un code principal très lisible | |
| | | 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 Jeu 11 Juin 2015 - 22:45 | |
| Merci ! Et j'ai fait un gros effort pour la documentation sous forme de commentaires... | |
| | | 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 Ven 12 Juin 2015 - 11:16 | |
| Voici une version de mes procédures de collision, avec la correction de quelques petites anomalies: - Code:
-
' 2d_utilities.bas
label clic, key, close0
dim selection_sprite_1% : selection_sprite_1% = 1 : ' 0=carré rouge impénétrable : ' 1=Android impénétrable dim selection_sprite_2% : selection_sprite_2% = 2 : ' 0=carré bleu impénétrable : ' 1=Android impénétrable
dim sprites(500,7) : ' jusqu'à 500 sprites : ' ,0)=largeur ,1)=hauteur : ' ,2)=visible/invisible ,3)=impénétrable : ' ,4)=coordonnée x ,5)=coordonnée y : ' ,6)=numéro d'objet DLIST contenant les tunes : ' ,6)=transformé en index dans tunes(..,..) : ' ,7)=nombre de tunes dim ntunes% : ' nombre de tunes dans tunes(..,..) dim tunes(3000,4) : ' jusqu'à 3000 tunes : ' ,0)=sprite ,1)=coordonnée x ,2)=coordonnée y : ' ,3)=largeur ,4)=hauteur dim tnames$(3000) : ' noms des tunes dim snames$(500) : ' noms des sprites dim nsprite% : ' dernier numéro de sprite créé dim sprite_mobile% : ' numéro du sprite mobile dim sprite_trouve% : ' numéro du sprite trouvé par un clic (ou 0 si non trouvé) dim tune_trouve% : ' numéro du tune trouvé par un clic (ou 0 si non trouvé) dim tune_trouve_nom$ : ' nom du tune trouvé dim sprite_collision% : ' numéro du sprite touché par une collision dim sprite_collision_mobile% : ' numéro du sprite mobile touché dim tune_collision% : ' numéro du tune fixe touché (ou 0 si non trouvé) dim tune_collision_mobile% : ' numéro du tune mobile touché (ou 0 si non trouvé) dim tname_collision$ : ' nom du tune fixe touché dim tname_collision_mobile$ : ' nom du tune mobile touché dim sname_collision$ : ' nom du sprite fixe touché dim sname_collision_mobile$ : ' nom du sprite mobile touché dim scene_2d% : ' numéro d'objet du scene2d dim trace% : trace% = 0 : ' mettre 1 pour afficher une trace des calculs dim images$ : ' nom de dossier temporaire pour copier les images des sprites dim i%, j%, d%, dx%, dy%, s$, sm$, direct%
scene_2d% = 17 : ' juste un exemple scene2d scene_2d% : ' créer le scene2d sprite_target_is scene_2d% : ' assurer du bon ciblage on_click scene_2d%,clic
dlist 101 : ' pour recevoir la liste des tunes pour sprite 1 if trace%=1 then list 102 : top 102,500 : width 102,1000 : height 102,200
full_space 0 full_space scene_2d% picture 10 : hide 10 : width 10,200 : height 10,200 image 11 2d_target_is 10
memoriser_images() : ' activer la mémorisation des images des sprites
if selection_sprite_1%=0 color 10,255,0,0 2d_image_copy 11,0,0,200,200 creer_sprite("Carré rouge initialement fixe",50,50,11,1) : ' sprite rouge impénétrable else file_load 10,"Android.bmp" 2d_image_copy 11,0,0,200,200 file_load 101,"Android_mask_tuned_list.txt" creer_sprite_avec_tunes("Andoid initialement fixe",50,50,11,1,101) : ' sprite "Android" impénétrable, avec tunes end_if
if selection_sprite_2%=0 color 10,0,0,255 2d_image_copy 11,0,0,200,200 : ' sprite bleu impénétrable creer_sprite("Carré bleu initialement fixe",400,120,11,1) else file_load 10,"Android.bmp" 2d_image_copy 11,0,0,200,200 file_load 101,"Android_mask_tuned_list.txt" creer_sprite_avec_tunes("Android initialement mobile",400,130,11,1,101) : ' sprite "Android" impénétrable, avec tunes end_if
color 10,255,255,0 2d_image_copy 11,0,0,200,200 : ' sprite jaune pénétrable creer_sprite("Carré jaune initialement fixe",280,180,11,0)
copier_sprite("Android initialement fixe copié",1,600,300,11) : ' copie du sprite 1 (en sprite 4)
on_key_down 0,key on_close 0,close0
sprite_mobile% = 2 : ' c'est le sprite mobile par défaut
end
' ***** frappe d'une touche au clavier key: direct% = 0 d% = key_down_code if d%=37 : ' gauche dx% = 0 - 1 dy% = 0 direct% = 1 end_if if d%=38 : ' haut dx% = 0 dy% = 0 - 1 direct% = 2 end_if if d%=39 : ' droite dx% = 1 dy% = 0 direct% = 3 end_if if d%=40 : ' bas dx% = 0 dy% = 1 direct% = 4 end_if if direct%=0 then return for i%=1 to 30 : ' pas de 30 pixels par frappe d'une flèche deplacer_sprite(sprite_mobile%,1,dx%,dy%) : ' déplacement relatif tester_si_collision(sprite_mobile%,direct%) : ' suivi du test de collision s$ = "" if sprite_collision%>0 : ' une collision a eu lieu ? s$ = "collision avec sprite "+str$(sprite_collision%)+"=["+sname_collision$+"] tune "+str$(tune_collision%)+"=["+tname_collision$ sm$ = "] touché par sprite "+str$(sprite_collision_mobile%)+"=["+sname_collision_mobile$+"] tune "+str$(tune_collision_mobile%)+"=["+tname_collision_mobile$+"]" message s$ + sm$ deplacer_sprite(sprite_mobile%,1,0-dx%,0-dy%) : ' annuler le déplacement en cas de collision exit_for : ' et arrêter le déplacement end_if : ' fin test si collision next i% : ' fin boucle de déplacement return
' ***** clic dans la scene2d clic: chercher_sprite_selon_clic() if sprite_trouve%>0 sprite_mobile% = sprite_trouve% : ' sélectionner le sprite cliqué ! if tune_trouve%>0 message "clic sur sprite "+str$(sprite_trouve%)+"="+snames$(sprite_trouve%)+" tune "+str$(tune_trouve%)+"="+tune_trouve_nom$ else message "clic sur sprite "+str$(sprite_trouve%)+"="+snames$(sprite_trouve%)+" sans tune" end_if else message "aucun sprite cliqué" end_if return ' ***** fermeture de la form 0 close0: effacer_images() : ' effacer éventuellement les images des sprites return
sub memoriser_images() dim_local d$, dold$, f$ if images$<>"" then exit_sub : ' mémorisation déjà activé ? d$ = dir_current$ + "\Temp_Sprites" : ' construire dossier temporaire des images des sprites if dir_exists(d$)=1 : ' ce dossier existe ? dold$ = dir_current$ : ' mémoriser le dossier actuel dir_change d$ : ' passer dans le dossier des images f$ = file_find_first$ : ' chercher le premier fichier while f$<>"_" : ' tant qu'on trouve des fichiers if left$(f$,1)<>"." then file_delete f$ : ' les supprimer f$ = file_find_next$ : ' et passer au suivant end_while file_find_close : ' fin de recherche de fichiers dir_change dold$ : ' repositionner dans le dossier par défaut ancien dir_remove d$ : ' et supprimer le dossier des images end_if dir_make d$ : ' alors créer ce dossier images$ = d$ : ' et mémoriser le chemin end_sub
sub effacer_images() dim_local old$, f$ if images$="" then exit_sub : ' le dossier temporaire n'existe pas ? Rien à faire ! old$ = dir_current$ : ' mémoriser l'actuel dossier courant dir_change images$ : ' changer pour le dossier temporaire des images f$ = file_find_first$ : ' prendre le premier nom de fichier de ce dossier while f$<>"_" : ' tout est traité ? if left$(f$,1)<>"." then file_delete f$ : ' détruire si c'est un vrai fichier f$ = file_find_next$ : ' passer au fichier suivant end_while : ' fin de boucle de traitement file_find_close : ' clore la fonction de recherche dir_change old$ : ' remettre l'ancien dossier courant rmdir images$ : ' supprimer le dossier des images images$ = "" : ' et "oublier" ce dossier end_sub
sub creer_sprite(nam$,x%,y%,img%,dur%) nsprite% = nsprite% + 1 : ' passer au numéro de sprite suivant sprite nsprite% : ' créer le sprite snames$(nsprite%) = nam$ : ' memoriser son nom sprites(nsprite%,0) = 200 : ' mémoriser sa largeur sprites(nsprite%,1) = 200 : ' et sa hauteur sprites(nsprite%,2) = 1 : ' marquer "visible" sprites(nsprite%,3) = dur% : ' marquer 0="pénétrable" ou 1="impénétrable" sprites(nsprite%,4) = x% : ' position horizontale du sprite sprites(nsprite%,5) = y% : ' position verticale du sprite sprites(nsprite%,6) = 0 : ' pas de tunes sprites(nsprite%,7) = 0 : ' pas de tunes if img%>0 : ' une image est fournie ? sprite_image_load nsprite%,img% : ' copier une image dans le sprite if images$<>"" then file_save img%,images$+"\sprite_"+str$(nsprite%)+".bmp" : ' et la sauver end_if : ' fin test image fournie sprite_position nsprite%,x%,y% : ' positionner le sprite à l'endroit voulu display end_sub
sub creer_sprite_avec_tunes(nam$,x%,y%,img%,dur%,dl%) dim_local t%, s$, p%, n% if object_exists(dl%)=0 then exit_sub : ' impossible si l'objet n'existe pas if object_type(dl%)<>26 then exit_sub : ' impossible si l'objet n'est pas une DLIST if count(dl%)=0 then exit_sub : ' impossible si la liste des tunes est vide nsprite% = nsprite% + 1 : ' passer au numéro de sprite suivant sprite nsprite% : ' créer le sprite snames$(nsprite%) = nam$ : ' memoriser son nom sprites(nsprite%,0) = 200 : ' mémoriser sa largeur sprites(nsprite%,1) = 200 : ' et sa hauteur sprites(nsprite%,2) = 1 : ' marquer "visible" sprites(nsprite%,3) = dur% : ' marquer 0="pénétrable" ou 1="impénétrable" sprites(nsprite%,4) = x% : ' position horizontale du sprite sprites(nsprite%,5) = y% : ' position verticale du sprite sprites(nsprite%,6) = ntunes%+1 : ' indice dans la liste des tunes sprites(nsprite%,7) = count(dl%) : ' nombre de tunes for t%=1 to count(dl%) : ' boucle sur les lignes des tunes ntunes% = ntunes% + 1 : ' compter le nouveau tune tunes(ntunes%,0) = nsprite% : ' mémoriser le numéro du sprite pour ce tune s$ = item_read$(dl%,t%)+"," : ' lire un eligne de tunes p% = instr(s$,",") n% = val(left$(s$,p%-1)) : ' garder le numéro du tune s$ = mid$(s$,p%+1,100) : ' dépasser le numéro de tune p% = instr(s$,",") tunes(ntunes%,1) = val(left$(s$,p%-1)) : ' mémoriser coordonnée x du tune s$ = mid$(s$,p%+1,100) : ' dépasser la coordonnée x du tune p% = instr(s$,",") tunes(ntunes%,2) = val(left$(s$,p%-1)) : ' mémoriser coordonnée y du tune s$ = mid$(s$,p%+1,100) : ' dépasser la coordonnée y du tune p% = instr(s$,",") tunes(ntunes%,3) = val(left$(s$,p%-1)) - tunes(ntunes%,1)+1 : ' mémoriser largeur du tune s$ = mid$(s$,p%+1,100) : ' dépasser la largeur du tune p% = instr(s$,",") tunes(ntunes%,4) = val(left$(s$,p%-1)) - tunes(ntunes%,2)+1 : ' mémoriser hauteur du tune s$ = mid$(s$,p%+1,100) : ' dépasser la hauteur du tune if s$="" then s$ = "Tune "+str$(n%) tnames$(ntunes%) = s$ next t% : ' fin boucle sur les lignes des tunes if img%>0 : ' une image est fournie ? sprite_image_load nsprite%,img% : ' copier une image dans le sprite if images$<>"" then file_save img%,images$+"\sprite_"+str$(nsprite%)+".bmp" : ' et la sauver end_if : ' fin test image fournie sprite_position nsprite%,x%,y% : ' positionner le sprite à l'endroit voulu
display end_sub
sub copier_sprite(nam$,n%,x%,y%,img%) dim_local i%, nt% nsprite% = nsprite% + 1 : ' passer au numéro de sprite suivant sprite nsprite% : ' créer le sprite snames$(nsprite%) = nam$ : ' memoriser son nom sprites(nsprite%,0) = sprites(n%,0) : ' mémoriser sa largeur sprites(nsprite%,1) = sprites(n%,1) : ' et sa hauteur sprites(nsprite%,2) = sprites(n%,2) : ' marquer "visible" sprites(nsprite%,3) = sprites(n%,3) : ' marquer 0="pénétrable" ou 1="impénétrable" sprites(nsprite%,4) = x% : ' position horizontale du sprite if sprites(n%,3)=0 then sprites(nsprite%,4) = sprites(nsprite%,4) + 4000 : ' traitement "invisible" sprites(nsprite%,5) = y% : ' position verticale du sprite if sprites(n%,6)=0 : ' le sprite source n'a pas de tunes ? sprites(nsprite%,6) = 0 : ' pas de tunes sprites(nsprite%,7) = 0 : ' pas de tunes else : ' le sprite source a des tunes nt% = sprites(n%,6) : ' alors mémoriser l'indice dans la liste des tunes sprites(nsprite%,6) = ntunes%+1 : ' indice dans la liste des tunes sprites(nsprite%,7) = sprites(n%,7) : ' nombre de tunes for i%=1 to sprites(n%,0) : ' boucle sur tous les tunes du sprite source ntunes% = ntunes% + 1 : ' compter le nouveau tune tunes(ntunes%,0) = nsprite% : ' mémoriser le numéro du sprite pour ce tune tunes(ntunes%,1) = tunes(nt%+i%-1,1) : ' et copier les autres valeurs tunes(ntunes%,2) = tunes(nt%+i%-1,2) tunes(ntunes%,3) = tunes(nt%+i%-1,3) tunes(ntunes%,4) = tunes(nt%+i%-1,4) tnames$(ntunes%) = tnames$(nt%+i%-1) : ' copier le nom du tune next i% : ' fin boucle de copie des tunes end_if : ' fin traitement des tunes
if images$<>"" : ' les images sont mémorisées ? if file_exists(images$+"\sprite_"+str$(n%)+".bmp")=1 file_load img%,images$+"\sprite_"+str$(n%)+".bmp" : ' charger l'image dans objet IMG% sprite_image_load nsprite%,img% : ' charger l'image dans le nouveau sprite file_save img%,images$+"\sprite_"+str$(nsprite%)+".bmp" : ' et la sauver end_if : ' fin test "image existante" end_if : ' fin test images mémorisées
sprite_position nsprite%,sprites(nsprite%,4),sprites(nsprite%,5) : ' positionner le sprite à l'endroit voulu
display end_sub
sub deplacer_sprite(n%,rel%,x%,y%) if (n%<1) or (n%>nsprite%) then exit_sub : ' sécuriser if rel%=1 : ' positionnement relatif ? sprites(n%,4) = sprites(n%,4) + x% sprites(n%,5) = sprites(n%,5) + y% else : ' positionnement absolu ! sprites(n%,4) = x% sprites(n%,5) = y% end_if if sprites(nsprite%,2)=1 : ' sprite visible ? sprite_position n%,sprites(n%,4),sprites(n%,5) : ' positionner le sprite visible à l'endroit voulu else : ' sprite caché ! sprite_position n%,sprites(n%,4)+4000,sprites(n%,5) : ' positionner le sprite caché à l'endroit voulu end_if end_sub
sub redimensionner_sprite_x(n%,c) if (n%<1) or (n%>nsprite%) then exit_sub : ' sécuriser sprite_x_scale n%,c : ' ajuster la largeur sprites(n%,0) = sprites(n%,0)*c : ' et mémoriser end_sub
sub redimensionner_sprite_y(n%,c) if (n%<1) or (n%>nsprite%) then exit_sub : ' sécuriser sprite_y_scale n%,c : ' ajuster la hauteur sprites(n%,1) = sprites(n%,1)*c : ' et mémoriser end_sub
sub redimensionner_sprite_xy(n%,cx,cy) if (n%<1) or (n%>nsprite%) then exit_sub : ' sécuriser sprite_scale n%,cx,cy : ' ajuster largeur et hauteur sprites(n%,0) = sprites(n%,0)*cx : ' et mémoriser la largeur sprites(n%,1) = sprites(n%,1)*cy : ' et mémoriser la hauteur end_sub
sub cacher_sprite(n%) if (n%<1) or (n%>nsprite%) then exit_sub : ' sécuriser if sprites(n%,2)=1 : ' est-ce que le sprite est visible ? sprite_x_position n%,sprite_x_position(n%) + 4000 : ' déplacer hors de la vue sprites(n%,2) = 0 : ' signaler "invisible" end_if end_sub
sub montrer_sprite(n%) if (n%<1) or (n%>nsprite%) then exit_sub : ' sécuriser if sprites(n%,2)=0 : ' est-ce que le sprite est invisible ? sprite_x_position n%,sprite_x_position(n%) - 4000 : ' replacer dans la partie visible sprites(n%,2) = 1 : ' signaler "visible" end_if end_sub
sub chercher_sprite_selon_clic() dim_local i%, x%, y%, xs%, ys%, nt%, t%, ind%, ws, hs sprite_trouve% = 0 : ' supposer "sprite non trouvé" tune_trouve% = 0 : ' supposer "tune non trouvé" tune_trouve_nom$ = "" : ' donc, pas de nom... if number_click<>scene_2d% then exit : ' on n'a pas cliqué dans le scene2d ? if nsprite%=0 then exit_sub : ' pas de sprites créés ? x% = mouse_x_left_down(scene_2d%) : ' mémoriser la position horizontale du clic y% = mouse_y_left_down(scene_2d%) : ' mémoriser la position verticale du clic for i%=nsprite% to 1 step -1 : ' boucle sur tous les sprites xs% = sprite_x_position(i%) : ' mémoriser la position horizontale du sprite i% ys% = sprite_y_position(i%) : ' mémoriser la position verticale dusprite i% if (xs%<x%) : ' le bord gauche du sprite est plus à gauche que l'abscisse du clic ? if (ys%<y%) : ' le bord haut du sprite est plus haute que l'ordonnée du sprite ? if xs%+sprites(i%,0)>=x% : ' le bord droit du sprite est plus à droite que l'abscisse du clic ? if ys%+sprites(i%,1)>=y% : ' le bord bas du sprite est plus en bas que l'ordonnée du clic ? sprite_trouve% = i% : ' alors, on a trouvé le sprite if sprites(i%,7)>0 : ' le sprigte cliqué a des tunes ? nt% = sprites(i%,7) : ' prendre le nombre de tunes ind% = sprites(i%,6)-1 : ' prendre l'indice dans tunes() for t%=1 to nt% : ' boucle sur les tunes du sprite cliqué xs% = tunes(ind%+t%,1) : ' c'est l'abscisse du coin en haut à gauche ys% = tunes(ind%+t%,2) : ' c'est l'ordonnée du coin en haut à gauche ws = tunes(ind%+t%,3) : ' c'est la largeur hs = tunes(ind%+t%,4) : ' c'est la hauteur xs% = xs% + sprites(i%,4) : ' l'adresse du tune est relative ! ys% = ys% + sprites(i%,5) : ' l'adresse du tune est relative ! if (x%>=xs%) and (x%<(xs%+ws)) : ' horizontalement cliqué dans le tune ? if (y%>=ys%) and (y%<(ys%+hs)) : ' vertictalement cliqué dans le tune ? tune_trouve% = t% : ' retourner le numéro du tune cliqué tune_trouve_nom$ = tnames$(ind%+t%) : ' et son nom end_if end_if next t% : ' find de boucle sur les tunes end_if : ' in du traitement des tunes exit_sub : ' et on sort end_if : ' fin test sur le bord bas du sprite end_if : ' fin test sur le bord droit du sprite end_if : ' fin test sur le bord haut du sprite end_if : ' fin test sur le bord gauche du sprite next i% : ' fin boucle sur les sprites end_sub
sub tester_si_collision(n%,dir%) dim_local i%, x%, y%, w%, h%, xs%, ys%, w, h, ws, hs, t%, nt%, dim_local s$, s1$, ss$, ss1$, p%, p2%, pp%, pp2%, dim_local ntm%, tm%, xsm%, ysm%, wsm, hsm, ind%, indm% sprite_collision% = 0 : ' supposer "pas de collision" sprite_collision_mobile% = 0 tune_collision% = 0 tune_collision_mobile% = 0 if nsprite%<2 then exit_sub : ' pas de collisions possibles ? if sprites(n%,2)=0 then exit_sub : ' le sprite mobile est "invisible" ? if sprites(n%,3)=0 then exit_sub : ' le sprite mobile est "pénétrable" ? x% = sprites(n%,4) : ' position horizontale du sprite en movement y% = sprites(n%,5) : ' position verticale du sprite en movement w = sprites(n%,0) : ' largeur du sprite en movement h = sprites(n%,1) : ' hauteur du sprite en movement for i%=nsprite% to 1 step -1 : ' boucle sur tous les sprites if i%<>n% : ' on est sur un sprite autre que celui qui bouge ? if sprites(i%,3)<>0 : ' sprite en dur ? xs% = sprites(i%,4) : ' position horizontale du sprite à tester ys% = sprites(i%,5) : ' position verticale du sprite à tester ws = sprites(i%,0) : ' largeur du sprite à tester hs = sprites(i%,1) : ' hauteur du sprite à tester select dir% : ' distinction par direction du mouvement case 1: ' gauche if (x%-1)<=(xs%+ws) : ' bord droit fixe peut toucher bord gauche mobile ? if (x%+w)>=(xs%-1) : ' bord droit mobile plus à droite que bord gauche fixe ? if (ys%+hs)>=y% : ' bord bas mobile plus bas que bord haut fixe ? if ys%<=(y%+h) : ' bord haut mobile plus que bord bas fixe ? sprite_collision% = i% : ' alors collision ' 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) : ' bord bas mobile plus bas que bord haut fixe ? if (xs%+hs)>=x% : ' bord droit mobile plus à gauche que bord gauche fixe ? if xs%<=(x%+h) : ' bord gauche mobile plus à gauche que bord droit fixe ? sprite_collision% = i% : ' alors collision end_if end_if end_if end_if case 3: ' droite : ' à adapter if (x%+w)>=(xs%-1) : ' bord gauche fixe peut toucher bord droit mobile ? if x%<=(xs%+ws) : ' bord gauche mobile plus à gauche que bord droit fixe ? if (y%+h)>=(ys%-1) : ' bord bas mobile plus bas que bord haut fixe ? if ys%<=(y%+h) : ' bord haut mobile plus bas que bord bas fixe ? sprite_collision% = i% : ' alors collision end_if end_if end_if end_if case 4: ' bas : ' à adapter if (y%+h)=(ys%-1) : ' bord haut fixe peut toucher bord bas mobile ? if y%<=(ys%+hs) : ' bord haut mobile plus haut que bord bas fixe ? if (xs%+hs)>=x% : ' bord droit mobile plus à gauche que bord gauche fixe ? if xs%<=(x%+h) : ' bord gauche mobile plus à gauche que bord droit fixe ? sprite_collision% = i% : ' alors collision end_if end_if end_if end_if end_select : ' fin distinction par direction ' message str$(sprite_collision%)
if sprite_collision%>0 : ' une collision est possible ? if trace%=1 then clear 102 if sprites(i%,6)>0 : ' le sprite fixe a des tunes ? nt% = sprites(i%,7) : ' nombre de tunes ind% = sprites(i%,6)-1 : ' prendre l'indice dans tunes() for t%=1 to nt% : ' boucle sur les tunes du sprite touché xs% = tunes(ind%+t%,1) : ' c'est l'abscisse du coin en haut à gauche ys% = tunes(ind%+t%,2) : ' c'est l'ordonnée du coin en haut à gauche ws = tunes(ind%+t%,3) : ' c'est la largeur hs = tunes(ind%+t%,4) : ' c'est la hauteur xs% = xs% + sprites(i%,4) : ' l'adresse du tune est relative ! ys% = ys% + sprites(i%,5) : ' l'adresse du tune est relative !
if sprites(n%,6)>0 : ' le sprite mobile a des tunes ? ntm% = sprites(n%,7) : ' nombre de tunes du sprite mobile indm% = sprites(n%,6)-1 : ' prendre l'indice dans tunes() for tm%=1 to ntm% : ' boucle sur les tunes du sprite mobileé xsm% = tunes(indm%+tm%,1) : ' c'est l'abscisse du coin en haut à gauche ysm% = tunes(indm%+tm%,2) : ' c'est l'ordonnée du coin en haut à gauche wsm = tunes(indm%+tm%,3) : ' c'est la largeur hsm = tunes(indm%+tm%,4) : ' c'est la hauteur xsm% = xsm% + sprites(n%,4) : ' l'adresse du tune est relative ! ysm% = ysm% + sprites(n%,5) : ' l'adresse du tune est relative ! if trace%=1 item_add 102,"Fixe: tune "+str$(t%)+": "+str$(xs%)+","+str$(ys%)+"/"+str$(ws)+","+str$(hs) item_add 102,"Mobile: tune "+str$(tm%)+": "+str$(xsm%)+","+str$(ysm%)+"/"+str$(wsm)+","+str$(hsm) item_add 102,"" end_if if (xs%-1)<=(xsm%+wsm) : ' bord gauche tune fixe plus à gauche que bord droit tune mobile ? if (xs%+ws)>=(xsm%-1) : ' bord droit tune fixe plus à droite que bord gauche tune mobile ? if (ysm%+hsm)>=ys% : ' bord bas tune mobile plus bas que bord haut tune fixe ? if ysm%<=(ys%+hs) : ' bord haut tune mobile plus haut que bord bas tune fixe ? sprite_collision% = i% : ' alors collision tune_collision% = t% tune_collision_mobile% = tm% chercher_noms(n%) : ' chercher les noms des tunes if trace%=1 then item_add 102,str$(ind%)+" "+str$(indm%) exit_sub : ' sortie car on a trouvé une collision end_if : ' fin test sur bord haut tune mobile end_if : ' fin test sur bord bas tune mobile end_if : ' fin test sur bord droit tune fixe end_if : ' fin test sur bord gauche tune fixe
next tm% : ' fin boucle sur les tune du mobile else : ' le sprite mobile n'a pas de tunes ! if (xs%-1)<=(x%+w) : ' bord gauche tune fixe plus à gauche que bord droit sprite mobile ? if (xs%+ws)>=(x%-1) : ' bord droit tune fixe plus à droite que bord gauche sprite mobile ? if (y%+h)>=ys% : ' bord bas sprite mobile plus bas que bord haut tune fixe ? if y%<=(ys%+hs) : ' bord haut sprite mobile plus haut que bord bas tune fixe ? sprite_collision% = i% : ' alors collision tune_collision% = t% tune_collision_mobile% = 0 chercher_noms(n%) : ' chercher les noms des tunes if trace%=1 then item_add 102,str$(ind%)+" fixe" exit_sub : ' sortie car on a trouvé une collision end_if : ' fin test sur bord haut tune mobile end_if : ' fin test sur bord bas tune mobile end_if : ' fin test sur bord droit tune fixe end_if : ' fin test sur bord gauche tune fixe end_if : ' fin sprite mobile a des tunes next t% : ' fin boucle sur les tunes du sprite touché sprite_collision% = 0 : ' aucun tune du sprite n'est touché else : ' le sprite fixe n'a pas de tunes ! if sprites(n%,6)>0 : ' le sprite mobile a des tunes ? ntm% = sprites(n%,7) : ' nombre de tunes du sprite mobile indm% = sprites(n%,6)-1 : ' prendre l'indice dans tunes() for tm%=1 to ntm% : ' boucle sur les tunes du sprite mobileé xsm% = tunes(indm%+tm%,1) : ' c'est l'abscisse du coin en haut à gauche ysm% = tunes(indm%+tm%,2) : ' c'est l'ordonnée du coin en haut à gauche wsm = tunes(indm%+tm%,3) : ' c'est la largeur hsm = tunes(indm%+tm%,4) : ' c'est la hauteur xsm% = xsm% + sprites(n%,4) : ' l'adresse du tune est relative ! ysm% = ysm% + sprites(n%,5) : ' l'adresse du tune est relative ! if trace%=1 item_add 102,"fixe: "+str$(sprites(i%,4))+","+str$(sprites(i%,5))+" / "+str$(sprites(i%,0))+","+str$(sprites(i%,1)) item_add 102,"tune: "+str$(tm%)+": "+str$(xsm%)+","+str$(ysm%)+" / "+str$(wsm)+","+str$(hsm) item_add 102,"" end_if if (sprites(i%,4)-1)<=(xsm%+wsm) : ' bord gauche sprite fixe plus à gauche que bord droit tune mobile ? item_add 102,"a" if (sprites(i%,4)+sprites(i%,0))>=(xsm%-1) : ' bord droit sprite fixe plus à droite que bord gauche tune mobile ? item_add 102,"b" if (ysm%+hsm)>=sprites(i%,5) : ' bord bas tune mobile plus bas que bord haut sprite fixe ? item_add 102,"c" if ysm%<=(sprites(i%,5)+sprites(i%,1)) : ' bord haut tune mobile plus haut que bord bas sprite fixe ? item_add 102,"d" sprite_collision% = i% : ' alors collision tune_collision% = 0 tune_collision_mobile% = tm% chercher_noms(n%) : ' chercher les noms des tunes if trace%=1 then item_add 102,str$(indm%)+" mobile" exit_sub : ' sortie car on a trouvé une collision end_if : ' fin test sur bord haut tune mobile end_if : ' fin test sur bord bas tune mobile end_if : ' fin test sur bord droit tune fixe end_if : ' fin test sur bord gauche tune fixe next tm% : ' fin boucle sur les tunes mobile sprite_collision% = 0 else : ' sprite mobile n'a pas de tunes ! chercher_noms(n%) : ' alors, construire les noms par défaut end_if : ' fin de test sur les tunes du sprite mobile exit_sub : ' donc, sortie immédiate car colision globale end_if : ' fin test si sprite a des tunes end_if : ' fin collision possible end_if : ' fin test sprite en dur end_if : ' fin test sur sprite "autre" next i% : ' fin boucle sur les sprites end_sub
sub chercher_noms(mob%) sprite_collision_mobile% = mob% : ' retourner ne numéro du sprite mobile sname_collision$ = snames$(sprite_collision%) : ' retourner le nom du sprite touché sname_collision_mobile$ = snames$(mob%) : ' retourner le nom du sprite mobile if tune_collision%>0 : ' est-ce qu'un tune a été touché ? for j%=1 to ntunes% : ' boucle de recherche du sprite concerné if tunes(j%,0)=sprite_collision% : ' est-ce le sprite touché ? tname_collision$ = tnames$(j%+tune_collision%-1) : ' prendre le nom du tune exit_for : ' et sortir end_if : ' fin de traitement du sprite trouvé next j% : ' fin boucle sur les tunes else tname_collision$ = "Sprite entier" end_if : ' fin traitement du tune touché if tname_collision$="" then tname_collision$ = "Tune "+str$(tune_collision%) : ' nom par défaut if tune_collision_mobile%>0 : ' est-ce qu'un tune mobile a touché ? for j%=1 to ntunes% : ' boucle de recherche du sprite concerné if tunes(j%,0)=mob% : ' est-ce le sprite mobile ? tname_collision_mobile$ = tnames$(j%+tune_collision_mobile%-1) : ' prendre le nom du tune exit_for : ' et sortir end_if : ' fin de traitement du sprite trouvé next j% : ' fin boucle sur les tunes else tname_collision_mobile$ = "Sprite entier" end_if : ' fin traitement du tune touché if tname_collision_mobile$="" then tname_collision_mobile$ = "Tune "+str$(tune_collision_mobile%) : ' nom par défaut end_sub
Dernière édition par Klaus le Ven 12 Juin 2015 - 11:43, édité 1 fois | |
| | | 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 Ven 12 Juin 2015 - 11:38 | |
| @Klaus, il y a un inconvénient avec les touches de déplacement, toutes les touches du clavier restent fonctionnelles... d'autre part j'ai déposé sur mon Webdav un dossier nommé "vaisseau" à l'intérieur de "jeu_en 2D" J'aimerai que tu le télécharges et que tu réfléchisses à moyen de faire pivoté le vaisseau sur lui même et de voir aussi des possibilités de déplacement en diagonale. Je ramasse ta copie dans 1/4 d'heure.. | |
| | | 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 Ven 12 Juin 2015 - 11:47 | |
| Je voudrais votre avis.
J'envisage de renommer ce post "Procédure pour la 2D" car le titre actuel ne correspond plus au sujet initial.
A+ | |
| | | 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 Ven 12 Juin 2015 - 11:50 | |
| Voilà qui est corrigé. Je vais voir ton problème de pivotement. Mais en général, le pivotement se fait de la manière suivante: 1. tu mémorises l'orientation pour le ou les sprites concernés, dans une variable par sprite 2. tu crées autant d'images du sprite que d'orientations possibles 3. tu prévois 2 touches pour pivoter à gauche ou à droite 4. en fonction de la nouvelle orientation, tu charges l'image correspondante dans le sprite
Il n'y a pas d'autre méthode. La notion de rotation d'un sprite n'existe pas, et tu dois le programmer de cette manière.
Si tu veux faire un déplacement diagonale, il faut définir 4 autres touches fonction. Chacune de ces touches va effectuer un déplacement d'un pixel dans un sens vertical (avec contrôle de collision) suivi d'un déplacement dans un sens horizontal (à nouveau avec contrôle de collision). Ainsi, en utilisant les directions de la rose des vents pour désigner les déplacements, NO devient N suivi de O, NE devient N suivi de E, etc. | |
| | | 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 Ven 12 Juin 2015 - 11:51 | |
| Bonne idée de renommer ce fil de discussion ! | |
| | | 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 Ven 12 Juin 2015 - 12:02 | |
| J'ai regardé ton code. Belle image ! Pour pouvoir bouger ton sprite, il faut changer le numéro du sprite mobile: - Code:
-
sprite_mobile% = 1 : ' c'est le sprite mobile par défa Dans mon code, c'était le sprite 2. Mais pour toi, c'est le sprite 1... Ainsi, il est déplaçable même sans cliquer dessus. Mais, en cliquant dessus, cela s'actualise tout seul, et on voit très bien les différentes zones actives. Je reviens sur la rotation: non seulement il faut faire autant d'images que de positions possibles, mais il faut également redéfinir les tunes pour chaque rotation, bien sûr ! | |
| | | 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 Ven 12 Juin 2015 - 12:13 | |
| OK, j'ai compris,
sprite_mobile% = 1 : ' c'est le sprite mobile par défaut
il y a beaucoup à apprendre.
Pour la rotation, ça fait beaucoup de travail car pour redéfinir les tunes, il faut repasser par build_sprite_mask. Mais bon, ce n'est pas impossible.
A+
| |
| | | 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 Ven 12 Juin 2015 - 14:07 | |
| @Klaus,
Apparemment, pour que ton jeu de procédures fonctionne, il n'est pas indispensable que la taille des images.bmp soit 200x200. Si c'est le cas, tu pourrais définir par une variable la taille des images. Bien sur, ça t'oblige à revoir build_sprite_mask dans la même optique.
Est-ce obligatoire qu'elle soit carré ???
200x200 pour des sprites avec ou sans tune, c'est trop grand pour faire un jeu sur un SCENE2D de 700x700.
A+ | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Des procédures pour la 2D Ven 12 Juin 2015 - 14:18 | |
| Dans l'outil pour les sprites, (il faudra abandonner le nom build_mask) pour sprite tool ou autre, il y a plein de petit outils qui peuvent être bien pratique comme la substitution d'une couleur par une autre, la rotation par pas de 90° peut être faite facilement avec adaptation des masques automatiquement, après ça se complique un peu. Je pense que la rotation par pas de 45° doit pouvoir être envisagé d'une manière raisonnable mais je pense comme Klaus que le plutôt au moins d'en faire une version tournée à 45°, après on pourra appliquer l'outil pour calculer les 4 rotations à 90° de ce sprite et de ses masques. Je réouvrirait les outils que j'avais fait pour modifié les sprites de Barbarian, il y avait l'inversion horizontale et verticale, la substitution d'une couleur par une autre avec une palette libre ou avec des couleurs spécifiques pour pouvoir travailler (j'avais mis le noir avec les 3 valeurs à 0, le noir avec le bleu à 1 (le faux noir pas transparent), le fushia qui me servait a remplacer la couleur 0 pendant que je travaillais pour la distinguer du noir. Je ne me souviens plus du reste, mais bien sûr il faudra garder dans les outils la création de masques et de tunes. | |
| | | 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
| |
| |
| |