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 |
|
|
| Construire un masque pour les sprites | |
| | |
Auteur | Message |
---|
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Construire un masque pour les sprites Lun 25 Mai 2015 - 9:56 | |
| En lien avec une discussion sur la détection des collisions entre sprites dans un scene2d, j'ai fait un utilitaire build_sprite_mask.bas. Il prend en entrée une image BMP en format 200x200, construit un masque blanc/noir à partir de cette image, puis permet de définir des zones rectangulaires de contact nommées tunes) jusqu'à un maximum de 63 zones par image. L'ensemble de ces zones se superposent au masque blanc/noir dans un second masque appelé tune qui peut être sauvegardé, comme le masque. Le programme crée simultanément un fichier texte contenant la définition de tous les rectangles tune, avec une ligne par tune dans le format n,x0,y0,x1,y1, n étant le numéro du tune (1, 2, ...). Les tunes ont des couleurs dérivées du jaune: 255,255,n*4, afin de pouvoir les différencier par programme (visuellement, c'est difficile, mais inutile). Ainsi, un programme utilisant une détection de collisions par masque, pourra utiliser le fichier tune avec les règles suivantes, pour chaque couleur RGB de pixel rencontrée: (0,0,0) = zone transparente, pas de contact (255,255,255) = contact, zone non différenciée (pas de tune) (255,255,t) ) zone de contact différenciée, le numéro du tube est t/4 Autre solution: un programme utilisant la détection par zones rectangulaires, pourra utiliser la liste des tunes dans le fichier texte pour identifier un rectangle de contact. A partir d'un nom de fichier contenant l'image du sprite (obligatoirement *.bmp), le programme construit les noms de fichiers suivants: xxx.bmp xxx_mask.bmp xxx_mask_tuned.bmp xxx_mask_tuned_list.txt Les noms contiennent directement le sens du fichier concerné. Après le chargement d'une image, on a un bouton "Build mask" qui construit le masque et met les tunes à zéro. On a alors un bouton "Rectangle" qui s'affiche. Un clic sur ce bouton affiche un cadre en fil rouge sur le masque, ainsi qu'une série de boutons permettant de "piloter" le cadre. On peut le déplacer, l'agrandir et/ou réduire en hauteur et/ou largeur. Un bouton "Tune" valide la position actuelle du cadre comme un nouveau tune qui s'affiche alors dans une image à côté. On peut ainsi constituer jusqu'à 63 tunes. Les boutons "Save mask" et "Save tune" font ce qu'ils disent, sachant que "Save mask" sauvegarde également les tunes et la liste, et "Save tune" sauvegarde également la liste. Voici le programme, très court: - Code:
-
' build_sprite_mask.bas
label build, load, loadm, savem, savet, rect, tune label enlargeup, moveup, moveleft, enlargeleft, moveright, reduceright, movedown, reducedown
dim s$, f$, fm$, ft$, fl$, w%, h%, x%, y%, toprow%, bottomrow%, leftcol%, rightcol%, ntune%
width 0,1000 : height 0,600
picture 1 : top 1,10 : left 1, 10 : width 1,200 : height 1,200 picture 2 : top 2,10 : left 2,350 : width 2,200 : height 2,200 picture 3 : top 3,10 : left 3,560 : width 3,200 : height 3,200
image 41 dlist 42
button 10 : top 10,90 : left 10,240 : caption 10,"Build mask" : on_click 10,build button 11 : top 11,220 : left 11,50 : caption 11,"Load image" : on_click 11,load button 12 : top 12,220 : left 12,390 : caption 12,"Load mask" : on_click 12,loadm button 13 : top 13,250 : left 13,390 : caption 13,"Save mask" : on_click 13,savem button 15 : top 15,250 : left 15,600 : caption 15,"Save tune" : on_click 15,savet
button 52 : top 52,310 : left 52,390 : caption 52,"Move ^" : on_click 52,moveup : hide 52 button 51 : top 51,340 : left 51,390 : caption 51,"Enlarge ^" : on_click 51,enlargeup : hide 51 button 50 : top 50,370 : left 50,370 : caption 50,"Rectangle" : on_click 50,rect : hide 50 : width 50,60 button 59 : top 59,370 : left 59,430 : caption 59,"Tune" : on_click 59,tune : hide 59 : width 59,60 button 54 : top 54,370 : left 54,290 : caption 54,"Enlarge <" : on_click 54,enlargeleft : hide 54 button 53 : top 53,370 : left 53,210 : caption 53,"Move <" : on_click 53,moveleft : hide 53 button 55 : top 55,370 : left 55,500 : caption 55,"Reduce >" : on_click 55,reduceright : hide 55 button 56 : top 56,370 : left 56,580 : caption 56,"Move >" : on_click 56,moveright : hide 56 button 57 : top 57,430 : left 57,390 : caption 57,"Move v" : on_click 57,movedown : hide 57 button 58 : top 58,400 : left 58,390 : caption 58,"Reduce v" : on_click 58,reducedown : hide 58
open_dialog 20 : filter 20,"*.bmp|*.bmp" save_dialog 21 : filter 21,"*.bmp|*.bmp" alpha 31 : top 31,120 : left 31,230 alpha 32 : top 32,220 : left 32,600 : caption 32,"Tunes: 0"
w% = width(1) h% = height(1)
end
build: caption 31,"Wait please..." display 2d_target_is 2 for y%=0 to h% for x%=0 to w% if (color_pixel_red(1,x%,y%)=0) and (color_pixel_green(1,x%,y%)=0) and (color_pixel_blue(1,x%,y%)=0) 2d_pen_color 0,0,0 else 2d_pen_color 255,255,255 end_if 2d_point x%,y% next x% caption 31,"Wait please... "+str$(int(y%*100/200))+" %" display next y% 2d_image_copy 41,0,0,200,200 2d_target_is 3 2d_image_paste 41,0,0 2d_target_is 2 show 50 : hide 51 : hide 52 : hide 53 : hide 54 : hide 55 : hide 56 : hide 57 : hide 58 : hide 59 ntune% = 0 caption 32,"Tunes: "+str$(ntune%) clear 42 caption 31,"" return load: s$ = file_name$(20) if s$="_" then return if lower$(right$(s$,4))<>".bmp" then s$ = s$ + bmp if (instr(s$,"_mask.bmp")>0) or (instr(s$,"_tuned.bmp")>0) or (instr(s$,"_list.txt")>0) message "Invalid image file name format" return end_if f$ = s$ fm$ = left$(f$,len(f$)-4)+"_mask.bmp" ft$ = left$(fm$,len(fm$)-4)+"_tuned.bmp" fl$ = left$(fm$,len(fm$)-4)+"_tuned_list.txt" file_load 1,f$ if file_exists(fm$)=1 file_load 2,fm$ if file_exists(ft$)=1 file_load 3,ft$ if file_exists(fl$)=1 file_load 42,fl$ else clear 42 end_if else color 3,255,255,255 clear 42 end_if else color 2,255,255,255 color 3,255,255,255 clear 42 end_if ntune% = count(42) caption 32,"Tunes: "+str$(ntune%) hide 50 : hide 51 : hide 52 : hide 53 : hide 54 : hide 55 : hide 56 : hide 57 : hide 58 : hide 59 return loadm: s$ = file_name$(20) if s$="_" then return if right$(s$,4)<>".bmp" then s$ = s$ + ".bmp" if right$(s$,9)<>"_mask.bmp" message "Invalid mask file name format" return end_if if file_exists(s$)=0 message "Masl file not found" return end_if f$ = left$(s$,len(s$)-9) + ".bmp" fm$ = s$ ft$ = left$(fm$,len(s$)-4)+"_tuned.bmp" fl$ = left$(fm$,len(s$)-4)+"_tuned_list.txt" file_load 2,fm$ if file_exists(ft$)=1 file_load 3,ft$ if file_exists(fl$)=1 file_load 42,fl$ ntune% = count(42) else clear 42 ntune% = 0 end_if else 2d_target_is 2 2d_image_copy 41,0,0,200,200 2d_target_is 3 2d_image_paste 41,0,0 ntune% = 0 clear 42 end_if caption 32,"Tunes: "+str$(ntune%) 2d_target_is 2 show 50 : hide 51 : hide 52 : hide 53 : hide 54 : hide 55 : hide 56 : hide 57 : hide 58 : hide 59 return
savem: if file_exists(fm$)=1 if message_confirmation_yes_no("File does already exist. Replace it ?")<>1 then return end_if file_save 2,fm$ file_save 3,ft$ file_save 42,fl$ s$ = "mask saved into: "+fm$+chr$(13)+chr$(10) s$ = s$ + "tuned mask saved into: "+ft$+chr$(13)+chr$(10) s$ = s$ + "tuned list saved into: "+fl$ message s$ return savet: if file_exists(ft$)=1 if message_confirmation_yes_no("File does already exist. Replace it ?")<>1 then return end_if file_save 3,ft$ file_save 42,fl$ s$ = "tuned mask saved into: "+ft$+chr$(13)+chr$(10) s$ = s$ + "tuned list saved into: "+fl$ message s$ return
rect: 2d_image_paste 41,0,0 toprow% = 50 bottomrow% = 150 leftcol% = 50 rightcol% = 150 2d_pen_color 255,0,0 2d_fill_off 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% show 51 : show 52 : show 53 : show 54 : show 55 : show 56 : show 57 : show 58 : show 59 return
enlargeup: if toprow%=0 then return toprow% = toprow% - 1 2d_image_paste 41,0,0 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% return moveup: if toprow%=0 then return toprow% = toprow% - 1 bottomrow% = bottomrow% - 1 2d_image_paste 41,0,0 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% return
moveleft: if leftcol%=0 then return leftcol% = leftcol% - 1 rightcol% = rightcol% - 1 2d_image_paste 41,0,0 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% return
enlargeleft: if leftcol%=0 then return leftcol% = leftcol% - 1 2d_image_paste 41,0,0 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% return
moveright: if rightcol%=w% then return rightcol% = rightcol% + 1 leftcol% = leftcol% + 1 2d_image_paste 41,0,0 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% return
reduceright: if rightcol%=leftcol% then return rightcol% = rightcol% - 1 2d_image_paste 41,0,0 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% return
reducedown: if bottomrow%=toprow% then return bottomrow% = bottomrow% - 1 2d_image_paste 41,0,0 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% return
movedown: if bottomrow%=H% then return bottomrow% = bottomrow% + 1 toprow% = toprow% + 1 2d_image_paste 41,0,0 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% return
tune: if ntune%>=63 message "Too many tune sections" return end_if ntune% = ntune% + 1 item_add 42,str$(ntune%)+","+str$(leftcol%)+","+str$(toprow%)+","+str$(rightcol%)+","+str$(bottomrow%) 2d_target_is 3 2d_fill_on 2d_fill_color 255,255,ntune%*4 2d_pen_color 255,255,ntune%*4 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% 2d_target_is 2 2d_pen_color 255,0,0 2d_fill_off caption 32,"Tunes: "+str$(ntune%) return
Et, pour la démo, voici une image 200x200 pixels: Android.bmp Voici le masque résultant: Android_mask.bmp Voici le tune résultant: Android_mask_tuned.bmp Et voici la liste des tunes générés: Android_mask_tuned_list.txt - Citation :
- 1,43,0,159,69
2,23,67,64,140 3,140,67,181,136 4,51,131,96,200 5,111,131,152,197
Installez tous ces fichiers dans un même dossier, chargez Android.bmp dans l'image de gauche, et admirez le résultat. Ou construisez vos propres masques, et éventuellement leurs tunes... | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Construire un masque pour les sprites Lun 25 Mai 2015 - 10:50 | |
| C'est génial Klaus, je teste ça ce soir.
Pour la gestion avancée des sprites c'est carrément pratique. Une fois que j'aurais testé Klaus, tu m'autorises à en parler dans mon article volet 2 sur les collisions ? Ca va me simplifier les choses et avec un peu de chance, si tout le monde adopte le système, ca va standardiser la façon de faire.
Je pense que de mon côté, je ferais une banque de sprites avec les infos.
Ca va peut être relancer l'usage des sprites et des jeux à base de sprites. Je pense à un des premiers jeux que j'avais repris de type Galaxian. j'essaierais bien de le refaire avec la gestion de colision que tu viens de mettre en place et les procédures qui n'existaient pas à l'époque. Je pense que le listing pourra être beaucoup plus clair et j'espère aussi pouvoir un peu optimiser le jeu car à l'époque c'était quand même assez lent et la vitesse variée en fonction du nombre de sprites qui restaient. Mais c'était un de mes premiers essais après un jeux de tir entre un Xwing et des Tie fighters. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Construire un masque pour les sprites Lun 25 Mai 2015 - 10:58 | |
| Mais bien sûr, Jicehel ! Ca me fera plaisir ! Comme tu le sais bien, absolument tous mes sources sont libres pour tous et pour tous les usages? Plus il y a d'utilisateurs, même sous forme de modification, extrait, clône ou autre dérivé, plus je serai content. Alors, n'hésite pas ! | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Construire un masque pour les sprites Lun 25 Mai 2015 - 11:01 | |
| Merci Klaus. Je me doutais de ta réponse, mais par principe, je préfère demander confirmation. J'inclurais tes procédures de gestion des sprites quand tu les auras mises à jour de manière à pousser un peu cette méthode de gestion. J'essayerais de faire quelques sprties et de les mettre dans une banque avec les infos de sorte que l'on puisse facilement piocher dedans pour fabriquer des jeux sans avoir besoin de refaire les masques ou les fichiers d'informations (au début, il n'y en aura pas bcp, mais ça devrait grossir avec le temps).
Dernière édition par Jicehel le Mer 27 Mai 2015 - 11:01, édité 1 fois | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Construire un masque pour les sprites Mer 27 Mai 2015 - 10:57 | |
| Voici une nouvelle version du programme de construction de masque et de tunes. On peut maintenant saisir un nom pour chaque tune, avant de le valider par le bouton "Tune". Il sera mémorisé dans le fichier xxx_mask_tuned_list.txt, sous forme d'un paramètre supplémentaire. Mon programme de détection l'utilise pour afficher le nom du tune touché - c'est plus parlant qu'un simple numéro. Si un tune sans nom est touché, son nom par défaut est "Tune x" avec x étant le numéro du tune. Voici le code: - Code:
-
' build_sprite_mask.bas
label build, load, loadm, savem, savet, rect, tune label enlargeup, moveup, moveleft, enlargeleft, moveright, reduceright, movedown, reducedown
dim s$, f$, fm$, ft$, fl$, w%, h%, x%, y%, toprow%, bottomrow%, leftcol%, rightcol%, ntune%
width 0,1000 : height 0,600
picture 1 : top 1,10 : left 1, 10 : width 1,200 : height 1,200 picture 2 : top 2,10 : left 2,350 : width 2,200 : height 2,200 picture 3 : top 3,10 : left 3,560 : width 3,200 : height 3,200
image 41 dlist 42
button 10 : top 10,90 : left 10,240 : caption 10,"Build mask" : on_click 10,build button 11 : top 11,220 : left 11,50 : caption 11,"Load image" : on_click 11,load button 12 : top 12,220 : left 12,390 : caption 12,"Load mask" : on_click 12,loadm button 13 : top 13,250 : left 13,390 : caption 13,"Save mask" : on_click 13,savem button 15 : top 15,250 : left 15,600 : caption 15,"Save tune" : on_click 15,savet
button 52 : top 52,310 : left 52,390 : caption 52,"Move ^" : on_click 52,moveup : hide 52 button 51 : top 51,340 : left 51,390 : caption 51,"Enlarge ^" : on_click 51,enlargeup : hide 51 button 50 : top 50,370 : left 50,370 : caption 50,"Rectangle" : on_click 50,rect : hide 50 : width 50,60 button 59 : top 59,370 : left 59,430 : caption 59,"Tune" : on_click 59,tune : hide 59 : width 59,60 button 54 : top 54,370 : left 54,290 : caption 54,"Enlarge <" : on_click 54,enlargeleft : hide 54 button 53 : top 53,370 : left 53,210 : caption 53,"Move <" : on_click 53,moveleft : hide 53 button 55 : top 55,370 : left 55,500 : caption 55,"Reduce >" : on_click 55,reduceright : hide 55 button 56 : top 56,370 : left 56,580 : caption 56,"Move >" : on_click 56,moveright : hide 56 button 57 : top 57,430 : left 57,390 : caption 57,"Move v" : on_click 57,movedown : hide 57 button 58 : top 58,400 : left 58,390 : caption 58,"Reduce v" : on_click 58,reducedown : hide 58
open_dialog 20 : filter 20,"*.bmp|*.bmp" save_dialog 21 : filter 21,"*.bmp|*.bmp" alpha 31 : top 31,120 : left 31,230 alpha 32 : top 32,220 : left 32,600 : caption 32,"Tunes: 0" alpha 33 : top 33,430 : left 33,550 : caption 33,"Tune name:" : hide 33 edit 34 : top 34,430 : left 34,620 : width 34,150 : hide 34
w% = width(1) h% = height(1)
end
build: caption 31,"Wait please..." display 2d_target_is 2 for y%=0 to h% for x%=0 to w% if (color_pixel_red(1,x%,y%)=0) and (color_pixel_green(1,x%,y%)=0) and (color_pixel_blue(1,x%,y%)=0) 2d_pen_color 0,0,0 else 2d_pen_color 255,255,255 end_if 2d_point x%,y% next x% caption 31,"Wait please... "+str$(int(y%*100/200))+" %" display next y% 2d_image_copy 41,0,0,200,200 2d_target_is 3 2d_image_paste 41,0,0 2d_target_is 2 show 50 : hide 51 : hide 52 : hide 53 : hide 54 : hide 55 : hide 56 : hide 57 : hide 58 : hide 59 hide 33 : hide 34 ntune% = 0 caption 32,"Tunes: "+str$(ntune%) clear 42 caption 31,"" return load: s$ = file_name$(20) if s$="_" then return if lower$(right$(s$,4))<>".bmp" then s$ = s$ + bmp if (instr(s$,"_mask.bmp")>0) or (instr(s$,"_tuned.bmp")>0) or (instr(s$,"_list.txt")>0) message "Invalid image file name format" return end_if f$ = s$ fm$ = left$(f$,len(f$)-4)+"_mask.bmp" ft$ = left$(fm$,len(fm$)-4)+"_tuned.bmp" fl$ = left$(fm$,len(fm$)-4)+"_tuned_list.txt" file_load 1,f$ if file_exists(fm$)=1 file_load 2,fm$ if file_exists(ft$)=1 file_load 3,ft$ if file_exists(fl$)=1 file_load 42,fl$ else clear 42 end_if else color 3,255,255,255 clear 42 end_if show 50 else color 2,255,255,255 color 3,255,255,255 clear 42 hide 50 end_if ntune% = count(42) caption 32,"Tunes: "+str$(ntune%) hide 51 : hide 52 : hide 53 : hide 54 : hide 55 : hide 56 : hide 57 : hide 58 : hide 59 hide 33 : hide 34 return loadm: s$ = file_name$(20) if s$="_" then return if right$(s$,4)<>".bmp" then s$ = s$ + ".bmp" if right$(s$,9)<>"_mask.bmp" message "Invalid mask file name format" return end_if if file_exists(s$)=0 message "Masl file not found" return end_if f$ = left$(s$,len(s$)-9) + ".bmp" fm$ = s$ ft$ = left$(fm$,len(s$)-4)+"_tuned.bmp" fl$ = left$(fm$,len(s$)-4)+"_tuned_list.txt" file_load 2,fm$ if file_exists(ft$)=1 file_load 3,ft$ if file_exists(fl$)=1 file_load 42,fl$ ntune% = count(42) else clear 42 ntune% = 0 end_if else 2d_target_is 2 2d_image_copy 41,0,0,200,200 2d_target_is 3 2d_image_paste 41,0,0 ntune% = 0 clear 42 end_if caption 32,"Tunes: "+str$(ntune%) 2d_target_is 2 show 50 : hide 51 : hide 52 : hide 53 : hide 54 : hide 55 : hide 56 : hide 57 : hide 58 : hide 59 hide 33 : hide 34 return
savem: if file_exists(fm$)=1 if message_confirmation_yes_no("File does already exist. Replace it ?")<>1 then return end_if file_save 2,fm$ file_save 3,ft$ file_save 42,fl$ s$ = "mask saved into: "+fm$+chr$(13)+chr$(10) s$ = s$ + "tuned mask saved into: "+ft$+chr$(13)+chr$(10) s$ = s$ + "tuned list saved into: "+fl$ message s$ return savet: if file_exists(ft$)=1 if message_confirmation_yes_no("File does already exist. Replace it ?")<>1 then return end_if file_save 3,ft$ file_save 42,fl$ s$ = "tuned mask saved into: "+ft$+chr$(13)+chr$(10) s$ = s$ + "tuned list saved into: "+fl$ message s$ return
rect: 2d_image_paste 41,0,0 toprow% = 50 bottomrow% = 150 leftcol% = 50 rightcol% = 150 2d_pen_color 255,0,0 2d_fill_off 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% show 51 : show 52 : show 53 : show 54 : show 55 : show 56 : show 57 : show 58 : show 59 show 33 : show 34 return
enlargeup: if toprow%=0 then return toprow% = toprow% - 1 2d_image_paste 41,0,0 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% return moveup: if toprow%=0 then return toprow% = toprow% - 1 bottomrow% = bottomrow% - 1 2d_image_paste 41,0,0 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% return
moveleft: if leftcol%=0 then return leftcol% = leftcol% - 1 rightcol% = rightcol% - 1 2d_image_paste 41,0,0 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% return
enlargeleft: if leftcol%=0 then return leftcol% = leftcol% - 1 2d_image_paste 41,0,0 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% return
moveright: if rightcol%=w% then return rightcol% = rightcol% + 1 leftcol% = leftcol% + 1 2d_image_paste 41,0,0 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% return
reduceright: if rightcol%=leftcol% then return rightcol% = rightcol% - 1 2d_image_paste 41,0,0 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% return
reducedown: if bottomrow%=toprow% then return bottomrow% = bottomrow% - 1 2d_image_paste 41,0,0 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% return
movedown: if bottomrow%=H% then return bottomrow% = bottomrow% + 1 toprow% = toprow% + 1 2d_image_paste 41,0,0 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% return
tune: if ntune%>=63 message "Too many tune sections" return end_if ntune% = ntune% + 1 s$ = trim$(text$(34)) if s$="" then s$ = "Tune "+str$(ntune%) item_add 42,str$(ntune%)+","+str$(leftcol%)+","+str$(toprow%)+","+str$(rightcol%)+","+str$(bottomrow%)+","+s$ 2d_target_is 3 2d_fill_on 2d_fill_color 255,255,ntune%*4 2d_pen_color 255,255,ntune%*4 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% 2d_target_is 2 2d_pen_color 255,0,0 2d_fill_off caption 32,"Tunes: "+str$(ntune%) return
Et voici le résultat pour mon sprite Android: - Citation :
- 1,43,0,159,69,Tête
2,23,67,64,140,Bras droit 3,140,67,181,136,Bras gauche 4,51,131,96,200,Jambe droite 5,111,131,152,197,Jambe gauche
| |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Construire un masque pour les sprites Mer 27 Mai 2015 - 11:03 | |
| Oui, c'est clair que c'est plus facile pour s'y retrouver, surtout si on se fait une banque de sprite. Il est plus facile de savoir à quelle zone correspond le bras droit si on recupère le fichier texte que d'analyser les coordonnées Très bonne idée (comme d'habitude ) | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Construire un masque pour les sprites Ven 12 Juin 2015 - 8:35 | |
| @Klaus, Je suis à la découverte de ce programme, car il est nécessaire pour utiliser pleinement les procédures que tu as faites dans le sujet "sprite_show et .....". J'ai 2 pécisions à te demander (sur ta présentation en début de ce post): - Citation :
- ((255,255,t) ) zone de contact différenciée, le numéro du tube est t/4
A quoi sert cette méthode - Citation :
- Les boutons "Save mask" et "Save tune" font ce qu'ils disent, sachant que "Save mask" sauvegarde également les tunes et la liste, et "Save tune" sauvegarde également la liste.
Je ne saisi pas la différence entre les 2, la phrase n'est pas claire. A+ | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Construire un masque pour les sprites Ven 12 Juin 2015 - 9:25 | |
| - Citation :
- (255,255,t) ) zone de contact différenciée, le numéro du tube est t/4
C'est la couleur RGB que j'affecte aux pixels faisant partie d'une zone de contact. D'ailleurs, ce devrait être "tune" au lieu de "tube" - faute de frappe. Je gère jusqu'à 63 zones de contact par sprite. Avec x étant le numéro du tune (zone de contact), je donne la couleur (255,255,x*4). On simple test sur pixel_color_blue peut donner ainsi le numéro du tune. Ceci est appliqué au masque, bien sûr, pas sur l'image d'origine ! - Citation :
- Les boutons "Save mask" et "Save tune" font ce qu'ils disent, sachant que "Save mask" sauvegarde également les tunes et la liste, et "Save tune" sauvegarde également la liste.
Il y a 3 éléments: le masque qui est une bitmap, les tunes et un fichier texte contenant la définition des tunes. Le bouton "Save mask" sauvgarde le tout. Le bouton "Save tune" ne sauvegarde que les tunes et le fichier de définition, mais pas le masque. Pour mes procédures, seuls l'image d'origine et le fichier de définition sont utilisés. Le masque est généré pour ce que voulait faire Jicehel. | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Construire un masque pour les sprites Ven 12 Juin 2015 - 10:11 | |
| Merci Klaus pour ta réponse, c'est plus clair dans ma tête...
Vu la réponse qu'a fait Jack, sur le post "sprites animés....", j'ai comme l'impression que toutes les SUB(s) que tu as faites, ne sont pas prêtes de partir à la poubelle. Elle serviront pour la 2D en Panoramic.
A+ | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Construire un masque pour les sprites Ven 12 Juin 2015 - 10:26 | |
| Oui, j'ai l'impression.
Mes subs sont fonctionnelles. Mais à l'évidence, ce n'est pas un foudre de guerre s'il y a beaucoup de sprites et tunes. Et c'est normal - à chaque pixel de déplacement d'un sprite, il faut tester l'ensemble des autres sprites, avec éventuellement leurs zones de contact.
Je vais poursuivre deux pistes: 1. trouver des méthodes d'optimisation algorithmique pour améliorer les performances en Panoramic pur 2. faire des fonctions DLL pour la détection, aussi bien intégrées dans KGF.dll que dans une DLL séparée
Ainsi, j'espère venir à bout des ralentissements que les calculs de détection entraînent. | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Construire un masque pour les sprites Ven 12 Juin 2015 - 11:16 | |
| L'usage le plus approprié pour les masques de couleur ce sont les jeux de type point and click. Vous vous souvenez des jeux type "Day of the tentacule" ou "Sam et Max", "Maniac Mansion", "Indiana Jones", "Monkey Island", "Diskworld". Maintenant sur internet il y a beaucoup de jeux type inspection d'une scène où l'on doit retrouver rapidement des objets, c'est pareil, c'est du point and clic et tout a fait adapté à l'utilisation des masques.
Si l'utilisateur clique sur un élément actif quelque soit sa forme, avec les masques, c'est très simple à détecter. Sur le masque, on a jusqu'à 64 formes quand l'utilisateur clique sur l'image, on teste sur le masque à l'endroit ou il a cliqué sur l'image et on voit s'il a cliqué sur un objet actif ou non. Mais je ferais l'article. Pour le moment, je fais d'autres choses le soir et j'avais une petite flemme d'écriture, mais je vais le faire avec un exemple utilisant les programmes de Klaus. Ce soir je suis tranquille et demain aussi, je devrais avancer et ça devrait aller vite avec les programmes de Klaus qui sont déjà fait... Par contre je ne vais pas bâcler car les programmes et l'utilisation mérites un bon article. Qui sait, j'aurais peut être à utiliser la technique du double buffer aussi ...On verra bien | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Construire un masque pour les sprites Ven 12 Juin 2015 - 15:22 | |
| Voici une version de l'outil de génération de masques et de tunes, permettant de paramétrer les dimensions largeur et hauteur, dans les limites de [10,200] pixels. Plus grand n'a pas de sens car on dépasse les limites d'un sprite. Le sprite peut être rectangulaire. - Code:
-
' build_sprite_mask.bas
label build, load, loadm, savem, savet, rect, tune, close100 label enlargeup, moveup, moveleft, enlargeleft, moveright, reduceright, movedown, reducedown
dim s$, f$, fm$, ft$, fl$, w%, h%, x%, y%, toprow%, bottomrow%, leftcol%, rightcol%, ntune% dim img_w%, img_h%
hide 0 form 100 : caption 100,"Taille du sprite" : on_close 100,close100 alpha 101 : parent 101,100 : top 101,20 : left 101,20 : caption 101,"Largeur:" spin 102 : parent 102,100 : top 102,20 : left 102,100 : width 102,60 min 102,10 : max 102,200 : position 102,200 alpha 103 : parent 103,100 : top 103,50 : left 103,20 : caption 103,"Hauteur:" spin 104 : parent 104,100 : top 104,50 : left 104,100 : width 104,60 min 104,10 : max 104,200 : position 104,200 button 105 : parent 105,100 : top 105,80 : left 105,100 : caption 105,"Valider" on_click 105,close100
width 0,1000 : height 0,600
picture 1 : top 1,10 : left 1, 10 : width 1,200 : height 1,200 picture 2 : top 2,10 : left 2,350 : width 2,200 : height 2,200 picture 3 : top 3,10 : left 3,560 : width 3,200 : height 3,200
image 41 dlist 42
button 10 : top 10,90 : left 10,240 : caption 10,"Build mask" : on_click 10,build button 11 : top 11,220 : left 11,50 : caption 11,"Load image" : on_click 11,load button 12 : top 12,220 : left 12,390 : caption 12,"Load mask" : on_click 12,loadm button 13 : top 13,250 : left 13,390 : caption 13,"Save mask" : on_click 13,savem button 15 : top 15,250 : left 15,600 : caption 15,"Save tune" : on_click 15,savet
button 52 : top 52,310 : left 52,390 : caption 52,"Move ^" : on_click 52,moveup : hide 52 button 51 : top 51,340 : left 51,390 : caption 51,"Enlarge ^" : on_click 51,enlargeup : hide 51 button 50 : top 50,370 : left 50,370 : caption 50,"Rectangle" : on_click 50,rect : hide 50 : width 50,60 button 59 : top 59,370 : left 59,430 : caption 59,"Tune" : on_click 59,tune : hide 59 : width 59,60 button 54 : top 54,370 : left 54,290 : caption 54,"Enlarge <" : on_click 54,enlargeleft : hide 54 button 53 : top 53,370 : left 53,210 : caption 53,"Move <" : on_click 53,moveleft : hide 53 button 55 : top 55,370 : left 55,500 : caption 55,"Reduce >" : on_click 55,reduceright : hide 55 button 56 : top 56,370 : left 56,580 : caption 56,"Move >" : on_click 56,moveright : hide 56 button 57 : top 57,430 : left 57,390 : caption 57,"Move v" : on_click 57,movedown : hide 57 button 58 : top 58,400 : left 58,390 : caption 58,"Reduce v" : on_click 58,reducedown : hide 58
open_dialog 20 : filter 20,"*.bmp|*.bmp" save_dialog 21 : filter 21,"*.bmp|*.bmp" alpha 31 : top 31,120 : left 31,230 alpha 32 : top 32,220 : left 32,600 : caption 32,"Tunes: 0" alpha 33 : top 33,430 : left 33,550 : caption 33,"Tune name:" : hide 33 edit 34 : top 34,430 : left 34,620 : width 34,150 : hide 34
w% = width(1) h% = height(1)
end
close100: img_w% = val(text$(102)) img_h% = val(text$(104)) width 1,img_w% : height 1,img_h% width 2,img_w% : height 2,img_h% width 3,img_w% : height 3,img_h% w% = width(1) h% = height(1) hide 100 show 0 return
build: caption 31,"Wait please..." display 2d_target_is 2 for y%=0 to h% for x%=0 to w% if (color_pixel_red(1,x%,y%)=0) and (color_pixel_green(1,x%,y%)=0) and (color_pixel_blue(1,x%,y%)=0) 2d_pen_color 0,0,0 else 2d_pen_color 255,255,255 end_if 2d_point x%,y% next x% caption 31,"Wait please... "+str$(int(y%*100/img_h%))+" %" display next y% 2d_image_copy 41,0,0,img_w%,img_h% 2d_target_is 3 2d_image_paste 41,0,0 2d_target_is 2 show 50 : hide 51 : hide 52 : hide 53 : hide 54 : hide 55 : hide 56 : hide 57 : hide 58 : hide 59 hide 33 : hide 34 ntune% = 0 caption 32,"Tunes: "+str$(ntune%) clear 42 caption 31,"" return load: s$ = file_name$(20) if s$="_" then return if lower$(right$(s$,4))<>".bmp" then s$ = s$ + bmp if (instr(s$,"_mask.bmp")>0) or (instr(s$,"_tuned.bmp")>0) or (instr(s$,"_list.txt")>0) message "Invalid image file name format" return end_if f$ = s$ fm$ = left$(f$,len(f$)-4)+"_mask.bmp" ft$ = left$(fm$,len(fm$)-4)+"_tuned.bmp" fl$ = left$(fm$,len(fm$)-4)+"_tuned_list.txt" file_load 1,f$ if file_exists(fm$)=1 file_load 2,fm$ if file_exists(ft$)=1 file_load 3,ft$ if file_exists(fl$)=1 file_load 42,fl$ else clear 42 end_if else color 3,255,255,255 clear 42 end_if show 50 else color 2,255,255,255 color 3,255,255,255 clear 42 hide 50 end_if ntune% = count(42) caption 32,"Tunes: "+str$(ntune%) hide 51 : hide 52 : hide 53 : hide 54 : hide 55 : hide 56 : hide 57 : hide 58 : hide 59 hide 33 : hide 34 return loadm: s$ = file_name$(20) if s$="_" then return if right$(s$,4)<>".bmp" then s$ = s$ + ".bmp" if right$(s$,9)<>"_mask.bmp" message "Invalid mask file name format" return end_if if file_exists(s$)=0 message "Masl file not found" return end_if f$ = left$(s$,len(s$)-9) + ".bmp" fm$ = s$ ft$ = left$(fm$,len(s$)-4)+"_tuned.bmp" fl$ = left$(fm$,len(s$)-4)+"_tuned_list.txt" file_load 2,fm$ if file_exists(ft$)=1 file_load 3,ft$ if file_exists(fl$)=1 file_load 42,fl$ ntune% = count(42) else clear 42 ntune% = 0 end_if else 2d_target_is 2 2d_image_copy 41,0,0,img_w%,img_h% 2d_target_is 3 2d_image_paste 41,0,0 ntune% = 0 clear 42 end_if caption 32,"Tunes: "+str$(ntune%) 2d_target_is 2 show 50 : hide 51 : hide 52 : hide 53 : hide 54 : hide 55 : hide 56 : hide 57 : hide 58 : hide 59 hide 33 : hide 34 return
savem: if file_exists(fm$)=1 if message_confirmation_yes_no("File does already exist. Replace it ?")<>1 then return end_if file_save 2,fm$ file_save 3,ft$ file_save 42,fl$ s$ = "mask saved into: "+fm$+chr$(13)+chr$(10) s$ = s$ + "tuned mask saved into: "+ft$+chr$(13)+chr$(10) s$ = s$ + "tuned list saved into: "+fl$ message s$ return savet: if file_exists(ft$)=1 if message_confirmation_yes_no("File does already exist. Replace it ?")<>1 then return end_if file_save 3,ft$ file_save 42,fl$ s$ = "tuned mask saved into: "+ft$+chr$(13)+chr$(10) s$ = s$ + "tuned list saved into: "+fl$ message s$ return
rect: 2d_image_paste 41,0,0 toprow% = 50 bottomrow% = 150 leftcol% = 50 rightcol% = 150 2d_pen_color 255,0,0 2d_fill_off 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% show 51 : show 52 : show 53 : show 54 : show 55 : show 56 : show 57 : show 58 : show 59 show 33 : show 34 return
enlargeup: if toprow%=0 then return toprow% = toprow% - 1 2d_image_paste 41,0,0 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% return moveup: if toprow%=0 then return toprow% = toprow% - 1 bottomrow% = bottomrow% - 1 2d_image_paste 41,0,0 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% return
moveleft: if leftcol%=0 then return leftcol% = leftcol% - 1 rightcol% = rightcol% - 1 2d_image_paste 41,0,0 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% return
enlargeleft: if leftcol%=0 then return leftcol% = leftcol% - 1 2d_image_paste 41,0,0 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% return
moveright: if rightcol%=w% then return rightcol% = rightcol% + 1 leftcol% = leftcol% + 1 2d_image_paste 41,0,0 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% return
reduceright: if rightcol%=leftcol% then return rightcol% = rightcol% - 1 2d_image_paste 41,0,0 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% return
reducedown: if bottomrow%=toprow% then return bottomrow% = bottomrow% - 1 2d_image_paste 41,0,0 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% return
movedown: if bottomrow%=H% then return bottomrow% = bottomrow% + 1 toprow% = toprow% + 1 2d_image_paste 41,0,0 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% return
tune: if ntune%>=63 message "Too many tune sections" return end_if ntune% = ntune% + 1 s$ = trim$(text$(34)) if s$="" then s$ = "Tune "+str$(ntune%) item_add 42,str$(ntune%)+","+str$(leftcol%)+","+str$(toprow%)+","+str$(rightcol%)+","+str$(bottomrow%)+","+s$ 2d_target_is 3 2d_fill_on 2d_fill_color 255,255,ntune%*4 2d_pen_color 255,255,ntune%*4 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% 2d_target_is 2 2d_pen_color 255,0,0 2d_fill_off caption 32,"Tunes: "+str$(ntune%) return
| |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Construire un masque pour les sprites Ven 12 Juin 2015 - 17:28 | |
| PS: Pour les exemple que je citais de point en clic, il faut juste adapter ta procédure créée pour les sprite pour franchir la limite des sprites car dans ce cas, il est souvent plus interessant de travailler sur un picture que sur un sprite. Le masque s'appliquerait le plus souvent sur le fond du scene_2d que sur les sprites qui bougent devant. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Construire un masque pour les sprites Ven 12 Juin 2015 - 17:58 | |
| Je vois ce que tu veux dire, Jicehel. Il faut que je fasse alors une version spéciale "plein écran" pour des images de grande taille, pour lesquelles on construit un masque. C'est bien ça ? | |
| | | Invité Invité
| Sujet: Re: Construire un masque pour les sprites Ven 12 Juin 2015 - 18:30 | |
| Je suis un peu géné de te répondre, car je ne sais pas si je me plante ou pas. - Klaus a écrit:
- Voici une version de l'outil de génération de masques et de tunes, permettant de paramétrer les dimensions largeur et hauteur, dans les limites de [10,200] pixels. Plus grand n'a pas de sens car on dépasse les limites d'un sprite. Le sprite peut être rectangulaire.
C'est curieux, mais je pensais aussi la même chose, mais cela fait un deux programmes que j'ai fait, et pour moi, la limite de 200 X 200 pixels n'est plus valable, et il me semble que Jack avait dit que la limite avait été levé, (il y a un bon moment). Je cherche partout un programme sur mon ordi, et finalement j'ai été sur mon site, car je ne le retrouve pas. Avec l'I.D.E. simplifié' je déplace des sprites comme un form qui ont des dimensions importantes. Je ne veux pas t'inciter à y aller, je ne sais pas, mais il me semble que maintenant il n'y a plus cette limite. |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Construire un masque pour les sprites Ven 12 Juin 2015 - 18:43 | |
| C'est une information intéressante, Cosmos70. J'ai dû rater cela. Je vais vérifier cette affaire et ajuster mes codes en fonction du résultat. Merci ! | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Construire un masque pour les sprites Ven 12 Juin 2015 - 21:34 | |
| @Cosmos70: Merci pour ta vigileance. Comme quoi même dans les sujets où nous pensons ne pas avoir beaucoup intervenir, on peut apporter des précisions ou des informations.
@Klaus c'est exactement ça. En fait il faut bien apprendre à utiliser la meilleure méthode et bidouiller comme direr certains pour optimiser notre programmation au niveau de la lisibilité, de la performance et de lafacilité de développement | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Construire un masque pour les sprites Dim 14 Juin 2015 - 0:26 | |
| J'ai plusieurs petites remarques sur le programme: 1 - j'ai l'impression que si l'on dit que le sprite fait 62 pixels, le programme prends de 0 à 62 pixels soit 63 pixels ( à vérifier)
2 - le rectangle par défaut ne tient pas compte de la taille du sprite, ce qui fait que si le sprite est petit, on ne voit pas le rectangle au début quand on le créé. Il faudrait modifier le coin en bas à droite en fonction de la taille et modifier le coin superieur gauche aussi
3 - le rectangle est visible sur l'image: en _mask et non sur celle en _mask_tuned. Ca me semble être une erreur
| |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Construire un masque pour les sprites Dim 14 Juin 2015 - 0:46 | |
| (1) et (2): - Code:
-
' build_sprite_mask.bas
label build, load, loadm, savem, savet, rect, tune, close100 label enlargeup, moveup, moveleft, enlargeleft, moveright, reduceright, movedown, reducedown
dim s$, f$, fm$, ft$, fl$, w%, h%, x%, y%, toprow%, bottomrow%, leftcol%, rightcol%, ntune% dim img_w%, img_h%
hide 0 form 100 : caption 100,"Taille du sprite" : on_close 100,close100 alpha 101 : parent 101,100 : top 101,20 : left 101,20 : caption 101,"Largeur:" spin 102 : parent 102,100 : top 102,20 : left 102,100 : width 102,60 min 102,10 : max 102,200 : position 102,200 alpha 103 : parent 103,100 : top 103,50 : left 103,20 : caption 103,"Hauteur:" spin 104 : parent 104,100 : top 104,50 : left 104,100 : width 104,60 min 104,10 : max 104,200 : position 104,200 button 105 : parent 105,100 : top 105,80 : left 105,100 : caption 105,"Valider" on_click 105,close100
width 0,1000 : height 0,600
picture 1 : top 1,10 : left 1, 10 : width 1,200 : height 1,200 picture 2 : top 2,10 : left 2,350 : width 2,200 : height 2,200 picture 3 : top 3,10 : left 3,560 : width 3,200 : height 3,200
image 41 dlist 42
button 10 : top 10,90 : left 10,240 : caption 10,"Build mask" : on_click 10,build button 11 : top 11,220 : left 11,50 : caption 11,"Load image" : on_click 11,load button 12 : top 12,220 : left 12,390 : caption 12,"Load mask" : on_click 12,loadm button 13 : top 13,250 : left 13,390 : caption 13,"Save mask" : on_click 13,savem button 15 : top 15,250 : left 15,600 : caption 15,"Save tune" : on_click 15,savet
button 52 : top 52,310 : left 52,390 : caption 52,"Move ^" : on_click 52,moveup : hide 52 button 51 : top 51,340 : left 51,390 : caption 51,"Enlarge ^" : on_click 51,enlargeup : hide 51 button 50 : top 50,370 : left 50,370 : caption 50,"Rectangle" : on_click 50,rect : hide 50 : width 50,60 button 59 : top 59,370 : left 59,430 : caption 59,"Tune" : on_click 59,tune : hide 59 : width 59,60 button 54 : top 54,370 : left 54,290 : caption 54,"Enlarge <" : on_click 54,enlargeleft : hide 54 button 53 : top 53,370 : left 53,210 : caption 53,"Move <" : on_click 53,moveleft : hide 53 button 55 : top 55,370 : left 55,500 : caption 55,"Reduce >" : on_click 55,reduceright : hide 55 button 56 : top 56,370 : left 56,580 : caption 56,"Move >" : on_click 56,moveright : hide 56 button 57 : top 57,430 : left 57,390 : caption 57,"Move v" : on_click 57,movedown : hide 57 button 58 : top 58,400 : left 58,390 : caption 58,"Reduce v" : on_click 58,reducedown : hide 58
open_dialog 20 : filter 20,"*.bmp|*.bmp" save_dialog 21 : filter 21,"*.bmp|*.bmp" alpha 31 : top 31,120 : left 31,230 alpha 32 : top 32,220 : left 32,600 : caption 32,"Tunes: 0" alpha 33 : top 33,430 : left 33,550 : caption 33,"Tune name:" : hide 33 edit 34 : top 34,430 : left 34,620 : width 34,150 : hide 34
w% = width(1) h% = height(1)
end
close100: img_w% = val(text$(102)) img_h% = val(text$(104)) width 1,img_w% : height 1,img_h% width 2,img_w% : height 2,img_h% width 3,img_w% : height 3,img_h% w% = width(1) h% = height(1) hide 100 show 0 return
build: caption 31,"Wait please..." display 2d_target_is 2 for y%=0 to h%-1 for x%=0 to w%-1 if (color_pixel_red(1,x%,y%)=0) and (color_pixel_green(1,x%,y%)=0) and (color_pixel_blue(1,x%,y%)=0) 2d_pen_color 0,0,0 else 2d_pen_color 255,255,255 end_if 2d_point x%,y% next x% caption 31,"Wait please... "+str$(int(y%*100/img_h%))+" %" display next y% 2d_image_copy 41,0,0,img_w%-1,img_h%-1 2d_target_is 3 2d_image_paste 41,0,0 2d_target_is 2 show 50 : hide 51 : hide 52 : hide 53 : hide 54 : hide 55 : hide 56 : hide 57 : hide 58 : hide 59 hide 33 : hide 34 ntune% = 0 caption 32,"Tunes: "+str$(ntune%) clear 42 caption 31,"" return load: s$ = file_name$(20) if s$="_" then return if lower$(right$(s$,4))<>".bmp" then s$ = s$ + bmp if (instr(s$,"_mask.bmp")>0) or (instr(s$,"_tuned.bmp")>0) or (instr(s$,"_list.txt")>0) message "Invalid image file name format" return end_if f$ = s$ fm$ = left$(f$,len(f$)-4)+"_mask.bmp" ft$ = left$(fm$,len(fm$)-4)+"_tuned.bmp" fl$ = left$(fm$,len(fm$)-4)+"_tuned_list.txt" file_load 1,f$ if file_exists(fm$)=1 file_load 2,fm$ if file_exists(ft$)=1 file_load 3,ft$ if file_exists(fl$)=1 file_load 42,fl$ else clear 42 end_if else color 3,255,255,255 clear 42 end_if show 50 else color 2,255,255,255 color 3,255,255,255 clear 42 hide 50 end_if ntune% = count(42) caption 32,"Tunes: "+str$(ntune%) hide 51 : hide 52 : hide 53 : hide 54 : hide 55 : hide 56 : hide 57 : hide 58 : hide 59 hide 33 : hide 34 return loadm: s$ = file_name$(20) if s$="_" then return if right$(s$,4)<>".bmp" then s$ = s$ + ".bmp" if right$(s$,9)<>"_mask.bmp" message "Invalid mask file name format" return end_if if file_exists(s$)=0 message "Masl file not found" return end_if f$ = left$(s$,len(s$)-9) + ".bmp" fm$ = s$ ft$ = left$(fm$,len(s$)-4)+"_tuned.bmp" fl$ = left$(fm$,len(s$)-4)+"_tuned_list.txt" file_load 2,fm$ if file_exists(ft$)=1 file_load 3,ft$ if file_exists(fl$)=1 file_load 42,fl$ ntune% = count(42) else clear 42 ntune% = 0 end_if else 2d_target_is 2 2d_image_copy 41,0,0,img_w%-1,img_h%-1 2d_target_is 3 2d_image_paste 41,0,0 ntune% = 0 clear 42 end_if caption 32,"Tunes: "+str$(ntune%) 2d_target_is 2 show 50 : hide 51 : hide 52 : hide 53 : hide 54 : hide 55 : hide 56 : hide 57 : hide 58 : hide 59 hide 33 : hide 34 return
savem: if file_exists(fm$)=1 if message_confirmation_yes_no("File does already exist. Replace it ?")<>1 then return end_if file_save 2,fm$ file_save 3,ft$ file_save 42,fl$ s$ = "mask saved into: "+fm$+chr$(13)+chr$(10) s$ = s$ + "tuned mask saved into: "+ft$+chr$(13)+chr$(10) s$ = s$ + "tuned list saved into: "+fl$ message s$ return savet: if file_exists(ft$)=1 if message_confirmation_yes_no("File does already exist. Replace it ?")<>1 then return end_if file_save 3,ft$ file_save 42,fl$ s$ = "tuned mask saved into: "+ft$+chr$(13)+chr$(10) s$ = s$ + "tuned list saved into: "+fl$ message s$ return
rect: 2d_image_paste 41,0,0 toprow% = int(img_h%/4) bottomrow% = int((img_h%*3)/4) leftcol% = int(img_w%/4) rightcol% = int((img_w%*3)/4) 2d_pen_color 255,0,0 2d_fill_off 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% show 51 : show 52 : show 53 : show 54 : show 55 : show 56 : show 57 : show 58 : show 59 show 33 : show 34 return
enlargeup: if toprow%=0 then return toprow% = toprow% - 1 2d_image_paste 41,0,0 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% return moveup: if toprow%=0 then return toprow% = toprow% - 1 bottomrow% = bottomrow% - 1 2d_image_paste 41,0,0 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% return
moveleft: if leftcol%=0 then return leftcol% = leftcol% - 1 rightcol% = rightcol% - 1 2d_image_paste 41,0,0 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% return
enlargeleft: if leftcol%=0 then return leftcol% = leftcol% - 1 2d_image_paste 41,0,0 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% return
moveright: if rightcol%=(w%-1) then return rightcol% = rightcol% + 1 leftcol% = leftcol% + 1 2d_image_paste 41,0,0 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% return
reduceright: if rightcol%=leftcol% then return rightcol% = rightcol% - 1 2d_image_paste 41,0,0 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% return
reducedown: if bottomrow%=toprow% then return bottomrow% = bottomrow% - 1 2d_image_paste 41,0,0 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% return
movedown: if bottomrow%=(H%-1) then return bottomrow% = bottomrow% + 1 toprow% = toprow% + 1 2d_image_paste 41,0,0 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% return
tune: if ntune%>=63 message "Too many tune sections" return end_if ntune% = ntune% + 1 s$ = trim$(text$(34)) if s$="" then s$ = "Tune "+str$(ntune%) item_add 42,str$(ntune%)+","+str$(leftcol%)+","+str$(toprow%)+","+str$(rightcol%)+","+str$(bottomrow%)+","+s$ 2d_target_is 3 2d_fill_on 2d_fill_color 255,255,ntune%*4 2d_pen_color 255,255,ntune%*4 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% 2d_target_is 2 2d_pen_color 255,0,0 2d_fill_off caption 32,"Tunes: "+str$(ntune%) return
(3): Le rectangle apparaît sur le picture de droite lorsque le bouton "Tune" est cliqué, donc lorsque le tune est validé. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Construire un masque pour les sprites Dim 14 Juin 2015 - 16:40 | |
| J'ai fait une version de cet utilitaire qui permet de produire les rotations à gauche (à droite, ça viendra...) par intervalles de 90°. C'est toujours 100 % Panoramic ! Sur mon WebDav, dossier Sources\KGF\, vous trouverez un fichier Android_4_orientations.zip qui contient les 4 orientations de mon sprite Android, avec les masques, tunes et listes des tunes adaptées. Pour cela, il faut charger un sprite, construire éventuellement son masque s'il n'existe pas encore (sinon, il sera chargé automatiquement, avec éventuellement ses tunes), puis cliquer sur "Rectangle". A droite des 3 pictures apparait alors le bouton "Rotate left 90°". Ce bouton effectue une rotation, en utilisant un picture "de travail" qui s'affiche pour le moment pour plus de clarté (la commande HIDE 4 est mise en commentaire pour le moment). La rotation est effectuée successivement sur le sprite d'origine, puis sur le masque, puis sur le masque avec tunes. Enfin, la liste des coordonnées des tunes est ajustée aussi. Pour ne pas écraser le sprite d'origine, les noms des 4 fichiers sont adaptés automatiquement, en insérant "(nnn)" juste après le nom du sprite, avant le "." de l'extension ou avant "_mask". Ceci permet de se constituer un ensemble de sprites avec ses fichiers associés, sans conflit, et avec on nom identifiant clairement le contenu du fichier. Voici le source de cette version: - Code:
-
' build_sprite_mask.bas
label build, load, save, loadm, savem, savet, rect, tune, close100 label enlargeup, moveup, moveleft, enlargeleft, moveright, reduceright, movedown, reducedown label right90, left90
dim s$, f$, fm$, ft$, fl$, w%, h%, x%, y%, toprow%, bottomrow%, leftcol%, rightcol%, ntune% dim img_w%, img_h%, angle%
hide 0 form 100 : caption 100,"Taille du sprite" : on_close 100,close100 alpha 101 : parent 101,100 : top 101,20 : left 101,20 : caption 101,"Largeur:" spin 102 : parent 102,100 : top 102,20 : left 102,100 : width 102,60 min 102,10 : max 102,200 : position 102,200 alpha 103 : parent 103,100 : top 103,50 : left 103,20 : caption 103,"Hauteur:" spin 104 : parent 104,100 : top 104,50 : left 104,100 : width 104,60 min 104,10 : max 104,200 : position 104,200 button 105 : parent 105,100 : top 105,80 : left 105,100 : caption 105,"Valider" on_click 105,close100
width 0,1000 : height 0,600
picture 1 : top 1,10 : left 1, 10 : width 1,200 : height 1,200 picture 2 : top 2,10 : left 2,350 : width 2,200 : height 2,200 picture 3 : top 3,10 : left 3,560 : width 3,200 : height 3,200 picture 4 : top 4,300 : left 4,750 : width 4,200 : height 4,200 : ' hide 4 alpha 5 : top 5,280 : left 5,60
image 41 dlist 42 image 43
button 10 : top 10,90 : left 10,240 : caption 10,"Build mask" : on_click 10,build button 11 : top 11,220 : left 11,50 : caption 11,"Load image" : on_click 11,load button 16 : top 16,250 : left 16,50 : caption 16,"Save image" : on_click 16,save button 12 : top 12,220 : left 12,390 : caption 12,"Load mask" : on_click 12,loadm button 13 : top 13,250 : left 13,390 : caption 13,"Save mask" : on_click 13,savem button 15 : top 15,250 : left 15,600 : caption 15,"Save tune" : on_click 15,savet
button 52 : top 52,310 : left 52,390 : caption 52,"Move ^" : on_click 52,moveup : hide 52 button 51 : top 51,340 : left 51,390 : caption 51,"Enlarge ^" : on_click 51,enlargeup : hide 51 button 50 : top 50,370 : left 50,370 : caption 50,"Rectangle" : on_click 50,rect : hide 50 : width 50,60 button 59 : top 59,370 : left 59,430 : caption 59,"Tune" : on_click 59,tune : hide 59 : width 59,60 button 54 : top 54,370 : left 54,290 : caption 54,"Enlarge <" : on_click 54,enlargeleft : hide 54 button 53 : top 53,370 : left 53,210 : caption 53,"Move <" : on_click 53,moveleft : hide 53 button 55 : top 55,370 : left 55,500 : caption 55,"Reduce >" : on_click 55,reduceright : hide 55 button 56 : top 56,370 : left 56,580 : caption 56,"Move >" : on_click 56,moveright : hide 56 button 57 : top 57,430 : left 57,390 : caption 57,"Move v" : on_click 57,movedown : hide 57 button 58 : top 58,400 : left 58,390 : caption 58,"Reduce v" : on_click 58,reducedown : hide 58
button 61 : top 61,60 : left 61,790 : width 61,120 : caption 61,"Rotate right 90°" : on_click 61,right90 : hide 61 button 62 : top 62,90 : left 62,790 : width 62,120 : caption 62,"Rotate left 90°" : on_click 62,left90 : hide 62 alpha 69 : top 69,120 : left 69,810
open_dialog 20 : filter 20,"*.bmp|*.bmp" save_dialog 21 : filter 21,"*.bmp|*.bmp" alpha 31 : top 31,120 : left 31,230 alpha 32 : top 32,220 : left 32,600 : caption 32,"Tunes: 0" alpha 33 : top 33,430 : left 33,500 : caption 33,"Tune name:" : hide 33 edit 34 : top 34,430 : left 34,570 : width 34,150 : hide 34
w% = width(1) h% = height(1)
end
close100: img_w% = val(text$(102)) img_h% = val(text$(104)) width 1,img_w% : height 1,img_h% width 2,img_w% : height 2,img_h% width 3,img_w% : height 3,img_h% width 4,img_w% : height 4,img_h% w% = width(1) h% = height(1) hide 100 show 0 return
build: caption 31,"Wait please..." display 2d_target_is 2 for y%=0 to h%-1 for x%=0 to w%-1 if (color_pixel_red(1,x%,y%)=0) and (color_pixel_green(1,x%,y%)=0) and (color_pixel_blue(1,x%,y%)=0) 2d_pen_color 0,0,0 else 2d_pen_color 255,255,255 end_if 2d_point x%,y% next x% caption 31,"Wait please... "+str$(int(y%*100/img_h%))+" %" display next y% 2d_image_copy 41,0,0,img_w%-1,img_h%-1 2d_target_is 3 2d_image_paste 41,0,0 2d_target_is 2 show 50 : hide 51 : hide 52 : hide 53 : hide 54 : hide 55 : hide 56 : hide 57 : hide 58 : hide 59 hide 33 : hide 34 : hide 61 : hide 62 ntune% = 0 caption 32,"Tunes: "+str$(ntune%) clear 42 caption 31,"" return load: ' Le nom du fichier doit contenir l'angle de rotation de l'image, sous forme: ' xxx(nnn).bmp ' Si l'angle est 0 (pas de rotation), la portion "(nnn)" peut ne pas être indiquée. s$ = file_name$(20) if s$="_" then return if lower$(right$(s$,4))<>".bmp" then s$ = s$ + bmp if (instr(s$,"_mask.bmp")>0) or (instr(s$,"_tuned.bmp")>0) or (instr(s$,"_list.txt")>0) message "Invalid image file name format" return end_if f$ = s$ fm$ = left$(f$,len(f$)-4)+"_mask.bmp" ft$ = left$(fm$,len(fm$)-4)+"_tuned.bmp" fl$ = left$(fm$,len(fm$)-4)+"_tuned_list.txt" file_load 1,f$ if file_exists(fm$)=1 file_load 2,fm$ if file_exists(ft$)=1 file_load 3,ft$ if file_exists(fl$)=1 file_load 42,fl$ else clear 42 end_if else color 3,255,255,255 clear 42 end_if show 50 else color 2,255,255,255 color 3,255,255,255 clear 42 hide 50 end_if ntune% = count(42) GetAngle(f$) caption 32,"Tunes: "+str$(ntune%) hide 51 : hide 52 : hide 53 : hide 54 : hide 55 : hide 56 : hide 57 : hide 58 : hide 59 hide 33 : hide 34 : hide 61 : hide 62 return loadm: s$ = file_name$(20) if s$="_" then return if right$(s$,4)<>".bmp" then s$ = s$ + ".bmp" if right$(s$,9)<>"_mask.bmp" message "Invalid mask file name format" return end_if if file_exists(s$)=0 message "Masl file not found" return end_if f$ = left$(s$,len(s$)-9) + ".bmp" fm$ = s$ ft$ = left$(fm$,len(s$)-4)+"_tuned.bmp" fl$ = left$(fm$,len(s$)-4)+"_tuned_list.txt" file_load 2,fm$ if file_exists(ft$)=1 file_load 3,ft$ if file_exists(fl$)=1 file_load 42,fl$ ntune% = count(42) else clear 42 ntune% = 0 end_if else 2d_target_is 2 2d_image_copy 41,0,0,img_w%-1,img_h%-1 2d_target_is 3 2d_image_paste 41,0,0 ntune% = 0 clear 42 end_if caption 32,"Tunes: "+str$(ntune%) 2d_target_is 2 show 50 : hide 51 : hide 52 : hide 53 : hide 54 : hide 55 : hide 56 : hide 57 : hide 58 : hide 59 hide 33 : hide 34 : hide 61 : hide 62 return
save: if file_exists(f$)=1 if message_confirmation_yes_no("File does already exist. Replace it ?")<>1 then return end_if file_save 1,f$ file_save 2,fm$ file_save 3,ft$ file_save 42,fl$ s$ = "image saved into: "+f$+chr$(13)+chr$(10) s$ = s$ + "mask saved into: "+fm$+chr$(13)+chr$(10) s$ = s$ + "tuned mask saved into: "+ft$+chr$(13)+chr$(10) s$ = s$ + "tuned list saved into: "+fl$ message s$ return
savem: if file_exists(fm$)=1 if message_confirmation_yes_no("File does already exist. Replace it ?")<>1 then return end_if file_save 2,fm$ file_save 3,ft$ file_save 42,fl$ s$ = "mask saved into: "+fm$+chr$(13)+chr$(10) s$ = s$ + "tuned mask saved into: "+ft$+chr$(13)+chr$(10) s$ = s$ + "tuned list saved into: "+fl$ message s$ return savet: if file_exists(ft$)=1 if message_confirmation_yes_no("File does already exist. Replace it ?")<>1 then return end_if file_save 3,ft$ file_save 42,fl$ s$ = "tuned mask saved into: "+ft$+chr$(13)+chr$(10) s$ = s$ + "tuned list saved into: "+fl$ message s$ return
rect: 2d_image_paste 41,0,0 toprow% = int(img_h%/4) bottomrow% = int((img_h%*3)/4) leftcol% = int(img_w%/4) rightcol% = int((img_w%*3)/4) 2d_pen_color 255,0,0 2d_fill_off 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% show 51 : show 52 : show 53 : show 54 : show 55 : show 56 : show 57 : show 58 : show 59 show 33 : show 34 : show 61 : show 62 return
enlargeup: if toprow%=0 then return toprow% = toprow% - 1 2d_image_paste 41,0,0 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% return moveup: if toprow%=0 then return toprow% = toprow% - 1 bottomrow% = bottomrow% - 1 2d_image_paste 41,0,0 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% return
moveleft: if leftcol%=0 then return leftcol% = leftcol% - 1 rightcol% = rightcol% - 1 2d_image_paste 41,0,0 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% return
enlargeleft: if leftcol%=0 then return leftcol% = leftcol% - 1 2d_image_paste 41,0,0 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% return
moveright: if rightcol%=(w%-1) then return rightcol% = rightcol% + 1 leftcol% = leftcol% + 1 2d_image_paste 41,0,0 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% return
reduceright: if rightcol%=leftcol% then return rightcol% = rightcol% - 1 2d_image_paste 41,0,0 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% return
reducedown: if bottomrow%=toprow% then return bottomrow% = bottomrow% - 1 2d_image_paste 41,0,0 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% return
movedown: if bottomrow%=(H%-1) then return bottomrow% = bottomrow% + 1 toprow% = toprow% + 1 2d_image_paste 41,0,0 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% return
tune: if ntune%>=63 message "Too many tune sections" return end_if ntune% = ntune% + 1 s$ = trim$(text$(34)) if s$="" then s$ = "Tune "+str$(ntune%) item_add 42,str$(ntune%)+","+str$(leftcol%)+","+str$(toprow%)+","+str$(rightcol%)+","+str$(bottomrow%)+","+s$ 2d_target_is 3 2d_fill_on 2d_fill_color 255,255,ntune%*4 2d_pen_color 255,255,ntune%*4 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% 2d_target_is 2 2d_pen_color 255,0,0 2d_fill_off caption 32,"Tunes: "+str$(ntune%) return
right90: RotatePictureRight(1) RotatePictureRight(2) RotatePictureRight(3) angle% = angle% - 90 RotateTunesRight() AdjustAngle() return
left90: RotatePictureLeft(1) RotatePictureLeft(2) RotatePictureLeft(3) RotateTunesLeft() angle% = angle% + 90 AdjustAngle() return sub AdjustAngle() ' adapter les noms des fichiers: f$, fm$, ft$, fl$ dim_local s$, p1%, p2%, a$ if angle%<0 then angle% = 270 if angle%=360 then angle% = 0 if angle%>0 : ' placer l'angle if angle%=90 : ' insérer l'angle ' nom.bmp ==> nom(xxx).bmp ' nom_mask.bmp ==> nom(xxx)_mask.bmp ' nom_mask_tuned.bmp ==> nom(xxx)_mask_tuned.bmp ' nom_mask_tuned_list.bmp ==> nom(xxx)_mask_tuned_list.bmp a$ = "(90)" p1% = instr(f$,".") f$ = left$(f$,p1%-1)+a$+mid$(f$,p1%,len(f$)) p1% = instr(fm$,"_mask") fm$ = left$(fm$,p1%-1)+a$+mid$(fm$,p1%,len(fm$)) p1% = instr(ft$,"_mask") ft$ = left$(ft$,p1%-1)+a$+mid$(ft$,p1%,len(ft$)) p1% = instr(fl$,"_mask") fl$ = left$(fl$,p1%-1)+a$+mid$(fl$,p1%,len(fl$)) else : ' remplacer l'angle ' nom(xxx).bmp ==> nom(yyy).bmp ' nom(xxx)_mask.bmp ==> nom(yyy)_mask.bmp ' nom(xxx)_mask_tuned.bmp ==> nom(yyy)_mask_tuned.bmp ' nom(xxx)_mask_tuned_list.bmp ==> nom(yyy)_mask_tuned_list.bmp a$ = "("+str$(angle%)+")" p1% = instr(f$,"(") p2% = instr(f$,")") f$ = left$(f$,p1%-1)+a$+mid$(f$,p2%+1,len(f$)) p1% = instr(fm$,"(") p2% = instr(fm$,")") fm$ = left$(fm$,p1%-1)+a$+mid$(fm$,p2%+1,len(fm$)) p1% = instr(ft$,"(") p2% = instr(ft$,")") ft$ = left$(ft$,p1%-1)+a$+mid$(ft$,p2%+1,len(ft$)) p1% = instr(fl$,"(") p2% = instr(fl$,")") fl$ = left$(fl$,p1%-1)+a$+mid$(fl$,p2%+1,len(fl$)) end_if else : ' retirer l'angle ' nom(xxx).bmp ==> nom.bmp ' nom(xxx)_mask.bmp ==> nom_mask.bmp ' nom(xxx)_mask_tuned.bmp ==> nom_mask_tuned.bmp ' nom(xxx)_mask_tuned_list.bmp ==> nom_mask_tuned_list.bmp p1% = instr(f$,"(") p2% = instr(f$,")") f$ = left$(f$,p1%-1)+mid$(f$,p2%+1,len(f$)) p1% = instr(fm$,"(") p2% = instr(fm$,")") fm$ = left$(fm$,p1%-1)+mid$(fm$,p2%+1,len(fm$)) p1% = instr(ft$,"(") p2% = instr(ft$,")") ft$ = left$(ft$,p1%-1)+mid$(ft$,p2%+1,len(ft$)) p1% = instr(fl$,"(") p2% = instr(fl$,")") fl$ = left$(fl$,p1%-1)+mid$(fl$,p2%+1,len(fl$)) end_if caption 5,"Angle: "+str$(angle%)+"°" s$ = "Nouveaux noms de fichiers:"+chr$(13)+chr$(10) message s$+f$+chr$(13)+chr$(10)+fm$+chr$(13)+chr$(10)+ft$+chr$(13)+chr$(10)+fl$+chr$(13)+chr$(10) end_sub
sub RotatePictureLeft(pic%) dim_local w%, h%, l%, c% caption 69,"Wait please.." h% = height(pic%) : w% = width(pic%) width 4,h% : height 4,w% 2d_target_is 4 for l%=0 to h%-1 for c%=0 to w%-1 2d_pen_color color_pixel_red(pic%,c%,l%),color_pixel_green(pic%,c%,l%),color_pixel_blue(pic%,c%,l%) 2d_point l%,w%-c%-1 next c% caption 69,"Wait please... "+str$(int(l%*100/h%))+" %" display next l% width pic%,h% : height pic%,w% color pic%,0,0,0 2d_image_copy 43,0,0,h%-1,w%-1 2d_target_is pic% 2d_image_paste 43,0,0 caption 69,"" end_sub
sub RotatePictureRight(pic%)
end_sub
sub RotateTunesLeft() dim_local t%, t$, n$, p%, nt%, lc%, tr%, rc%, br%, lcx%, trx%, rcx%, brx% if count(42)>0 caption 69,"Tune transposition..." display for t%=1 to count(42) t$ = item_read$(42,t%) p% = instr(t$,",") nt% = val(left$(t$,p%-1)) t$ = mid$(t$,p%+1,100) p% = instr(t$,",") lcx% = val(left$(t$,p%-1)) t$ = mid$(t$,p%+1,100) p% = instr(t$,",") trx% = val(left$(t$,p%-1)) t$ = mid$(t$,p%+1,100) p% = instr(t$,",") rcx% = val(left$(t$,p%-1)) t$ = mid$(t$,p%+1,100) p% = instr(t$,",") brx% = val(left$(t$,p%-1)) n$ = mid$(t$,p%+1,100)
lc% = trx% tr% = w% - lcx% rc% = brx% br% = h% - rcx% item_delete 42,t% item_insert 42,t%,str$(nt%)+","+str$(lc%)+","+str$(tr%)+","+str$(rc%)+","+str$(br%)+","+n$ next t% caption 69,"" end_if ' ajuster les coordonnées du rectangle actuel lc% = leftcol% tr% = toprow% rc% = rightcol% br% = bottomrow% leftcol% = tr% toprow% = w% - lc% rightcol% = br% bottomrow% = h% - rc% ' ajuster les variables donnant les dimensions actuelles img_w% = width(1) img_h% = height(1) w% = img_w% h% = img_h% end_sub
sub RotateTunesRight()
end_sub sub GetAngle(f$) dim_local p1%, p2% angle% = 0 p1% = instr(f$,"(") if p1%>0 p2% = instr(f$,")") if p2%>p1% angle%=val(mid$(f$,p1%+1,p2%-p1%-1)) end_if end_if caption 5,"Angle: "+str$(angle%)+"°" end_sub
sub LoadPicture(pic%,nam$) width pic%,img_w% height pic%,img_h% color pic%,255,255,255 file_load 4,nam$ 2d_target_is 4 2d_image_copy 43,0,0,img_w%,img_h% 2d_target_is pic% 2d_image_paste 43,0,0 end_sub
Je vais réfléchir à une rotation autre que 90°. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Construire un masque pour les sprites Dim 14 Juin 2015 - 23:46 | |
| Après correction d'un petit bug, et la réalisation de la rotation à droite, voici une version réellement exploitable, avec la rotation dans les deux sens, par pas de 90°: - Code:
-
' build_sprite_mask.bas
label build, load, save, loadm, savem, savet, rect, tune, close100 label enlargeup, moveup, moveleft, enlargeleft, moveright, reduceright, movedown, reducedown label right90, left90
dim s$, f$, fm$, ft$, fl$, w%, h%, x%, y%, toprow%, bottomrow%, leftcol%, rightcol%, ntune% dim img_w%, img_h%, angle%
hide 0 form 100 : caption 100,"Taille du sprite" : on_close 100,close100 alpha 101 : parent 101,100 : top 101,20 : left 101,20 : caption 101,"Largeur:" spin 102 : parent 102,100 : top 102,20 : left 102,100 : width 102,60 min 102,10 : max 102,200 : position 102,200 alpha 103 : parent 103,100 : top 103,50 : left 103,20 : caption 103,"Hauteur:" spin 104 : parent 104,100 : top 104,50 : left 104,100 : width 104,60 min 104,10 : max 104,200 : position 104,200 button 105 : parent 105,100 : top 105,80 : left 105,100 : caption 105,"Valider" on_click 105,close100
width 0,1000 : height 0,600
picture 1 : top 1,10 : left 1, 10 : width 1,200 : height 1,200 picture 2 : top 2,10 : left 2,350 : width 2,200 : height 2,200 picture 3 : top 3,10 : left 3,560 : width 3,200 : height 3,200 picture 4 : top 4,300 : left 4,750 : width 4,200 : height 4,200 : ' hide 4 alpha 5 : top 5,280 : left 5,60
image 41 dlist 42 image 43
button 10 : top 10,90 : left 10,240 : caption 10,"Build mask" : on_click 10,build button 11 : top 11,220 : left 11,50 : caption 11,"Load image" : on_click 11,load button 16 : top 16,250 : left 16,50 : caption 16,"Save image" : on_click 16,save button 12 : top 12,220 : left 12,390 : caption 12,"Load mask" : on_click 12,loadm button 13 : top 13,250 : left 13,390 : caption 13,"Save mask" : on_click 13,savem button 15 : top 15,250 : left 15,600 : caption 15,"Save tune" : on_click 15,savet
button 52 : top 52,310 : left 52,390 : caption 52,"Move ^" : on_click 52,moveup : hide 52 button 51 : top 51,340 : left 51,390 : caption 51,"Enlarge ^" : on_click 51,enlargeup : hide 51 button 50 : top 50,370 : left 50,370 : caption 50,"Rectangle" : on_click 50,rect : hide 50 : width 50,60 button 59 : top 59,370 : left 59,430 : caption 59,"Tune" : on_click 59,tune : hide 59 : width 59,60 button 54 : top 54,370 : left 54,290 : caption 54,"Enlarge <" : on_click 54,enlargeleft : hide 54 button 53 : top 53,370 : left 53,210 : caption 53,"Move <" : on_click 53,moveleft : hide 53 button 55 : top 55,370 : left 55,500 : caption 55,"Reduce >" : on_click 55,reduceright : hide 55 button 56 : top 56,370 : left 56,580 : caption 56,"Move >" : on_click 56,moveright : hide 56 button 57 : top 57,430 : left 57,390 : caption 57,"Move v" : on_click 57,movedown : hide 57 button 58 : top 58,400 : left 58,390 : caption 58,"Reduce v" : on_click 58,reducedown : hide 58
button 61 : top 61,60 : left 61,790 : width 61,120 : caption 61,"Rotate right 90°" : on_click 61,right90 : hide 61 button 62 : top 62,90 : left 62,790 : width 62,120 : caption 62,"Rotate left 90°" : on_click 62,left90 : hide 62 alpha 69 : top 69,120 : left 69,810
open_dialog 20 : filter 20,"*.bmp|*.bmp" save_dialog 21 : filter 21,"*.bmp|*.bmp" alpha 31 : top 31,120 : left 31,230 alpha 32 : top 32,220 : left 32,600 : caption 32,"Tunes: 0" alpha 33 : top 33,430 : left 33,500 : caption 33,"Tune name:" : hide 33 edit 34 : top 34,430 : left 34,570 : width 34,150 : hide 34
w% = width(1) h% = height(1)
end
close100: img_w% = val(text$(102)) img_h% = val(text$(104)) width 1,img_w% : height 1,img_h% width 2,img_w% : height 2,img_h% width 3,img_w% : height 3,img_h% width 4,img_w% : height 4,img_h% w% = width(1) h% = height(1) hide 100 show 0 return
build: caption 31,"Wait please..." display 2d_target_is 2 for y%=0 to h%-1 for x%=0 to w%-1 if (color_pixel_red(1,x%,y%)=0) and (color_pixel_green(1,x%,y%)=0) and (color_pixel_blue(1,x%,y%)=0) 2d_pen_color 0,0,0 else 2d_pen_color 255,255,255 end_if 2d_point x%,y% next x% caption 31,"Wait please... "+str$(int(y%*100/img_h%))+" %" display next y% 2d_image_copy 41,0,0,img_w%-1,img_h%-1 2d_target_is 3 2d_image_paste 41,0,0 2d_target_is 2 show 50 : hide 51 : hide 52 : hide 53 : hide 54 : hide 55 : hide 56 : hide 57 : hide 58 : hide 59 hide 33 : hide 34 : hide 61 : hide 62 ntune% = 0 caption 32,"Tunes: "+str$(ntune%) clear 42 caption 31,"" return load: ' Le nom du fichier doit contenir l'angle de rotation de l'image, sous forme: ' xxx(nnn).bmp ' Si l'angle est 0 (pas de rotation), la portion "(nnn)" peut ne pas être indiquée. s$ = file_name$(20) if s$="_" then return if lower$(right$(s$,4))<>".bmp" then s$ = s$ + bmp if (instr(s$,"_mask.bmp")>0) or (instr(s$,"_tuned.bmp")>0) or (instr(s$,"_list.txt")>0) message "Invalid image file name format" return end_if f$ = s$ fm$ = left$(f$,len(f$)-4)+"_mask.bmp" ft$ = left$(fm$,len(fm$)-4)+"_tuned.bmp" fl$ = left$(fm$,len(fm$)-4)+"_tuned_list.txt" file_load 1,f$ if file_exists(fm$)=1 file_load 2,fm$ 2d_target_is 2 2d_image_copy 41,0,0,img_w%-1,img_h%-1 if file_exists(ft$)=1 file_load 3,ft$ if file_exists(fl$)=1 file_load 42,fl$ else clear 42 end_if else color 3,255,255,255 clear 42 end_if show 50 else color 2,255,255,255 color 3,255,255,255 clear 42 hide 50 end_if ntune% = count(42) GetAngle(f$) 2d_target_is 2 caption 32,"Tunes: "+str$(ntune%) hide 51 : hide 52 : hide 53 : hide 54 : hide 55 : hide 56 : hide 57 : hide 58 : hide 59 hide 33 : hide 34 : hide 61 : hide 62 return loadm: s$ = file_name$(20) if s$="_" then return if right$(s$,4)<>".bmp" then s$ = s$ + ".bmp" if right$(s$,9)<>"_mask.bmp" message "Invalid mask file name format" return end_if if file_exists(s$)=0 message "Masl file not found" return end_if f$ = left$(s$,len(s$)-9) + ".bmp" fm$ = s$ ft$ = left$(fm$,len(s$)-4)+"_tuned.bmp" fl$ = left$(fm$,len(s$)-4)+"_tuned_list.txt" file_load 2,fm$ 2d_target_is 2 2d_image_copy 41,0,0,img_w%-1,img_h%-1 if file_exists(ft$)=1 file_load 3,ft$ if file_exists(fl$)=1 file_load 42,fl$ ntune% = count(42) else clear 42 ntune% = 0 end_if else 2d_target_is 3 2d_image_paste 41,0,0 ntune% = 0 clear 42 end_if caption 32,"Tunes: "+str$(ntune%) 2d_target_is 2 show 50 : hide 51 : hide 52 : hide 53 : hide 54 : hide 55 : hide 56 : hide 57 : hide 58 : hide 59 hide 33 : hide 34 : hide 61 : hide 62 return
save: if file_exists(f$)=1 if message_confirmation_yes_no("File does already exist. Replace it ?")<>1 then return end_if file_save 1,f$ 2d_target_is 2 2d_image_paste 41,0,0 file_save 2,fm$ file_save 3,ft$ file_save 42,fl$ s$ = "image saved into: "+f$+chr$(13)+chr$(10) s$ = s$ + "mask saved into: "+fm$+chr$(13)+chr$(10) s$ = s$ + "tuned mask saved into: "+ft$+chr$(13)+chr$(10) s$ = s$ + "tuned list saved into: "+fl$ message s$ return
savem: if file_exists(fm$)=1 if message_confirmation_yes_no("File does already exist. Replace it ?")<>1 then return end_if file_save 2,fm$ file_save 3,ft$ file_save 42,fl$ s$ = "mask saved into: "+fm$+chr$(13)+chr$(10) s$ = s$ + "tuned mask saved into: "+ft$+chr$(13)+chr$(10) s$ = s$ + "tuned list saved into: "+fl$ message s$ return savet: if file_exists(ft$)=1 if message_confirmation_yes_no("File does already exist. Replace it ?")<>1 then return end_if file_save 3,ft$ file_save 42,fl$ s$ = "tuned mask saved into: "+ft$+chr$(13)+chr$(10) s$ = s$ + "tuned list saved into: "+fl$ message s$ return
rect: 2d_target_is 2 2d_image_paste 41,0,0 toprow% = int(img_h%/4) bottomrow% = int((img_h%*3)/4) leftcol% = int(img_w%/4) rightcol% = int((img_w%*3)/4) 2d_pen_color 255,0,0 2d_fill_off 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% show 51 : show 52 : show 53 : show 54 : show 55 : show 56 : show 57 : show 58 : show 59 show 33 : show 34 : show 61 : show 62 return
enlargeup: if toprow%=0 then return toprow% = toprow% - 1 2d_image_paste 41,0,0 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% return moveup: if toprow%=0 then return toprow% = toprow% - 1 bottomrow% = bottomrow% - 1 2d_image_paste 41,0,0 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% return
moveleft: if leftcol%=0 then return leftcol% = leftcol% - 1 rightcol% = rightcol% - 1 2d_image_paste 41,0,0 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% return
enlargeleft: if leftcol%=0 then return leftcol% = leftcol% - 1 2d_image_paste 41,0,0 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% return
moveright: if rightcol%=(w%-1) then return rightcol% = rightcol% + 1 leftcol% = leftcol% + 1 2d_image_paste 41,0,0 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% return
reduceright: if rightcol%=leftcol% then return rightcol% = rightcol% - 1 2d_image_paste 41,0,0 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% return
reducedown: if bottomrow%=toprow% then return bottomrow% = bottomrow% - 1 2d_image_paste 41,0,0 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% return
movedown: if bottomrow%=(H%-1) then return bottomrow% = bottomrow% + 1 toprow% = toprow% + 1 2d_image_paste 41,0,0 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% return
tune: if ntune%>=63 message "Too many tune sections" return end_if ntune% = ntune% + 1 s$ = trim$(text$(34)) if s$="" then s$ = "Tune "+str$(ntune%) item_add 42,str$(ntune%)+","+str$(leftcol%)+","+str$(toprow%)+","+str$(rightcol%)+","+str$(bottomrow%)+","+s$ 2d_target_is 3 2d_fill_on 2d_fill_color 255,255,ntune%*4 2d_pen_color 255,255,ntune%*4 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% 2d_target_is 2 2d_pen_color 255,0,0 2d_fill_off caption 32,"Tunes: "+str$(ntune%) return
right90: RotatePictureRight(1) 2d_target_is 2 2d_image_paste 41,0,0 RotatePictureRight(2) 2d_image_copy 41,0,0,img_w%-1,img_h%-1 RotatePictureRight(3) RotateTunesRight() AdjustAngle(0-90) 2d_target_is 2 return
left90: RotatePictureLeft(1) 2d_target_is 2 2d_image_paste 41,0,0 RotatePictureLeft(2) 2d_image_copy 41,0,0,img_w%-1,img_h%-1 RotatePictureLeft(3) RotateTunesLeft() AdjustAngle(90) 2d_target_is 2 return sub AdjustAngle(delta%) ' adapter les noms des fichiers: f$, fm$, ft$, fl$ dim_local s$, p1%, p2%, a$, oldangle% oldangle% = angle% angle% = angle% + delta% if angle%<0 then angle% = 270 if angle%=360 then angle% = 0 if angle%>0 : ' placer l'angle if oldangle%=0 : ' insérer l'angle ' nom.bmp ==> nom(xxx).bmp ' nom_mask.bmp ==> nom(xxx)_mask.bmp ' nom_mask_tuned.bmp ==> nom(xxx)_mask_tuned.bmp ' nom_mask_tuned_list.bmp ==> nom(xxx)_mask_tuned_list.bmp a$ = "("+str$(angle%)+")" p1% = instr(f$,".") f$ = left$(f$,p1%-1)+a$+mid$(f$,p1%,len(f$)) p1% = instr(fm$,"_mask") fm$ = left$(fm$,p1%-1)+a$+mid$(fm$,p1%,len(fm$)) p1% = instr(ft$,"_mask") ft$ = left$(ft$,p1%-1)+a$+mid$(ft$,p1%,len(ft$)) p1% = instr(fl$,"_mask") fl$ = left$(fl$,p1%-1)+a$+mid$(fl$,p1%,len(fl$)) else : ' remplacer l'angle ' nom(xxx).bmp ==> nom(yyy).bmp ' nom(xxx)_mask.bmp ==> nom(yyy)_mask.bmp ' nom(xxx)_mask_tuned.bmp ==> nom(yyy)_mask_tuned.bmp ' nom(xxx)_mask_tuned_list.bmp ==> nom(yyy)_mask_tuned_list.bmp a$ = "("+str$(angle%)+")" p1% = instr(f$,"(") p2% = instr(f$,")") f$ = left$(f$,p1%-1)+a$+mid$(f$,p2%+1,len(f$)) p1% = instr(fm$,"(") p2% = instr(fm$,")") fm$ = left$(fm$,p1%-1)+a$+mid$(fm$,p2%+1,len(fm$)) p1% = instr(ft$,"(") p2% = instr(ft$,")") ft$ = left$(ft$,p1%-1)+a$+mid$(ft$,p2%+1,len(ft$)) p1% = instr(fl$,"(") p2% = instr(fl$,")") fl$ = left$(fl$,p1%-1)+a$+mid$(fl$,p2%+1,len(fl$)) end_if else : ' retirer l'angle ' nom(xxx).bmp ==> nom.bmp ' nom(xxx)_mask.bmp ==> nom_mask.bmp ' nom(xxx)_mask_tuned.bmp ==> nom_mask_tuned.bmp ' nom(xxx)_mask_tuned_list.bmp ==> nom_mask_tuned_list.bmp p1% = instr(f$,"(") p2% = instr(f$,")") f$ = left$(f$,p1%-1)+mid$(f$,p2%+1,len(f$)) p1% = instr(fm$,"(") p2% = instr(fm$,")") fm$ = left$(fm$,p1%-1)+mid$(fm$,p2%+1,len(fm$)) p1% = instr(ft$,"(") p2% = instr(ft$,")") ft$ = left$(ft$,p1%-1)+mid$(ft$,p2%+1,len(ft$)) p1% = instr(fl$,"(") p2% = instr(fl$,")") fl$ = left$(fl$,p1%-1)+mid$(fl$,p2%+1,len(fl$)) end_if caption 5,"Angle: "+str$(angle%)+"°" s$ = "Nouveaux noms de fichiers:"+chr$(13)+chr$(10) message s$+f$+chr$(13)+chr$(10)+fm$+chr$(13)+chr$(10)+ft$+chr$(13)+chr$(10)+fl$+chr$(13)+chr$(10) end_sub
sub RotatePictureLeft(pic%) dim_local w%, h%, l%, c% caption 69,"Wait please.." h% = height(pic%) : w% = width(pic%) width 4,h% : height 4,w% 2d_target_is 4 for l%=0 to h%-1 for c%=0 to w%-1 2d_pen_color color_pixel_red(pic%,c%,l%),color_pixel_green(pic%,c%,l%),color_pixel_blue(pic%,c%,l%) 2d_point l%,w%-c%-1 next c% caption 69,"Wait please... "+str$(int(l%*100/h%))+" %" display next l% width pic%,h% : height pic%,w% color pic%,0,0,0 2d_image_copy 43,0,0,h%-1,w%-1 2d_target_is pic% 2d_image_paste 43,0,0 caption 69,"" end_sub
sub RotatePictureRight(pic%) dim_local w%, h%, l%, c% caption 69,"Wait please.." h% = height(pic%) : w% = width(pic%) width 4,h% : height 4,w% 2d_target_is 4 for l%=0 to h%-1 for c%=0 to w%-1 2d_pen_color color_pixel_red(pic%,c%,l%),color_pixel_green(pic%,c%,l%),color_pixel_blue(pic%,c%,l%) 2d_point h%-l%-1,c% next c% caption 69,"Wait please... "+str$(int(l%*100/h%))+" %" display next l% width pic%,h% : height pic%,w% color pic%,0,0,0 2d_image_copy 43,0,0,h%-1,w%-1 2d_target_is pic% 2d_image_paste 43,0,0 caption 69,"" end_sub
sub RotateTunesLeft() dim_local t%, t$, n$, p%, nt%, lc%, tr%, rc%, br%, lcx%, trx%, rcx%, brx% if count(42)>0 caption 69,"Tune transposition..." display for t%=1 to count(42) t$ = item_read$(42,t%) p% = instr(t$,",") nt% = val(left$(t$,p%-1)) t$ = mid$(t$,p%+1,100) p% = instr(t$,",") lcx% = val(left$(t$,p%-1)) t$ = mid$(t$,p%+1,100) p% = instr(t$,",") trx% = val(left$(t$,p%-1)) t$ = mid$(t$,p%+1,100) p% = instr(t$,",") rcx% = val(left$(t$,p%-1)) t$ = mid$(t$,p%+1,100) p% = instr(t$,",") brx% = val(left$(t$,p%-1)) n$ = mid$(t$,p%+1,100)
lc% = trx% tr% = rcx% rc% = brx% br% = lcx% item_delete 42,t% item_insert 42,t%,str$(nt%)+","+str$(lc%)+","+str$(tr%)+","+str$(rc%)+","+str$(br%)+","+n$ next t% caption 69,"" end_if ' ajuster les coordonnées du rectangle actuel ' message str$(lc%)+","+str$(tr%)+"/"+str$(rc%)+","+str$(br%)+" => "+str$(leftcol%)+","+str$(toprow%)+"/"+str$(rightcol%)+","+str$(bottomrow%) lc% = leftcol% tr% = toprow% rc% = rightcol% br% = bottomrow% leftcol% = tr% toprow% = rc% rightcol% = br% bottomrow% = lc% ' ajuster les variables donnant les dimensions actuelles img_w% = width(1) img_h% = height(1) w% = img_w% h% = img_h% end_sub
sub RotateTunesRight() dim_local t%, t$, n$, p%, nt%, lc%, tr%, rc%, br%, lcx%, trx%, rcx%, brx% if count(42)>0 caption 69,"Tune transposition..." display for t%=1 to count(42) t$ = item_read$(42,t%) p% = instr(t$,",") nt% = val(left$(t$,p%-1)) t$ = mid$(t$,p%+1,100) p% = instr(t$,",") lcx% = val(left$(t$,p%-1)) t$ = mid$(t$,p%+1,100) p% = instr(t$,",") trx% = val(left$(t$,p%-1)) t$ = mid$(t$,p%+1,100) p% = instr(t$,",") rcx% = val(left$(t$,p%-1)) t$ = mid$(t$,p%+1,100) p% = instr(t$,",") brx% = val(left$(t$,p%-1)) n$ = mid$(t$,p%+1,100)
lc% = w%-brx%-1 tr% = lcx% rc% = w%-trx%-1 br% = rcx%
item_delete 42,t% item_insert 42,t%,str$(nt%)+","+str$(lc%)+","+str$(tr%)+","+str$(rc%)+","+str$(br%)+","+n$ next t% caption 69,"" end_if ' ajuster les coordonnées du rectangle actuel lc% = leftcol% tr% = toprow% rc% = rightcol% br% = bottomrow% leftcol% = w%-br%-1 toprow% = lc% rightcol% = w%-tr%-1 bottomrow% = rc% ' ajuster les variables donnant les dimensions actuelles img_w% = width(1) img_h% = height(1) w% = img_w% h% = img_h% end_sub sub GetAngle(f$) dim_local p1%, p2% angle% = 0 p1% = instr(f$,"(") if p1%>0 p2% = instr(f$,")") if p2%>p1% angle%=val(mid$(f$,p1%+1,p2%-p1%-1)) end_if end_if caption 5,"Angle: "+str$(angle%)+"°" end_sub
Sur le WebDav, dossier Sources\KGF\, il y a un fichier Android_4_orientations.zip qui contient mon sprite Android en position normale et tourné à 90°, 180° et 270°, y compris les tunes. Vous pouvez d'ailleurs charger n'importe quelle orientation par le bouton "Load image", comme celle de 270° par exemple en sélectionnant le fichier Android(270).bmp, et le programme reconnaîtra automatiquement l'angle de rotation. | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Construire un masque pour les sprites Lun 15 Juin 2015 - 7:17 | |
| Très bien. Peut-être ajouter les 2 miroirs aussi (horizontal et vertical ?) | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Construire un masque pour les sprites Lun 15 Juin 2015 - 10:29 | |
| | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Construire un masque pour les sprites Lun 15 Juin 2015 - 11:21 | |
| | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Construire un masque pour les sprites Lun 15 Juin 2015 - 11:36 | |
| Et voilà: miroir horizontal et vertical. En plus, affichage du nom et du chemin du sprite de base dans le titre: - Code:
-
' build_sprite_mask.bas
label build, load, save, loadm, savem, savet, rect, tune, close100 label enlargeup, moveup, moveleft, enlargeleft, moveright, reduceright, movedown, reducedown label right90, left90, flipleft, flipdown
dim s$, f$, fm$, ft$, fl$, w%, h%, x%, y%, toprow%, bottomrow%, leftcol%, rightcol%, ntune% dim img_w%, img_h%, angle%
hide 0 form 100 : caption 100,"Taille du sprite" : on_close 100,close100 alpha 101 : parent 101,100 : top 101,20 : left 101,20 : caption 101,"Largeur:" spin 102 : parent 102,100 : top 102,20 : left 102,100 : width 102,60 min 102,10 : max 102,200 : position 102,200 alpha 103 : parent 103,100 : top 103,50 : left 103,20 : caption 103,"Hauteur:" spin 104 : parent 104,100 : top 104,50 : left 104,100 : width 104,60 min 104,10 : max 104,200 : position 104,200 button 105 : parent 105,100 : top 105,80 : left 105,100 : caption 105,"Valider" on_click 105,close100
width 0,1000 : height 0,600
picture 1 : top 1,10 : left 1, 10 : width 1,200 : height 1,200 picture 2 : top 2,10 : left 2,350 : width 2,200 : height 2,200 picture 3 : top 3,10 : left 3,560 : width 3,200 : height 3,200 picture 4 : top 4,300 : left 4,750 : width 4,200 : height 4,200 : ' hide 4 alpha 5 : top 5,280 : left 5,60
image 41 dlist 42 image 43
button 10 : top 10,90 : left 10,240 : caption 10,"Build mask" : on_click 10,build button 11 : top 11,220 : left 11,50 : caption 11,"Load image" : on_click 11,load button 16 : top 16,250 : left 16,50 : caption 16,"Save image" : on_click 16,save button 12 : top 12,220 : left 12,390 : caption 12,"Load mask" : on_click 12,loadm button 13 : top 13,250 : left 13,390 : caption 13,"Save mask" : on_click 13,savem button 15 : top 15,250 : left 15,600 : caption 15,"Save tune" : on_click 15,savet
button 52 : top 52,310 : left 52,390 : caption 52,"Move ^" : on_click 52,moveup : hide 52 button 51 : top 51,340 : left 51,390 : caption 51,"Enlarge ^" : on_click 51,enlargeup : hide 51 button 50 : top 50,370 : left 50,370 : caption 50,"Rectangle" : on_click 50,rect : hide 50 : width 50,60 button 59 : top 59,370 : left 59,430 : caption 59,"Tune" : on_click 59,tune : hide 59 : width 59,60 button 54 : top 54,370 : left 54,290 : caption 54,"Enlarge <" : on_click 54,enlargeleft : hide 54 button 53 : top 53,370 : left 53,210 : caption 53,"Move <" : on_click 53,moveleft : hide 53 button 55 : top 55,370 : left 55,500 : caption 55,"Reduce >" : on_click 55,reduceright : hide 55 button 56 : top 56,370 : left 56,580 : caption 56,"Move >" : on_click 56,moveright : hide 56 button 57 : top 57,430 : left 57,390 : caption 57,"Move v" : on_click 57,movedown : hide 57 button 58 : top 58,400 : left 58,390 : caption 58,"Reduce v" : on_click 58,reducedown : hide 58
button 61 : top 61,60 : left 61,770 : width 61,90 : caption 61,"Rotate right 90°" : on_click 61,right90 : hide 61 button 62 : top 62,60 : left 62,870 : width 62,90 : caption 62,"Rotate left 90°" : on_click 62,left90 : hide 62 button 63 : top 63,90 : left 63,770 : width 63,90 : caption 63,"Flip horizontally" : on_click 63,flipleft : hide 63 button 64 : top 64,90 : left 64,870 : width 64,90 : caption 64,"Flip vertically" : on_click 64,flipdown : hide 64 alpha 69 : top 69,120 : left 69,810
open_dialog 20 : filter 20,"*.bmp|*.bmp" save_dialog 21 : filter 21,"*.bmp|*.bmp" alpha 31 : top 31,120 : left 31,230 alpha 32 : top 32,220 : left 32,600 : caption 32,"Tunes: 0" alpha 33 : top 33,430 : left 33,500 : caption 33,"Tune name:" : hide 33 edit 34 : top 34,430 : left 34,570 : width 34,150 : hide 34
w% = width(1) h% = height(1)
end
close100: img_w% = val(text$(102)) img_h% = val(text$(104)) width 1,img_w% : height 1,img_h% width 2,img_w% : height 2,img_h% width 3,img_w% : height 3,img_h% width 4,img_w% : height 4,img_h% w% = width(1) h% = height(1) hide 100 show 0 return
build: caption 31,"Wait please..." display 2d_target_is 2 for y%=0 to h%-1 for x%=0 to w%-1 if (color_pixel_red(1,x%,y%)=0) and (color_pixel_green(1,x%,y%)=0) and (color_pixel_blue(1,x%,y%)=0) 2d_pen_color 0,0,0 else 2d_pen_color 255,255,255 end_if 2d_point x%,y% next x% caption 31,"Wait please... "+str$(int(y%*100/img_h%))+" %" display next y% 2d_image_copy 41,0,0,img_w%-1,img_h%-1 2d_target_is 3 2d_image_paste 41,0,0 2d_target_is 2 show 50 : hide 51 : hide 52 : hide 53 : hide 54 : hide 55 : hide 56 : hide 57 : hide 58 : hide 59 hide 33 : hide 34 : hide 61 : hide 62 : hide 63 : hide 64 ntune% = 0 caption 32,"Tunes: "+str$(ntune%) clear 42 caption 31,"" return load: ' Le nom du fichier doit contenir l'angle de rotation de l'image, sous forme: ' xxx(nnn).bmp ' Si l'angle est 0 (pas de rotation), la portion "(nnn)" peut ne pas être indiquée. s$ = file_name$(20) if s$="_" then return if lower$(right$(s$,4))<>".bmp" then s$ = s$ + bmp if (instr(s$,"_mask.bmp")>0) or (instr(s$,"_tuned.bmp")>0) or (instr(s$,"_list.txt")>0) message "Invalid image file name format" return end_if f$ = s$ fm$ = left$(f$,len(f$)-4)+"_mask.bmp" ft$ = left$(fm$,len(fm$)-4)+"_tuned.bmp" fl$ = left$(fm$,len(fm$)-4)+"_tuned_list.txt" file_load 1,f$ if file_exists(fm$)=1 file_load 2,fm$ 2d_target_is 2 2d_image_copy 41,0,0,img_w%-1,img_h%-1 if file_exists(ft$)=1 file_load 3,ft$ if file_exists(fl$)=1 file_load 42,fl$ else clear 42 end_if else color 3,255,255,255 clear 42 end_if show 50 else color 2,255,255,255 color 3,255,255,255 clear 42 hide 50 end_if ntune% = count(42) GetAngle(f$) 2d_target_is 2 caption 32,"Tunes: "+str$(ntune%) caption 0,f$ hide 51 : hide 52 : hide 53 : hide 54 : hide 55 : hide 56 : hide 57 : hide 58 : hide 59 hide 33 : hide 34 : hide 61 : hide 62 : hide 63 : hide 64 return loadm: s$ = file_name$(20) if s$="_" then return if right$(s$,4)<>".bmp" then s$ = s$ + ".bmp" if right$(s$,9)<>"_mask.bmp" message "Invalid mask file name format" return end_if if file_exists(s$)=0 message "Masl file not found" return end_if f$ = left$(s$,len(s$)-9) + ".bmp" fm$ = s$ ft$ = left$(fm$,len(s$)-4)+"_tuned.bmp" fl$ = left$(fm$,len(s$)-4)+"_tuned_list.txt" file_load 2,fm$ 2d_target_is 2 2d_image_copy 41,0,0,img_w%-1,img_h%-1 if file_exists(ft$)=1 file_load 3,ft$ if file_exists(fl$)=1 file_load 42,fl$ ntune% = count(42) else clear 42 ntune% = 0 end_if else 2d_target_is 3 2d_image_paste 41,0,0 ntune% = 0 clear 42 end_if caption 32,"Tunes: "+str$(ntune%) 2d_target_is 2 show 50 : hide 51 : hide 52 : hide 53 : hide 54 : hide 55 : hide 56 : hide 57 : hide 58 : hide 59 hide 33 : hide 34 : hide 61 : hide 62 : hide 63 : hide 64 return
save: if file_exists(f$)=1 if message_confirmation_yes_no("File does already exist. Replace it ?")<>1 then return end_if file_save 1,f$ 2d_target_is 2 2d_image_paste 41,0,0 file_save 2,fm$ file_save 3,ft$ file_save 42,fl$ s$ = "image saved into: "+f$+chr$(13)+chr$(10) s$ = s$ + "mask saved into: "+fm$+chr$(13)+chr$(10) s$ = s$ + "tuned mask saved into: "+ft$+chr$(13)+chr$(10) s$ = s$ + "tuned list saved into: "+fl$ message s$ caption 0,f$ return
savem: if file_exists(fm$)=1 if message_confirmation_yes_no("File does already exist. Replace it ?")<>1 then return end_if file_save 2,fm$ file_save 3,ft$ file_save 42,fl$ s$ = "mask saved into: "+fm$+chr$(13)+chr$(10) s$ = s$ + "tuned mask saved into: "+ft$+chr$(13)+chr$(10) s$ = s$ + "tuned list saved into: "+fl$ message s$ return savet: if file_exists(ft$)=1 if message_confirmation_yes_no("File does already exist. Replace it ?")<>1 then return end_if file_save 3,ft$ file_save 42,fl$ s$ = "tuned mask saved into: "+ft$+chr$(13)+chr$(10) s$ = s$ + "tuned list saved into: "+fl$ message s$ return
rect: 2d_target_is 2 2d_image_paste 41,0,0 toprow% = int(img_h%/4) bottomrow% = int((img_h%*3)/4) leftcol% = int(img_w%/4) rightcol% = int((img_w%*3)/4) 2d_pen_color 255,0,0 2d_fill_off 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% show 51 : show 52 : show 53 : show 54 : show 55 : show 56 : show 57 : show 58 : show 59 show 33 : show 34 : show 61 : show 62 : show 63 : show 64 return
enlargeup: if toprow%=0 then return toprow% = toprow% - 1 2d_image_paste 41,0,0 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% return moveup: if toprow%=0 then return toprow% = toprow% - 1 bottomrow% = bottomrow% - 1 2d_image_paste 41,0,0 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% return
moveleft: if leftcol%=0 then return leftcol% = leftcol% - 1 rightcol% = rightcol% - 1 2d_image_paste 41,0,0 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% return
enlargeleft: if leftcol%=0 then return leftcol% = leftcol% - 1 2d_image_paste 41,0,0 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% return
moveright: if rightcol%=(w%-1) then return rightcol% = rightcol% + 1 leftcol% = leftcol% + 1 2d_image_paste 41,0,0 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% return
reduceright: if rightcol%=leftcol% then return rightcol% = rightcol% - 1 2d_image_paste 41,0,0 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% return
reducedown: if bottomrow%=toprow% then return bottomrow% = bottomrow% - 1 2d_image_paste 41,0,0 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% return
movedown: if bottomrow%=(H%-1) then return bottomrow% = bottomrow% + 1 toprow% = toprow% + 1 2d_image_paste 41,0,0 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% return
tune: if ntune%>=63 message "Too many tune sections" return end_if ntune% = ntune% + 1 s$ = trim$(text$(34)) if s$="" then s$ = "Tune "+str$(ntune%) item_add 42,str$(ntune%)+","+str$(leftcol%)+","+str$(toprow%)+","+str$(rightcol%)+","+str$(bottomrow%)+","+s$ 2d_target_is 3 2d_fill_on 2d_fill_color 255,255,ntune%*4 2d_pen_color 255,255,ntune%*4 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% 2d_target_is 2 2d_pen_color 255,0,0 2d_fill_off caption 32,"Tunes: "+str$(ntune%) return
right90: RotatePictureRight(1) 2d_target_is 2 2d_image_paste 41,0,0 RotatePictureRight(2) 2d_image_copy 41,0,0,img_w%-1,img_h%-1 RotatePictureRight(3) RotateTunesRight() AdjustAngle(0-90) 2d_target_is 2 return
left90: RotatePictureLeft(1) 2d_target_is 2 2d_image_paste 41,0,0 RotatePictureLeft(2) 2d_image_copy 41,0,0,img_w%-1,img_h%-1 RotatePictureLeft(3) RotateTunesLeft() AdjustAngle(90) 2d_target_is 2 return
flipdown: FlipPictureDown(1) 2d_target_is 2 2d_image_paste 41,0,0 FlipPictureDown(2) 2d_image_copy 41,0,0,img_w%-1,img_h%-1 FlipPictureDown(3) FlipTunesDown() 2d_target_is 2 return
flipleft: FlipPictureLeft(1) 2d_target_is 2 2d_image_paste 41,0,0 FlipPictureLeft(2) 2d_image_copy 41,0,0,img_w%-1,img_h%-1 FlipPictureLeft(3) FlipTunesLeft() 2d_target_is 2 return
sub AdjustAngle(delta%) ' adapter les noms des fichiers: f$, fm$, ft$, fl$ dim_local s$, p1%, p2%, a$, oldangle% oldangle% = angle% angle% = angle% + delta% if angle%<0 then angle% = 270 if angle%=360 then angle% = 0 if angle%>0 : ' placer l'angle if oldangle%=0 : ' insérer l'angle ' nom.bmp ==> nom(xxx).bmp ' nom_mask.bmp ==> nom(xxx)_mask.bmp ' nom_mask_tuned.bmp ==> nom(xxx)_mask_tuned.bmp ' nom_mask_tuned_list.bmp ==> nom(xxx)_mask_tuned_list.bmp a$ = "("+str$(angle%)+")" p1% = instr(f$,".") f$ = left$(f$,p1%-1)+a$+mid$(f$,p1%,len(f$)) p1% = instr(fm$,"_mask") fm$ = left$(fm$,p1%-1)+a$+mid$(fm$,p1%,len(fm$)) p1% = instr(ft$,"_mask") ft$ = left$(ft$,p1%-1)+a$+mid$(ft$,p1%,len(ft$)) p1% = instr(fl$,"_mask") fl$ = left$(fl$,p1%-1)+a$+mid$(fl$,p1%,len(fl$)) else : ' remplacer l'angle ' nom(xxx).bmp ==> nom(yyy).bmp ' nom(xxx)_mask.bmp ==> nom(yyy)_mask.bmp ' nom(xxx)_mask_tuned.bmp ==> nom(yyy)_mask_tuned.bmp ' nom(xxx)_mask_tuned_list.bmp ==> nom(yyy)_mask_tuned_list.bmp a$ = "("+str$(angle%)+")" p1% = instr(f$,"(") p2% = instr(f$,")") f$ = left$(f$,p1%-1)+a$+mid$(f$,p2%+1,len(f$)) p1% = instr(fm$,"(") p2% = instr(fm$,")") fm$ = left$(fm$,p1%-1)+a$+mid$(fm$,p2%+1,len(fm$)) p1% = instr(ft$,"(") p2% = instr(ft$,")") ft$ = left$(ft$,p1%-1)+a$+mid$(ft$,p2%+1,len(ft$)) p1% = instr(fl$,"(") p2% = instr(fl$,")") fl$ = left$(fl$,p1%-1)+a$+mid$(fl$,p2%+1,len(fl$)) end_if else : ' retirer l'angle ' nom(xxx).bmp ==> nom.bmp ' nom(xxx)_mask.bmp ==> nom_mask.bmp ' nom(xxx)_mask_tuned.bmp ==> nom_mask_tuned.bmp ' nom(xxx)_mask_tuned_list.bmp ==> nom_mask_tuned_list.bmp p1% = instr(f$,"(") p2% = instr(f$,")") f$ = left$(f$,p1%-1)+mid$(f$,p2%+1,len(f$)) p1% = instr(fm$,"(") p2% = instr(fm$,")") fm$ = left$(fm$,p1%-1)+mid$(fm$,p2%+1,len(fm$)) p1% = instr(ft$,"(") p2% = instr(ft$,")") ft$ = left$(ft$,p1%-1)+mid$(ft$,p2%+1,len(ft$)) p1% = instr(fl$,"(") p2% = instr(fl$,")") fl$ = left$(fl$,p1%-1)+mid$(fl$,p2%+1,len(fl$)) end_if caption 5,"Angle: "+str$(angle%)+"°" caption 0,f$ s$ = "Nouveaux noms de fichiers:"+chr$(13)+chr$(10) message s$+f$+chr$(13)+chr$(10)+fm$+chr$(13)+chr$(10)+ft$+chr$(13)+chr$(10)+fl$+chr$(13)+chr$(10) end_sub
sub RotatePictureLeft(pic%) dim_local w%, h%, l%, c% caption 69,"Wait please.." h% = height(pic%) : w% = width(pic%) width 4,h% : height 4,w% 2d_target_is 4 for l%=0 to h%-1 for c%=0 to w%-1 2d_pen_color color_pixel_red(pic%,c%,l%),color_pixel_green(pic%,c%,l%),color_pixel_blue(pic%,c%,l%) 2d_point l%,w%-c%-1 next c% caption 69,"Wait please... "+str$(int(l%*100/h%))+" %" display next l% width pic%,h% : height pic%,w% color pic%,0,0,0 2d_image_copy 43,0,0,h%-1,w%-1 2d_target_is pic% 2d_image_paste 43,0,0 caption 69,"" end_sub
sub FlipPictureLeft(pic%) dim_local w%, h%, l%, c% caption 69,"Wait please.." h% = height(pic%) : w% = width(pic%) width 4,h% : height 4,w% 2d_target_is 4 for l%=0 to h%-1 for c%=0 to w%-1 2d_pen_color color_pixel_red(pic%,c%,l%),color_pixel_green(pic%,c%,l%),color_pixel_blue(pic%,c%,l%) 2d_point w%-c%-1,l% next c% caption 69,"Wait please... "+str$(int(l%*100/h%))+" %" display next l% width pic%,h% : height pic%,w% color pic%,0,0,0 2d_image_copy 43,0,0,h%-1,w%-1 2d_target_is pic% 2d_image_paste 43,0,0 caption 69,"" end_sub
sub FlipPictureDown(pic%) dim_local w%, h%, l%, c% caption 69,"Wait please.." h% = height(pic%) : w% = width(pic%) width 4,h% : height 4,w% 2d_target_is 4 for l%=0 to h%-1 for c%=0 to w%-1 2d_pen_color color_pixel_red(pic%,c%,l%),color_pixel_green(pic%,c%,l%),color_pixel_blue(pic%,c%,l%) 2d_point c%,h%-l%-1 next c% caption 69,"Wait please... "+str$(int(l%*100/h%))+" %" display next l% width pic%,h% : height pic%,w% color pic%,0,0,0 2d_image_copy 43,0,0,h%-1,w%-1 2d_target_is pic% 2d_image_paste 43,0,0 caption 69,"" end_sub
sub RotatePictureRight(pic%) dim_local w%, h%, l%, c% caption 69,"Wait please.." h% = height(pic%) : w% = width(pic%) width 4,h% : height 4,w% 2d_target_is 4 for l%=0 to h%-1 for c%=0 to w%-1 2d_pen_color color_pixel_red(pic%,c%,l%),color_pixel_green(pic%,c%,l%),color_pixel_blue(pic%,c%,l%) 2d_point h%-l%-1,c% next c% caption 69,"Wait please... "+str$(int(l%*100/h%))+" %" display next l% width pic%,h% : height pic%,w% color pic%,0,0,0 2d_image_copy 43,0,0,h%-1,w%-1 2d_target_is pic% 2d_image_paste 43,0,0 caption 69,"" end_sub
sub RotateTunesLeft() dim_local t%, t$, n$, p%, nt%, lc%, tr%, rc%, br%, lcx%, trx%, rcx%, brx% if count(42)>0 caption 69,"Tune transposition..." display for t%=1 to count(42) t$ = item_read$(42,t%) p% = instr(t$,",") nt% = val(left$(t$,p%-1)) t$ = mid$(t$,p%+1,100) p% = instr(t$,",") lcx% = val(left$(t$,p%-1)) t$ = mid$(t$,p%+1,100) p% = instr(t$,",") trx% = val(left$(t$,p%-1)) t$ = mid$(t$,p%+1,100) p% = instr(t$,",") rcx% = val(left$(t$,p%-1)) t$ = mid$(t$,p%+1,100) p% = instr(t$,",") brx% = val(left$(t$,p%-1)) n$ = mid$(t$,p%+1,100)
lc% = trx% tr% = rcx% rc% = brx% br% = lcx% item_delete 42,t% item_insert 42,t%,str$(nt%)+","+str$(lc%)+","+str$(tr%)+","+str$(rc%)+","+str$(br%)+","+n$ next t% caption 69,"" end_if ' ajuster les coordonnées du rectangle actuel ' message str$(lc%)+","+str$(tr%)+"/"+str$(rc%)+","+str$(br%)+" => "+str$(leftcol%)+","+str$(toprow%)+"/"+str$(rightcol%)+","+str$(bottomrow%) lc% = leftcol% tr% = toprow% rc% = rightcol% br% = bottomrow% leftcol% = tr% toprow% = rc% rightcol% = br% bottomrow% = lc% ' ajuster les variables donnant les dimensions actuelles img_w% = width(1) img_h% = height(1) w% = img_w% h% = img_h% end_sub
sub RotateTunesRight() dim_local t%, t$, n$, p%, nt%, lc%, tr%, rc%, br%, lcx%, trx%, rcx%, brx% if count(42)>0 caption 69,"Tune transposition..." display for t%=1 to count(42) t$ = item_read$(42,t%) p% = instr(t$,",") nt% = val(left$(t$,p%-1)) t$ = mid$(t$,p%+1,100) p% = instr(t$,",") lcx% = val(left$(t$,p%-1)) t$ = mid$(t$,p%+1,100) p% = instr(t$,",") trx% = val(left$(t$,p%-1)) t$ = mid$(t$,p%+1,100) p% = instr(t$,",") rcx% = val(left$(t$,p%-1)) t$ = mid$(t$,p%+1,100) p% = instr(t$,",") brx% = val(left$(t$,p%-1)) n$ = mid$(t$,p%+1,100)
lc% = w%-brx%-1 tr% = lcx% rc% = w%-trx%-1 br% = rcx%
item_delete 42,t% item_insert 42,t%,str$(nt%)+","+str$(lc%)+","+str$(tr%)+","+str$(rc%)+","+str$(br%)+","+n$ next t% caption 69,"" end_if ' ajuster les coordonnées du rectangle actuel lc% = leftcol% tr% = toprow% rc% = rightcol% br% = bottomrow% leftcol% = w%-br%-1 toprow% = lc% rightcol% = w%-tr%-1 bottomrow% = rc% ' ajuster les variables donnant les dimensions actuelles img_w% = width(1) img_h% = height(1) w% = img_w% h% = img_h% end_sub
sub FlipTunesLeft() dim_local t%, t$, n$, p%, nt%, lc%, tr%, rc%, br%, lcx%, trx%, rcx%, brx% if count(42)>0 caption 69,"Tune transposition..." display for t%=1 to count(42) t$ = item_read$(42,t%) p% = instr(t$,",") nt% = val(left$(t$,p%-1)) t$ = mid$(t$,p%+1,100) p% = instr(t$,",") lcx% = val(left$(t$,p%-1)) t$ = mid$(t$,p%+1,100) p% = instr(t$,",") trx% = val(left$(t$,p%-1)) t$ = mid$(t$,p%+1,100) p% = instr(t$,",") rcx% = val(left$(t$,p%-1)) t$ = mid$(t$,p%+1,100) p% = instr(t$,",") brx% = val(left$(t$,p%-1)) n$ = mid$(t$,p%+1,100)
lc% = w%-rcx%-1 tr% = trx% rc% = w%-lcx%-1 br% = brx%
item_delete 42,t% item_insert 42,t%,str$(nt%)+","+str$(lc%)+","+str$(tr%)+","+str$(rc%)+","+str$(br%)+","+n$ next t% caption 69,"" end_if ' ajuster les coordonnées du rectangle actuel ' message str$(lc%)+","+str$(tr%)+"/"+str$(rc%)+","+str$(br%)+" => "+str$(leftcol%)+","+str$(toprow%)+"/"+str$(rightcol%)+","+str$(bottomrow%) lc% = w%-rightcol%-1 tr% = toprow% rc% = w%-leftcol%-1 br% = bottomrow% leftcol% = lc% toprow% = tr% rightcol% = rc% bottomrow% = br% end_sub
sub FlipTunesDown() dim_local t%, t$, n$, p%, nt%, lc%, tr%, rc%, br%, lcx%, trx%, rcx%, brx% if count(42)>0 caption 69,"Tune transposition..." display for t%=1 to count(42) t$ = item_read$(42,t%) p% = instr(t$,",") nt% = val(left$(t$,p%-1)) t$ = mid$(t$,p%+1,100) p% = instr(t$,",") lcx% = val(left$(t$,p%-1)) t$ = mid$(t$,p%+1,100) p% = instr(t$,",") trx% = val(left$(t$,p%-1)) t$ = mid$(t$,p%+1,100) p% = instr(t$,",") rcx% = val(left$(t$,p%-1)) t$ = mid$(t$,p%+1,100) p% = instr(t$,",") brx% = val(left$(t$,p%-1)) n$ = mid$(t$,p%+1,100)
lc% = lcx% tr% = h%-brx%-1 rc% = rcx% br% = h%-trx%-1
item_delete 42,t% item_insert 42,t%,str$(nt%)+","+str$(lc%)+","+str$(tr%)+","+str$(rc%)+","+str$(br%)+","+n$ next t% caption 69,"" end_if ' ajuster les coordonnées du rectangle actuel ' message str$(lc%)+","+str$(tr%)+"/"+str$(rc%)+","+str$(br%)+" => "+str$(leftcol%)+","+str$(toprow%)+"/"+str$(rightcol%)+","+str$(bottomrow%) lc% = leftcol% tr% = h%-bottomrow%-1 rc% = rightcol% br% = h%-toprow%-1 leftcol% = lc% toprow% = tr% rightcol% = rc% bottomrow% = br% end_sub sub GetAngle(f$) dim_local p1%, p2% angle% = 0 p1% = instr(f$,"(") if p1%>0 p2% = instr(f$,")") if p2%>p1% angle%=val(mid$(f$,p1%+1,p2%-p1%-1)) end_if end_if caption 5,"Angle: "+str$(angle%)+"°" end_sub
| |
| | | Contenu sponsorisé
| Sujet: Re: Construire un masque pour les sprites | |
| |
| | | | Construire un masque pour les sprites | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |