Mai 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 | 31 | | | Calendrier |
|
| | Pour découper une image en petits rectangles SANS DLL | |
|
+4Severin Jean Claude Yannick Klaus 8 participants | |
Auteur | Message |
---|
Klaus
Nombre de messages : 12301 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Pour découper une image en petits rectangles SANS DLL Mar 7 Aoû 2012 - 16:11 | |
| Je comprends bien, Bignono. Le problème n'était pas d'identifier le morceau lorsqu'on clique dessus. C'était plutot de le "coller" à la souris pour le déplacer, alors qu'il peut glisser par-dessous un autre morceau et par la même occasion perdre le focus de la souris qui était accaparé par le morceau situé en avant-plan. Le problème ne se posait pas tant qu'on déplaçait les morceaux par les flèches. Mais dès qu'il faut capter la position de la souris en continu, c'est là qu'il y a un problème. Bon, le problème est résolu par ma DLL. Et je l'ai appliqué à mon jeu Puzzle. J'ai supprimé le déplacement par les flèches. On joue maintenant de la manière suivante: - charger un puzzle par la fonction "Ouvrir" - lancer le mode "jeu" par la fonction "Jouer" à partir de maintenant: - clic gauche sur un morceau, et relâcher - le morceau est sélectionné (comme avant). Mais maintenant, il est "collé" à la souris. - déplacer la souris pour positionner le morceau à l'endroit voulu - recliquer sur le morceau pour le dé-sélectionner. Il se placera automatiquement, au pixel près, dans la case dont il est le plus proche. Lorsque le dernier morceau est à la bonne place, le programme le signale avec des félicitations. Voici le source (seulement 209 lignes) adapté à l'utilisation de MouseOperations.dll: - Code:
-
' puzzle.bas
label labels : gosub labels gosub constantes gosub variables gosub donnees gosub form0 gosub menu gosub GUI gosub initialisations end
labels: label constantes, variables, donnees, form0, menu, GUI, initialisations label open, sortir, jouer, selpic, sel0, tick return constantes: dim max_lignes% : max_lignes% = 100 dim max_colonnes% : max_colonnes% = 150 dim dll$ : dll$ = "MouseOperations.dll" return variables: ' variables techniques dim no%, no1%, no2%, i%, j%, k%, m%, n%, s$, pic$, w%, h%, f$, x%, y% dim f_jouer%, n_select%, x_mouse%, y_mouse%, hnd% ' variables mémorisant des numéros d'objet dim no_pic% : ' picture visualisé à l'écran dim no_open% : ' open_dialog dim no_jouer% : ' ligne "Jouer" dans le menu "Fichiers" dim no_detail% : ' dernier numéro d'objet AVANT les pictures de détail dim no_image% : ' image pour pouvoir copier un picture de détail dim no_transport% : ' picture pour déplacer un picture de détail dim no_timer% : ' timer pour le déplacement d'un picture de détail ' variables pour la configuration du découpage dim n_lignes%, n_colonnes% return
donnees: return
form0: full_space 0 : on_click 0,sel0 caption 0,"Résoudre un puzzle"
return
menu: no% = no% + 1 : main_menu no% : no1% = no% no% = no% + 1 : sub_menu no% : parent no%,no1% : no2% = no% caption no%,"Fichier" no% = no% + 1 : sub_menu no% : parent no%,no2% caption no%,"Ouvrir" : on_click no%,open no% = no% + 1 : sub_menu no% : parent no%,no2% caption no%,"Jouer" : on_click no%,jouer no_jouer% = no% : inactive no% no% = no% + 1 : sub_menu no% : parent no%,no2% caption no%,"----------" no% = no% + 1 : sub_menu no% : parent no%,no2% caption no%,"Sortir" : on_click no%,sortir
return
GUI: ' objets invisibles no% = no% + 1 : open_dialog no% : no_open% = no% filter no%,"Puzzle|*.txt" no% = no% + 1 : image no% : no_image% = no% no% = no% + 1 : timer no% : no_timer% = no% : timer_interval no_timer%,100 on_timer no_timer%,tick : timer_off no_timer% ' form 0 no% = no% + 1 : picture no% : no_pic% = no% : 2d_target_is no% top no%,10 : left no%,10 : on_click no%,sel0 width no%,width(0)-8-20 : height no%,height(0)-34-40 no_detail% = no% return
initialisations: n_lignes% = 5 n_colonnes% = 7 hnd% = handle(0) dll_on dll$ return sortir: terminate
open: timer_off no_timer% f_jouer% = 0 2d_target_is 0 if no%>no_detail% for i%=no_detail%+1 to no%+1 delete i% next i% color no_pic%,255,255,255 end_if pic$ = "" width no_pic%,width(0)-8-20 : height no_pic%,height(0)-34-40 s$ = file_name$(no_open%) if s$="_" then return if file_extract_name$(s$)<>"puzzle_config.txt" message "Ce n'est pas un puzzle valide." return end_if f$ = file_extract_path$(s$) file_open_read 1,s$ file_readln 1,pic$ caption 0,"Résoudre le puzzle "+pic$ file_readln 1,s$ i% = instr(s$," ") w% = val(left$(s$,i%-1)) file_readln 1,s$ i% = instr(s$," ") h% = val(left$(s$,i%-1)) file_readln 1,s$ i% = instr(s$," ") n_lignes% = val(left$(s$,i%-1)) file_readln 1,s$ i% = instr(s$," ") n_colonnes% = val(left$(s$,i%-1)) file_close 1 no% = no_detail% n% = int(h%/n_lignes% + 0.5) m% = int(w%/n_colonnes% + 0.5) color no_pic%,0,0,0 2d_target_is no_pic% 2d_rectangle 0,0,w%,h% for i%=1 to n_lignes% for j%=1 to n_colonnes% s$ = f$ + "puzzle_"+str$(i%)+"_"+str$(j%)+".bmp" no% = no% + 1 : picture no% : width no%,m% : height no%,n% left no%,10 + int(rnd(width(no_pic%)-m%)) top no%,10 + int(rnd(height(no_pic%)-n%)) file_load no%,s$ : on_click no%,selpic next j% next i% no_transport% = no% + 1 : picture no_transport% : hide no_transport% width no_transport%,m% : height no_transport%,n% on_click no_transport%,selpic active no_jouer% return
jouer: inactive no_jouer% f_jouer% = 1 return selpic: timer_off no_timer% if n_select%>0 left n_select%,left(no_transport%) top n_select%,top(no_transport%) show n_select% : hide no_transport% if number_click=no_transport% top n_select%,int(top(n_select%)/n%+0.5)*n% +10 left n_select%,int(left(n_select%)/m%+0.5)*m% +10 x% = 0 for i%=1 to n_lignes% for j%=1 to n_colonnes% k% = no_detail% + (i%-1)*n_lignes% + j% if (left(k%)<>(10+(j%-1)*m%)) then x% = 1 if (top(k%)<>(10+(i%-1)*n%)) then x% = 1 next j% next i% if x%=0 off_key_down 0 message "BRAVO ! Vous avez reconstitué le puzzle !" return end_if n_select% = 0 return end_if end_if n_select% = number_click i% = dll_call3("GetMousePosition",hnd%,adr(x_mouse%),adr(y_mouse%)) 2d_target_is n_select% 2d_image_copy no_image%,0,0,m%-1,n%-1 2d_target_is no_transport% 2d_image_paste no_image%,0,0 left no_transport%,left(n_select%) top no_transport%,top(n_select%) show no_transport% : hide n_select% timer_on no_timer% return sel0: timer_off no_timer% left n_select%,left(no_transport%) top n_select%,top(no_transport%) show n_select% : hide no_transport% n_select% = 0 return
tick: timer_off no_timer% i% = dll_call3("GetMousePosition",hnd%,adr(x%),adr(y%)) if x%<0 then return left no_transport%,x% - x_mouse% + left(no_transport%) top no_transport%,y% - y_mouse% + top(no_transport%) x_mouse% = x% y_mouse% = y% timer_on no_timer% return | |
| | | Klaus
Nombre de messages : 12301 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Pour découper une image en petits rectangles SANS DLL Mar 7 Aoû 2012 - 18:59 | |
| Une autre application des fonctions DLL permettant de gérer la position de la souris: déplacer des objets Panoramic par la souris en cours d'exécution ! En effet, ce qui est possible pour les picture contenant des morceaux de puzzle, doit être possible pour d'autres objets ! J'ai donc fait un programme avec un bouton qui permet de passer du mode "Normal" en mode "Mobile" et inversement. Et il y a 3 objets: un EDIT, un MEMO et un PICTURE. En mode normal, un clic dans un de ces objets affiche juste un message en guise de traitement. Mais en mode Mobile, l'objet reste collé à la souris et on peut le placer où on veut, pour le fixer par un autre clic dans l'objet. Essayez-le, c'est bluffant. - Code:
-
' test_move_objects.bas
label labels : gosub labels gosub constantes gosub variables gosub donnees gosub form0 gosub menu gosub GUI gosub initialisations end
labels: label constantes, variables, donnees, form0, menu, GUI, initialisations label sel, tick, clic_mode, clic_edit, clic_memo, clic_picture return constantes: dim dll$ : dll$ = "MouseOperations.dll" return variables: ' variables techniques dim no%, no1%, no2%, i%, j%, k%, m%, n%, s$, pic$, w%, h%, f$, x%, y% dim n_select%, x_mouse%, y_mouse%, hnd%, f_mode% ' variables mémorisant des numéros d'objet dim no_timer% : ' timer pour le déplacement d'un picture de détail return
donnees: return
form0: return
menu: return
GUI: ' objets invisibles no% = no% + 1 : timer no% : no_timer% = no% : timer_interval no_timer%,100 on_timer no_timer%,tick : timer_off no_timer% ' form 0 no% = no% + 1 : button no% : caption no%,"Mode Mobile" on_click no%,clic_mode no% = no% + 1 : edit no% : top no%,30 : left no%,10 on_click no%,clic_edit no% = no% + 1 : memo no% : top no%,60 : left no%,10 on_click no%,clic_memo no% = no% + 1 : picture no% : top no%,30 : left no%,200 on_click no%,clic_picture : color no%,255,0,0 return
initialisations: hnd% = handle(0) dll_on dll$ return clic_mode: f_mode% = 1 - f_mode% if f_mode%=0 caption number_click,"Mode Mobile" else caption number_click,"Mode Normal" end_if return clic_edit: if f_mode%=1 then goto sel message "Clic normal dans EDIT" return
clic_memo: if f_mode%=1 then goto sel message "Clic normal dans MEMO" return
clic_picture: if f_mode%=1 then goto sel message "Clic normal dans PICTURE" return
sel: timer_off no_timer% if n_select%=number_click then return n_select% = number_click i% = dll_call3("GetMousePosition",hnd%,adr(x_mouse%),adr(y_mouse%)) timer_on no_timer% return tick: timer_off no_timer% i% = dll_call3("GetMousePosition",hnd%,adr(x%),adr(y%)) if x%<0 then return left n_select%,x% - x_mouse% + left(n_select%) top n_select%,y% - y_mouse% + top(n_select%) x_mouse% = x% y_mouse% = y% timer_on no_timer% return | |
| | | Yannick
Nombre de messages : 8611 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Mar 7 Aoû 2012 - 19:03 | |
| | |
| | | bignono
Nombre de messages : 1127 Age : 66 Localisation : Val de Marne Date d'inscription : 13/11/2011
| Sujet: Re: Pour découper une image en petits rectangles SANS DLL Mer 8 Aoû 2012 - 0:11 | |
| Bonsoir à tous, j'ai vite fait un petit code pour voir si on pouvait déplacer des picture à la souris sans perdre le focus. Comme je n'ai pas le temps, il faudrait rechercher plus avant la manière de capter le bon picture lorsqu'il sont l'un sur l'autre, mais on peut déplacer les picture où l'on veut et ils suivent le mouvement de la souris. Si on clique sur le form, c'est le dernier picture qui vient se coller à la souris. Il faut recliquer pour le lacher. Pour sélectionner un picture différents, il faut parfois cliquer plusieurs fois avant d'y parvenir. Je pense qu'en creusant dans cette direction on doit pouvoir arriver à déplacer les picture avec la souris sans l'aide d'une dll. Klaus essaye de creuser mon idée, peut-être trouveras tu la solution. - Code:
-
label deplace,deplace_pic1,deplace_pic2 dim a,xp,yp,xp1,yp1,xp2,yp2 full_space 0
picture 1:left 1,100:top 1,100:color 1,100,0,0:' on_click 1,deplace_pic1 picture 2:left 2,400:top 2,400:color 2,0,100,0:' on_click 2,deplace_pic2 timer 10:timer_interval 10,1:on_timer 10,deplace a=1 end deplace: print_locate 010,10:print mouse_x_position(0);" ";mouse_y_position(0);" " print_locate 200,10:print mouse_x_position(1);" ";mouse_y_position(1);" " print_locate 400,10:print mouse_x_position(2);" ";mouse_y_position(2);" " xp=mouse_x_position(0):yp=mouse_y_position(0) xp1=mouse_x_position(1):yp1=mouse_y_position(1) xp2=mouse_x_position(2):yp2=mouse_y_position(2) if scancode=0 then return timer_off 10 if clicked(1)=1 then a=1:xp=xp1:yp=yp1 if clicked(2)=1 then a=2:xp=xp2:yp=yp2 repeat left a,xp:top a,yp xp=mouse_x_position(0):yp=mouse_y_position(0) if clicked(a)=1 then exit_repeat until mouse_left_down(a)=1
timer_on 10 return
deplace_pic1:
return deplace_pic2:
return Bon courage à tous | |
| | | Klaus
Nombre de messages : 12301 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Pour découper une image en petits rectangles SANS DLL Mer 8 Aoû 2012 - 0:57 | |
| J'ai essayé, mais ton identification du picture visé est aléatoire. Tu peux faire cela simplement en utilisant NUMBER_CLICK qui te donne directement le dernier objet cliqué. Et tu fais le déplacement dans une boucle repeat à l'intérieur de la routine du timer. et tu as un conflit entre clicked(a) et mouse_left_down(a): si tu as cliqué sur le picture, la fonctioin clicked doit retourner 1 et tu sors. Mais si tu n'as pas cliqué sur ce picture, la fonction mouse_left_down ne peut pas sortir...
Regarde le programme que j'ai posté juste avant toi - certes, c'est fait avec une DLL, mais c'est la solution exacte du problème. Quelque soit le moyen, tu ne peux pas obtenir une solution complète en Panoramic, pour les raisons précises que j'ai exposées auparavant. Mouse_x_position et Mouse_y_position ne permettent pas de savoir si le curseur est dedans ou pas, au niveau d'un survol. D'ailleurs, aucune fonction de Panoramic ne permet de savoir cela. Or, avec un picture qui glisse sous un autre, les coordonnées retournées par ces fonctions ne correspondent plus à la réalité, et de ce fait, il y a des mouvements erratiques en résultat. | |
| | | Yannick
Nombre de messages : 8611 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: une petite précision svp ? Lun 20 Aoû 2012 - 0:26 | |
| @ Klaus,
comment fais tu pour récupérer les dimensions de l'image ? j'ai du mal à comprendre. width() et height() renvoi les dimensions du picture mais pas de l'image chargé dedans, si elle est plus grande que le picture, les dimensions devraient être faussées...non ?
| |
| | | Klaus
Nombre de messages : 12301 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Pour découper une image en petits rectangles SANS DLL Lun 20 Aoû 2012 - 0:42 | |
| C'est simple. J' déclare mon picture très grand, sans stretch_on. Je charge une image avec file_load, puis je fais ceci:* - Code:
-
2d_flood width(no_pic%)-1,height(no_pic%)-1,0,0,0 Donc, l'excédent du picture à droite et en bas est rempli de noir. Il ne reste plus qu'à regarder de droite à gauche jusqu'au premier pixel non-noir pour avoir la vraie largeur, et pareil de bas en haut pour avoir la hauteur. Deux remarques: 1. dans mon programme, je dimensionne le picture de sorte qu'il tienne dans l'écran full_space. Pour pouvoir gérer des photos qui sont souvent plus grandes, il vaut mieux choisir des valeurs plus grandes pour width et height du picture. 2. j'ai fait la supposition que les images que je traite, n'ont pas de noir à droite et en bas. Si tel est le cas, il faut changer la couleur du 2d_flood. Tu peux par exemple faire la recherche 3 fois, avec noir, blanc et une couleur quelconque, puis prendre la plus grande des valeurs trouvées à chaque passe pour largeur et hauteur. | |
| | | Yannick
Nombre de messages : 8611 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Lun 20 Aoû 2012 - 0:52 | |
| je vais voir celà de près, de très près... c'est peut être une demande que je vais faire çà , une commande Picture_width(N) et Picture_Height(N) mais je pense que çà doit être possible par extraction aussi puisque quand on sélectionne une image dans un dossier, les dimensions sont dans le tag. Merci pour l'astuce Klaus. | |
| | | Contenu sponsorisé
| Sujet: Re: Pour découper une image en petits rectangles SANS DLL | |
| |
| | | | Pour découper une image en petits rectangles SANS DLL | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |