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 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. | |
| | | 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 - 15:00 | |
| @Jean Claude: J'ai pris 200x200 car c'est la taille maximale d'un sprite. Cela peur bien sûr être plus petit. Je reconfigurerai bientôt mon outil pour une taille paramétrable. Et rectangulaire est possible aussi... @Jicehel: Je en vois pas bien quel problème pose le nom que j'ai choisi? Faudra que tu m'expliques. Mais en réalité, n'importe quel nom ferait l'affaire. J'ai choisi ce schéma de nommage dans un double souci: éviter des conflits de noms de fichiers sur le disque, et avoir des noms auto-explicatifs. Maintenant, pour les rotations de 90° à 90°, c'est assez simple. J'ai des fonctions dans KGF.dll qui font ça, et donc aussi bien le sprite lui-même que le masque peuvent être tournés ainsi. Et le fichier descriptif des tunes peut être assez facilement recalculé dans ce contexte - un peu de calcul à faire, mais rien de méchant. On pourrait intégrer dans l'outil, des boutons "Rotation 90° à droite" et "Rotation 90° à gauche". La rotation de 45° est une toute autre paire de manches. J'ai bien des fonctions dans KGF.dll qui le font, donc pas de problème pour tourner l'image et le masque. Et le recalcul des définitions des tunes est facile aussi. Non, le problème réside dans la perte potentielle de parties d'image. Si le sprite à tourner a des parties visibles proche des coins, elles seront tout simplement tronquées (clipping). Ceci est vrai pour un sprite carré, mais plus encore pour un sprite rectangulaire. Il faut être absolument certain que toute la partie visible du sprite est inscrite dans un cercle centrée sur le centre du sprite, et dont le diamètre est égal à la longueur du plus petit côté du rectange. Alors oui, on peut faire une rotation de 45° ! Et voici mon programme de démo, avec la possibilité de déplacements en diagonale ! Les touches suivantes sont reconnues: - Code:
-
Direction Touches normales Pavé numérique ====================================================== gauche flèche à gauche 4 droite flèche à droite 6 haut flèche en haut 8 bas flèche en bas 2 haut gauche 7 haut droite 9 bas gauche 1 bas droite 3
Ceci marche en mode "numérique verrouillé" ou non. 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$, direct1%, direct2%, dx2%, dy2%
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: direct1% = 0 direct2% = 0 d% = key_down_code if (d%=37) or (d%=100) : ' gauche dx% = 0 - 1 dy% = 0 direct1% = 1 end_if if (d%=38) or (d%=104) : ' haut dx% = 0 dy% = 0 - 1 direct1% = 2 end_if if (d%=39) or (d%=102) : ' droite dx% = 1 dy% = 0 direct1% = 3 end_if if (d%=40) or (d%=98) : ' bas dx% = 0 dy% = 1 direct1% = 4 end_if if (d%=33) or (d%=105) : ' haut droite dx% = 0 dy% = 0 - 1 direct1% = 2 dx2% = 1 dy2% = 0 direct2% = 3 end_if if (d%=34) or (d%=99) : ' bas droite dx% = 0 dy% = 1 direct1% = 4 dx2% = 1 dy2% = 0 direct2% = 3 end_if if (d%=35) or (d%=97) : ' bas gauche dx% = 0 dy% = 1 direct1% = 4 dx2% = 0 - 1 dy2% = 0 direct2% = 1 end_if if (d%=36) or (d%=103) : ' haut gauche dx% = 0 dy% = 0 - 1 direct1% = 2 dx2% = 0 - 1 dy2% = 0 direct2% = 1 end_if
if direct1%=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%,direct1%) : ' 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 if direct2%>0 : ' test si déplacement en diagonale deplacer_sprite(sprite_mobile%,1,dx2%,dy2%) : ' déplacement relatif tester_si_collision(sprite_mobile%,direct2%) : ' 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
end_if : ' fin test déplacement en diagonale 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 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
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 | |
| | | 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 - 17:12 | |
| @Klaus, déplacement en diagonale: testé, ça fonctionne impeccable. Pour la taille des sprites c'est une bonne nouvelle. Une remarque: pour faciliter les mises à jours de mon code pourrais-tu regrouper les variables indispensables dans une sub, ainsi je pourrais utiliser #include @ Jicehel et Klaus. Pour les rotations Photofiltre7 (gratuit) fait cela très bien et sans déformer l'image. On peut jouer sur 2 fronts: rotation et inclinaison et ça donne des bons résultats, alors pourquoi se prendre la tête... 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 - 17:25 | |
| C'est ça Jean-Claude. Le plus simple c'est de calculer un sprite à 45° et de s'assurer qu'il et propre. Après on peut utiliser les procédure de rotataion à 90° qui ne sont pas destructive.
@Klaus: le nom de ton programme ne pose aucun probème et correspond à son utilisation actuel, mais si on fait un programme pour le traitement des sprites qui fasse la rotation, la création de masques, de tunes, de changement de couleurs et autres utilitaires pratiques pour les sprites il ne correspondra plus. La création de masques et de tunes ne sera plus que l'une des possiblités, un des outils. | |
| | | 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 - 17:56 | |
| Exact. A ce moment-là, on conviendra d'un autre nom... Voici une version qui isole toutes les définitions de variables globales pour les SUBs dans une SUB de définition. Ainsi, tout peut être inclus dans un module #INCLUDE. Vous trouverez également une variable DoKGF% qui a la valeur 0. Laissez-là comme ça. C'est pour une évolution que je suis en train de mettre en place, pour pouvoir gérer la détection des collusions par une fonction DLL, pour optimiser les performances. Mais si vous laissez cette variable à 9, KGF.dll ne sera pas chargée et le programme fonctionnera comme avant. - Code:
-
' 2d_utilities.bas
' res% = dll_call6("DefineSprite",ns%,x%,y%,w%,h%,adr(nom$)) ' res% = dll_call5("ChangeSpriteGeometry",ns%,x%,y%,w%,h%) ' res% = dll_call3("ChangeSpriteOptions",ns%,v%,s%) ' res% = dll_call2("SetSpriteTunes",ns%,object_internal(dl)) ' res% = dll_call2("CopySpriteTunes",ns%,nsorg%)
label clic, key, close0
' ====== variables de configuration ======================================== 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 trace% : trace% = 0 : ' mettre 1 pour afficher une trace des calculs dim DoKGF% : DoKGF% = 0 : ' effectuer le travail par des fonctions KGF.dll
' ======= variables diverses pour le programme de démo ==================== dim scene_2d% : ' numéro d'objet du scene2d dim images$ : ' nom de dossier temporaire pour copier les images des sprites dim i%, j%, d%, dx%, dy%, s$, sm$, direct1%, direct2%, dx2%, dy2%, res% ' ===================== fin des variables =================================== variables_pour_sprites() : ' déclarer les variables globales pour les SUBs
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 DoKGF%>0 then dll_on "KGF.dll"
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: direct1% = 0 direct2% = 0 d% = key_down_code if (d%=37) or (d%=100) : ' gauche dx% = 0 - 1 dy% = 0 direct1% = 1 end_if if (d%=38) or (d%=104) : ' haut dx% = 0 dy% = 0 - 1 direct1% = 2 end_if if (d%=39) or (d%=102) : ' droite dx% = 1 dy% = 0 direct1% = 3 end_if if (d%=40) or (d%=98) : ' bas dx% = 0 dy% = 1 direct1% = 4 end_if if (d%=33) or (d%=105) : ' haut droite dx% = 0 dy% = 0 - 1 direct1% = 2 dx2% = 1 dy2% = 0 direct2% = 3 end_if if (d%=34) or (d%=99) : ' bas droite dx% = 0 dy% = 1 direct1% = 4 dx2% = 1 dy2% = 0 direct2% = 3 end_if if (d%=35) or (d%=97) : ' bas gauche dx% = 0 dy% = 1 direct1% = 4 dx2% = 0 - 1 dy2% = 0 direct2% = 1 end_if if (d%=36) or (d%=103) : ' haut gauche dx% = 0 dy% = 0 - 1 direct1% = 2 dx2% = 0 - 1 dy2% = 0 direct2% = 1 end_if
if direct1%=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%,direct1%) : ' 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 if direct2%>0 : ' test si déplacement en diagonale deplacer_sprite(sprite_mobile%,1,dx2%,dy2%) : ' déplacement relatif tester_si_collision(sprite_mobile%,direct2%) : ' 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
end_if : ' fin test déplacement en diagonale 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 variables_pour_sprites() ' ======= variables globales utilisées par les procédures ================= 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é end_sub
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 if DoKGF%>0 res% = dll_call6("DefineSprite",nsprite%,x%,y%,200,200,adr(nam$)) res% = dll_call3("ChangeSpriteOptions",nsprite%,1,dur%) end_if 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 if DoKGF%>0 res% = dll_call6("DefineSprite",nsprite%,x%,y%,200,200,adr(nam$)) res% = dll_call3("ChangeSpriteOptions",nsprite%,1,dur%) res% = dll_call2("SetSpriteTunes",nsprite%,object_internal(dl%)) end_if
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 DoKGF%>0 res% = dll_call6("DefineSprite",nsprite%,x%,y%,200,200,adr(nam$)) res% = dll_call3("ChangeSpriteOptions",nsprite%,1,sprites(n%,3)) end_if 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 if DoKGF%>0 res% = dll_call2("CopySpriteTunes",nsprite%,n%) end_if 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 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 : 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 (ys%+hs)>=y% : ' 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 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
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 - 19:57, é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 - 18:53 | |
| Merci pour la possibilité #INCLUDE. J'ai un problème de collision entre 2 sprites sans tunes (les pauvres ) Plutôt que de mauvaises explications, télécharges le zip "vaisseau" (dans le dossier jeu_en_2D) et lance VaisseauSansTune.bas Si tu tourne autours de l’astéroïde, ça bien dans un sens (aiguille d'une montre) mais pas dans l'autre. Je pense n'avoir pas commis d'erreur dans la confection et la création des sprites. 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 - 19:59 | |
| Je pense que je viens de corriger ce bug dans la version postée ci-dessus. Cela concerne la sub tester_si_collision. Si tu la reprends dans le pos ci-dessus, ça devrait marcher. | |
| | | 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 - 20:46 | |
| Désolé, ça ne marche toujours pas. C'est même pire qu'avant, car ça bloque en x et y. 1) As-tu vérifié si j'ai correctement créer les sprites ? 2) j'ai un doute avec 2D_IMAGE_COPY, est-ce qu'il ne laisse pas la trace de l'image au moment de sa création, ce qui expliquerait le bug ???? Autrement il y a une chose qui m’interpelle: dans la dernière version il y a ceci: - Code:
-
' ======= variables diverses pour le programme de démo ==================== dim scene_2d% : ' numéro d'objet du scene2d dim images$ : ' nom de dossier temporaire pour copier les images des sprites dim i%, j%, d%, dx%, dy%, s$, sm$, direct1%, direct2%, dx2%, dy2%, res% Ces variables devrait se trouver dans sub variables_pour_sprites(), vu qu'elles sont utilisées dans les SUB(s) A+ PS: prends ton temps, car pour ce soir je décroche | |
| | | 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 - 23:45 | |
| Je te poste cette version de mon programme de démo, que j'ai configuré de sorte que les 3 sprites impénétrables" sont des carrés sans tunes. Donc, le moindre contact provoque une collision qui est détectée. Et ce pour des mouvements quelque soit le sens. - Code:
-
' 2d_utilities.bas
' res% = dll_call6("DefineSprite",ns%,x%,y%,w%,h%,adr(nom$)) ' res% = dll_call5("ChangeSpriteGeometry",ns%,x%,y%,w%,h%) ' res% = dll_call3("ChangeSpriteOptions",ns%,v%,s%) ' res% = dll_call2("SetSpriteTunes",ns%,object_internal(dl)) ' res% = dll_call2("CopySpriteTunes",ns%,nsorg%) ' res% = dll_call6("CheckSpriteCollision",ns%,dir%,adr(sc%),adr(scm%),adr(tc%),adr(tcm%))
label clic, key, close0
' ====== variables de configuration ======================================== dim selection_sprite_1% : selection_sprite_1% = 0 : ' 0=carré rouge impénétrable : ' 1=Android impénétrable dim selection_sprite_2% : selection_sprite_2% = 0 : ' 0=carré bleu impénétrable : ' 1=Android impénétrable dim trace% : trace% = 0 : ' mettre 1 pour afficher une trace des calculs dim DoKGF% : DoKGF% = 0 : ' effectuer le travail par des fonctions KGF.dll
' ======= variables diverses pour le programme de démo ==================== dim scene_2d% : ' numéro d'objet du scene2d dim images$ : ' nom de dossier temporaire pour copier les images des sprites dim i%, j%, d%, dx%, dy%, s$, sm$, direct1%, direct2%, dx2%, dy2%, res% ' ===================== fin des variables =================================== variables_pour_sprites() : ' déclarer les variables globales pour les SUBs
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 DoKGF%>0 then dll_on "KGF.dll"
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,800,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: direct1% = 0 direct2% = 0 d% = key_down_code if (d%=37) or (d%=100) : ' gauche dx% = 0 - 1 dy% = 0 direct1% = 1 end_if if (d%=38) or (d%=104) : ' haut dx% = 0 dy% = 0 - 1 direct1% = 2 end_if if (d%=39) or (d%=102) : ' droite dx% = 1 dy% = 0 direct1% = 3 end_if if (d%=40) or (d%=98) : ' bas dx% = 0 dy% = 1 direct1% = 4 end_if if (d%=33) or (d%=105) : ' haut droite dx% = 0 dy% = 0 - 1 direct1% = 2 dx2% = 1 dy2% = 0 direct2% = 3 end_if if (d%=34) or (d%=99) : ' bas droite dx% = 0 dy% = 1 direct1% = 4 dx2% = 1 dy2% = 0 direct2% = 3 end_if if (d%=35) or (d%=97) : ' bas gauche dx% = 0 dy% = 1 direct1% = 4 dx2% = 0 - 1 dy2% = 0 direct2% = 1 end_if if (d%=36) or (d%=103) : ' haut gauche dx% = 0 dy% = 0 - 1 direct1% = 2 dx2% = 0 - 1 dy2% = 0 direct2% = 1 end_if
if direct1%=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%,direct1%) : ' 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 if direct2%>0 : ' test si déplacement en diagonale deplacer_sprite(sprite_mobile%,1,dx2%,dy2%) : ' déplacement relatif tester_si_collision(sprite_mobile%,direct2%) : ' 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
end_if : ' fin test déplacement en diagonale 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 variables_pour_sprites() ' ======= variables globales utilisées par les procédures ================= 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é end_sub
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 if DoKGF%>0 res% = dll_call6("DefineSprite",nsprite%,x%,y%,200,200,adr(nam$)) res% = dll_call3("ChangeSpriteOptions",nsprite%,1,dur%) end_if 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 if DoKGF%>0 res% = dll_call6("DefineSprite",nsprite%,x%,y%,200,200,adr(nam$)) res% = dll_call3("ChangeSpriteOptions",nsprite%,1,dur%) res% = dll_call2("SetSpriteTunes",nsprite%,object_internal(dl%)) end_if
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 DoKGF%>0 res% = dll_call6("DefineSprite",nsprite%,x%,y%,200,200,adr(nam$)) res% = dll_call3("ChangeSpriteOptions",nsprite%,1,sprites(n%,3)) end_if 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 if DoKGF%>0 res% = dll_call2("CopySpriteTunes",nsprite%,n%) end_if 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 DoKGF%=1 then res% = dll_call5("ChangeSpriteGeometry",n%,sprites(n%,4),sprites(n%,5),sprites(n%,0),sprites(n%,1)) 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 if DoKGF%=1 then res% = dll_call5("ChangeSpriteGeometry",n%,sprites(n%,4),sprites(n%,5),sprites(n%,0),sprites(n%,1)) 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 if DoKGF%=1 then res% = dll_call5("ChangeSpriteGeometry",n%,sprites(n%,4),sprites(n%,5),sprites(n%,0),sprites(n%,1)) 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 if DoKGF%=1 then res% = dll_call5("ChangeSpriteGeometry",n%,sprites(n%,4),sprites(n%,5),sprites(n%,0),sprites(n%,1)) 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" if DoKGF%=1 then res% = dll_call3("ChangeSpriteOptions",n%,0,sprites(n%,3)) 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" if DoKGF%=1 then res% = dll_call3("ChangeSpriteOptions",n%,1,sprites(n%,3)) 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" ? if DoKGF%=1 res% = dll_call6("CheckSpriteCollision",n%,dir%,adr(sprite_collision%),adr(sprite_collision_mobile%),adr(tune_collision%),adr(tune_collision_mobile%)) exit_sub end_if 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 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 : 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 (ys%+hs)>=y% : ' 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 : 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
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 Je n'ai pas le temps ce soir de regarder ton code de façon approfondie - je pourrai peut-être le faire demain. Mais la démo ci-dessus prouve que la détection marche bien pour les sprites sans tunes... En ce qui concerne les variables, je vais regarder cela - tu auras de mes nouvelles. | |
| | | 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 Sam 13 Juin 2015 - 6:37 | |
| | |
| | | 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 Sam 13 Juin 2015 - 9:57 | |
| Ah, je n'avais pas pensé à ce coup-là ! Voici donc une version des SUB avec paramétrage de la taille des sprites. J'ai également revu la procédure de définition de variables pour y inclure les quelques variables qui servent dans la procédure, en vue du #INCLUDE. - Code:
-
' 2d_utilities.bas
' res% = dll_call6("DefineSprite",ns%,x%,y%,w%,h%,adr(nom$)) ' res% = dll_call5("ChangeSpriteGeometry",ns%,x%,y%,w%,h%) ' res% = dll_call3("ChangeSpriteOptions",ns%,v%,s%) ' res% = dll_call2("SetSpriteTunes",ns%,object_internal(dl)) ' res% = dll_call2("CopySpriteTunes",ns%,nsorg%) ' res% = dll_call6("CheckSpriteCollision",ns%,dir%,adr(sc%),adr(scm%),adr(tc%),adr(tcm%))
label clic, key, close0
' ====== variables de configuration ======================================== 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% = 1 : ' 0=carré bleu impénétrable : ' 1=Android impénétrable dim trace% : trace% = 0 : ' mettre 1 pour afficher une trace des calculs dim DoKGF% : DoKGF% = 0 : ' effectuer le travail par des fonctions KGF.dll
' ======= variables diverses pour le programme de démo ==================== dim i%, j%, d%, dx%, dy%, s$, sm$, direct1%, direct2%, dx2%, dy2% ' ===================== fin des variables =================================== variables_pour_sprites() : ' déclarer les variables globales pour les SUBs
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 DoKGF%>0 then dll_on "KGF.dll"
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,200,200,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,200,200,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,200,200,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,200,200,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,200,200,180,11,0)
copier_sprite("Android initialement fixe copié",1,800,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: direct1% = 0 direct2% = 0 d% = key_down_code if (d%=37) or (d%=100) : ' gauche dx% = 0 - 1 dy% = 0 direct1% = 1 end_if if (d%=38) or (d%=104) : ' haut dx% = 0 dy% = 0 - 1 direct1% = 2 end_if if (d%=39) or (d%=102) : ' droite dx% = 1 dy% = 0 direct1% = 3 end_if if (d%=40) or (d%=98) : ' bas dx% = 0 dy% = 1 direct1% = 4 end_if if (d%=33) or (d%=105) : ' haut droite dx% = 0 dy% = 0 - 1 direct1% = 2 dx2% = 1 dy2% = 0 direct2% = 3 end_if if (d%=34) or (d%=99) : ' bas droite dx% = 0 dy% = 1 direct1% = 4 dx2% = 1 dy2% = 0 direct2% = 3 end_if if (d%=35) or (d%=97) : ' bas gauche dx% = 0 dy% = 1 direct1% = 4 dx2% = 0 - 1 dy2% = 0 direct2% = 1 end_if if (d%=36) or (d%=103) : ' haut gauche dx% = 0 dy% = 0 - 1 direct1% = 2 dx2% = 0 - 1 dy2% = 0 direct2% = 1 end_if
if direct1%=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%,direct1%) : ' 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 if direct2%>0 : ' test si déplacement en diagonale deplacer_sprite(sprite_mobile%,1,dx2%,dy2%) : ' déplacement relatif tester_si_collision(sprite_mobile%,direct2%) : ' 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
end_if : ' fin test déplacement en diagonale 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 variables_pour_sprites() ' ======= variables globales utilisées par les procédures ================= 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 images$ : ' nom de dossier temporaire pour copier les images des sprites dim scene_2d% : ' numéro d'objet du scene2d dim resx% : ' variable de résltat pour les fonctions dfe KGF.dll end_sub
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%,w%,h%,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) = w% : ' mémoriser sa largeur sprites(nsprite%,1) = h% : ' 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 if DoKGF%>0 resx% = dll_call6("DefineSprite",nsprite%,x%,y%,200,200,adr(nam$)) resx% = dll_call3("ChangeSpriteOptions",nsprite%,1,dur%) end_if display end_sub
sub creer_sprite_avec_tunes(nam$,x%,y%,w%,h%,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) = w% : ' mémoriser sa largeur sprites(nsprite%,1) = h% : ' 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 if DoKGF%>0 resx% = dll_call6("DefineSprite",nsprite%,x%,y%,200,200,adr(nam$)) resx% = dll_call3("ChangeSpriteOptions",nsprite%,1,dur%) resx% = dll_call2("SetSpriteTunes",nsprite%,object_internal(dl%)) end_if
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 DoKGF%>0 resx% = dll_call6("DefineSprite",nsprite%,x%,y%,200,200,adr(nam$)) resx% = dll_call3("ChangeSpriteOptions",nsprite%,1,sprites(n%,3)) end_if 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 if DoKGF%>0 resx% = dll_call2("CopySpriteTunes",nsprite%,n%) end_if 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 DoKGF%=1 then resx% = dll_call5("ChangeSpriteGeometry",n%,sprites(n%,4),sprites(n%,5),sprites(n%,0),sprites(n%,1)) 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 if DoKGF%=1 then resx% = dll_call5("ChangeSpriteGeometry",n%,sprites(n%,4),sprites(n%,5),sprites(n%,0),sprites(n%,1)) 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 if DoKGF%=1 then resx% = dll_call5("ChangeSpriteGeometry",n%,sprites(n%,4),sprites(n%,5),sprites(n%,0),sprites(n%,1)) 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 if DoKGF%=1 then resx% = dll_call5("ChangeSpriteGeometry",n%,sprites(n%,4),sprites(n%,5),sprites(n%,0),sprites(n%,1)) 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" if DoKGF%=1 then resx% = dll_call3("ChangeSpriteOptions",n%,0,sprites(n%,3)) 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" if DoKGF%=1 then resx% = dll_call3("ChangeSpriteOptions",n%,1,sprites(n%,3)) 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 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" ? if DoKGF%=1 res%x = dll_call6("CheckSpriteCollision",n%,dir%,adr(sprite_collision%),adr(sprite_collision_mobile%),adr(tune_collision%),adr(tune_collision_mobile%)) if res%x=1 message str$(sprite_collision%)+"/"+str$(tune_collision%)+"<->"+str$(sprite_collision_mobile%)+"/"+str$(tune_collision_mobile%)
end_if exit_sub end_if 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 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 : 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 (ys%+hs)>=y% : ' 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 : 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
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 | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Des procédures pour la 2D Sam 13 Juin 2015 - 10:17 | |
| Là on peut dire que l'on a un beau jeu de procédure pour faire fonctionner les sprites avec la version actuelle de Panoramic. Plus qu'à voir après éventuellement si on peut encore optimiser le code pour quand il y a beaucoup de sprites, mais c'est déjà tout a fait satisfaisant pour une utilisation standard. | |
| | | 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 Sam 13 Juin 2015 - 13:27 | |
| @Klaus, pour le moment, ça marche super bien.
J' envisage de choisir un sprite (mobile et sans tune, pour le moment), en fonction de la touche du clavier qui a été appuyée. EX: l'appuis sur la flèche droite, ce qui charge le sprite orienté vers la droite, fait le déplacement et teste les éventuelles collisions. Bien sûr je dois avoir préalablement crée le sprite orienté vers la droite. Je vois bien qu'il faut modifier le sous-programme clic pour changer l'image en fonction de la touche enfoncée.
Mon idée serait d'avoir: 1) dans sous-programme clic une détection du choix du programmeur (avec changement d'image ou pas) 2) si oui avoir une sub qui charge le bon sprite en fonction de la touche choisie. 3) dès que la touche est relachée le sprite d'origine remplace (revient) le précédent.
Le but: si un véhicule se dirige vers le haut de l'écran, alors son image est orientée avec l'avant du véhicule vers le haut, etc....
Je te demande de me donner ton avis, mais sache que ce n'est pas pressé, ce Weekend je ne programme pas pour cause de 24h du Mans, et de toute façon je n'ai pas terminer mon check-list sur l'étude et les teste de ta production. Car mine de rien, c'est pas si simple, mais une fois compris et assimilé ça va largement simplifié le codage de jeux en 2D.
Bon Weekend. | |
| | | 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 Sam 13 Juin 2015 - 20:58 | |
| Vu que Jack a fait un éditeur pour PANGINE2D (que je ne pensais pas arriver si vite), tu as encore plus de temps devant toi, car je vais essayer PANGINE2D. Il n'en reste pas moins que tout ton travail reste utile pour les inconditionnels de Panoramic (pour la 2D).
Je ne manquerait pas de vous dire (je ne te vouvoie pas, je parle à tous) ce qui est bien et moins bien avec PANGINE2D.
A+ | |
| | | 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
| |
| |
| |