Mai 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | | | Calendrier |
|
| | Construire un masque pour les sprites | |
| | |
Auteur | Message |
---|
Jicehel
Nombre de messages : 5947 Age : 51 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Construire un masque pour les sprites Lun 15 Juin 2015 - 11:53 | |
| cool, j'essaye ce soir | |
| | | Klaus
Nombre de messages : 12295 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Construire un masque pour les sprites Mar 16 Juin 2015 - 13:47 | |
| Nouvelle version: Il y a maintenant un numéro de version dans les commentaires au début du programme, et un historique des modifications. Version actuelle: V1.1 . Nouveauté: - correction de petits bugs - après clic sur le bouton "Rectangle", lorsque les boutons de pilotage des tunes sont affichés, on peut cliquer dans le picture de droite (celui qui symbolise les tunes) sur un des tunes. Le programme demande alors si l'on veut supprimer le tune sélectionné, et le supprime en cas de réponse positive. Voici le code: - Code:
-
' build_sprite_mask.bas
' historique des versions ' Version Date Motif ' ============================================================= ' V1.0 15/06/2015 Première version stable ' v1.1 16/06/2015 Suppression d'un tune par clic sur le tune
dim version$ : version$ = "V1.0 15/06/2015" dim debug% : debug% = 0 : ' pour tests e cours de développement...
label build, load, save, loadm, savem, savet, rect, tune, close100 label enlargeup, moveup, moveleft, enlargeleft, moveright, reduceright, movedown, reducedown label right90, left90, flipleft, flipdown, click3
dim s$, f$, fm$, ft$, fl$, w%, h%, x%, y%, i%, toprow%, bottomrow%, leftcol%, rightcol%, ntune% dim img_w%, img_h%, angle%, seltune%, tunes%(64,3), ntunes$(64)
hide 0 form 100 : caption 100,"Sprite size" : on_close 100,close100 alpha 101 : parent 101,100 : top 101,20 : left 101,20 : caption 101,"Width:" 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,"Height:" 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,"Validate" 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 : on_click 3,click3 picture 4 : top 4,300 : left 4,750 : width 4,200 : height 4,200 : ' hide 4 picture 6 : top 6,300 : left 6,10 : width 6,200 : height 6,200 : if debug%=0 then hide 6 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)
if debug%=1 then memo 123 : top 123,top(57)+height(57)+1 : left 123,left(57)-40
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 click3: if hide(51)=1 then return LocateTune() if seltune%>0 if message_confirmation_yes_no("Remove tune "+str$(seltune%)+"="+ntunes$(seltune%)+" ?")=1 ' copier de picture 2 dans picture 3 if debug%=1 then item_add 123,"del "+str$(tunes%(seltune%,0))+","+str$(tunes%(seltune%,1))+" "+str$(tunes%(seltune%,2))+","+str$(tunes%(seltune%,3))+" = "+ntunes$(seltune%)+chr$(13)+chr$(10)+item_read$(42,seltune%) 2d_target_is 6 2d_image_copy 43,tunes%(seltune%,0)-1,tunes%(seltune%,1)-1,tunes%(seltune%,2),tunes%(seltune%,3) 2d_target_is 3 2d_image_paste 43,tunes%(seltune%,0),tunes%(seltune%,1) 2d_target_is 2 ' supprimer le tune de la liste clear 42 if seltune%=ntune% ntune% = ntune% - 1 else for i%=seltune% to ntune%-1 tunes%(i%,0) = tunes%(i%+1,0) tunes%(i%,1) = tunes%(i%+1,1) tunes%(i%,2) = tunes%(i%+1,2) tunes%(i%,3) = tunes%(i%+1,3) ntunes$(i%) = ntunes$(i%+1) next i% end_if if ntune%>0 for i%=1 to ntune% item_add 42,str$(i%)+","+str$(tunes%(i%,0))+","+str$(tunes%(i%,1))+","+str$(tunes%(i%,2))+","+str$(tunes%(i%,3))+","+ntunes$(i%) next i% end_if end_if end_if 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 6 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 2d_target_is 6 2d_image_paste 41,0,0 2d_target_is 2 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) LoadTunes() 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%) tunes%(ntune%,0) = leftcol% tunes%(ntune%,1) = toprow% tunes%(ntune%,2) = rightcol% tunes%(ntune%,3) = bottomcol% ntunes$(ntune%) = s$ 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%,img_h% 2d_target_is 6 2d_image_paste 41,0,0 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%,img_h% 2d_target_is 6 2d_image_paste 41,0,0 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%,img_h% 2d_target_is 6 2d_image_paste 41,0,0 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%,img_h% 2d_target_is 6 2d_image_paste 41,0,0 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%, w%, h% if count(42)>0 caption 69,"Tune transposition..." display w% = width(1) h% = height(1) 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% = h%-rcx%-1 rc% = brx% br% = h%-lcx%-1 tunes%(t%,0) = lc% tunes%(t%,1) = tr% tunes%(t%,2) = rc% tunes%(t%,3) = br%
item_delete 42,t% item_insert 42,t%,str$(nt%)+","+str$(lc%)+","+str$(tr%)+","+str$(rc%)+","+str$(br%)+","+n$ if debug%=1 then item_add 123,item_read$(42,t%) 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% = h%-rc%-1 rightcol% = br% bottomrow% = h%-lc%-1 ' 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 w% = width(1) h% = height(1) 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%
tunes%(t%,0) = lc% tunes%(t%,1) = tr% tunes%(t%,2) = rc% tunes%(t%,3) = br%
item_delete 42,t% item_insert 42,t%,str$(nt%)+","+str$(lc%)+","+str$(tr%)+","+str$(rc%)+","+str$(br%)+","+n$ if debug%=1 then item_add 123,item_read$(42,t%) 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%
tunes%(t%,0) = lc% tunes%(t%,1) = tr% tunes%(t%,2) = rc% tunes%(t%,3) = br%
item_delete 42,t% item_insert 42,t%,str$(nt%)+","+str$(lc%)+","+str$(tr%)+","+str$(rc%)+","+str$(br%)+","+n$ if debug%=1 then item_add 123,item_read$(42,t%) 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
tunes%(t%,0) = lc% tunes%(t%,1) = tr% tunes%(t%,2) = rc% tunes%(t%,3) = br%
item_delete 42,t% item_insert 42,t%,str$(nt%)+","+str$(lc%)+","+str$(tr%)+","+str$(rc%)+","+str$(br%)+","+n$ if debug%=1 then item_add 123,item_read$(42,t%) next t% caption 69,"" end_if ' ajuster les coordonnées du rectangle actuel 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
sub LoadTunes() dim_local i%, t%, p%, s$ if ntune%=0 then exit_sub for t%=1 to ntune% s$ = item_read$(42,t%) p% = instr(s$,",") s$ = mid$(s$,p%+1,100) for i%=0 to 3 p% = instr(s$,",") tunes%(t%,i%) = val(left$(s$,p%-1)) s$ = mid$(s$,p%+1,100) next i% ntunes$(t%) = s$ if debug%=1 then item_add 123,str$(tunes%(t%,0))+","+str$(tunes%(t%,1))+" "+str$(tunes%(t%,2))+","+str$(tunes%(t%,3))+" = "+ntunes$(t%) next t% end_sub
sub LocateTune() dim_local x%, y%, t% seltune% = 0 if ntune%=0 then return x% = mouse_x_left_down(3) y% = mouse_y_left_down(3) if debug%=1 then item_add 123,str$(x%)+","+str$(y%) for t%=1 to ntune% if (x%>=tunes%(t%,0)) and (x%<=tunes%(t%,2)) if (y%>=tunes%(t%,1)) and (y%<=tunes%(t%,3)) seltune% = t% exit_sub end_if end_if next t% end_sub
Le fichier Android_4_orientations.zip a été mis à jour sur le WebDav, dossier Sources\KGF\. | |
| | | Jean Claude
Nombre de messages : 5950 Age : 69 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Construire un masque pour les sprites Mar 16 Juin 2015 - 14:03 | |
| Imperturbable !
Je suis, plus ou moins l'évolution, mais comme tu l'as vu je t'ai un peu laissé tombé. Mon niveau de programmation ne me permet pas de chevaucher plusieurs chevaux à la fois et surtout je ne veux pas tout mélanger.
Mais je ne perd pas de vue le sujet.
A+ | |
| | | Jicehel
Nombre de messages : 5947 Age : 51 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Construire un masque pour les sprites Mar 16 Juin 2015 - 14:45 | |
| C'est excellent Klaus. Bon, je pense que je devrais commencer maintenant à faire une petite banque de sprites pour les Panoramiciens et que je me mette enfin à commencer l'article... | |
| | | papydall
Nombre de messages : 7009 Age : 73 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Construire un masque pour les sprites Mar 16 Juin 2015 - 16:50 | |
| Au boulot Jicehel, au boulot! | |
| | | Klaus
Nombre de messages : 12295 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Construire un masque pour les sprites Mar 16 Juin 2015 - 20:00 | |
| Merci, Jicehel !
J'ai réfléchi un peu sur les rotations à d'autres angles que 90°. Et ça va être délicat. Pour les images, ça peut encore passer. Je choisis les formules suivantes pour calculer la rotation:
Soit O(0,0) l'origine du plan. Soit C(xc,yc) le centre du sprite à tourner. Donc: xc=width(picture du spritre)/2 yc=height(picture du spritre)/2 Soit P(xp,yp) un point quelconque su sprite Soit µ l'angle de rotation
Alors, les nouvelles coordonnées du point R(xr,yr) sont: xr=(xp-xc)*cos(µ) - (yp-yc)*sin(µ) + xc yr=(xp-xc)*cos(µ) - (yp-yc)*sin(µ) + yc
Je peux ainsi recalculer la position de chaque pixel. Dans l'image résultante, certains pixels seront perdues, et d'autres seront générés (noir) si l'on maintient les limites initiales du sprite. Si l'on adapte les dimensions au fur et mesure aux valeurs maxi horizontalement et verticalement, mais on génère encore plus de pixels. Ce qui tend à transformer le sprite initial, quelque soit sa forme, en un carré dont le côté est le plus grand diamètre du sprite initial. Et ce n'est pas ce que l'on souhaite. Est-ce que quelqu'un a une idée comment résoudre ce problème ?
Mais là où ça devient vraiment bloquant, c'est la notion des tunes. Tout l'algorithme est basé sur le fait que les tunes (zones sensibles d'un sprite) sont rectangulaires. Et lors d'une rotation, ça devient quoi? Le cas d'une rotation de 90° et particulier, et j'ai pu le résoudre facilement, étant donné qu'après une rotation de 90°, un rectangle reste un rectangle de mêmes dimensions, avec des bords parallèles , juste en inversant ses dimensions. Or, après une rotation d'un autre angle, ce n'est plus vrai, et ma détection des tunes devient impossible. Et je n'ai pas de solution en vue.
Alors, ce que le propose, c'est de construire une bitmap tourné d'un angle quelconque, par un éditeur d'images (ou par les fonctions de KGF.dll), puis affecter l'image résultante dans une bitmap aux mêmes dimensions que celles du sprite d'origine, en lui donnant un nom de fichier indiquant l'angle, comme ceci MonSprite(45).bmp MonSprite est juste pour l'exemple. L'angle de rotation doit suivre le nom, entouré de parenthèses rondes. Ainsi, l'outil de création de masques et de tunes comprendra l'angle de rotation. Il faut ensuite définir les tunes nécessaires, forcément sous forme de rectangles avec des bords parallèles aux bords qu sprite. Après un clic sur "Save picture" (qui enregistre également le masque, les tunes et la liste des tunes), on peut cliquer sur "Rotate left" puis "Save picture", et ceci encore deux autres fois. On aura ainsi des sprites avec des tunes valides, pour les angles 45°, 135°, 225° et 315°. Et dans un programme, pour passer d'un angle à l'autre, et sachant que le sprite sans rotation a un nom sans ces parenthèses, on utilise les fichiers suivants: MonSprite.bmp MonSprite(45).bmp MonSprite(90).bmp MonSprite(135).bmp MonSprite(180).bmp MonSprite(225).bmp MonSprite(270).bmp MonSprite(315).bmp Le sprite de 360° est automatiquement généré en MonSprite.bmp, soit 0°.
Bien entendu, le même raisonnement s'applique pour un autre angle, comme 30%, 10%, etc. Il faut créer autant de sprites pseudo-initiales qu'il faut cour compléter le quart de cercle entre 0 et 90%. Ensuite, les fonctions de rotation intégrée à mon outil font le reste.
Voilà. Est-ce une logique applicable ? | |
| | | Jicehel
Nombre de messages : 5947 Age : 51 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Construire un masque pour les sprites Mar 16 Juin 2015 - 22:51 | |
| Oui Klaus, c'est très bien. Les sprites tournés d'un angles autre que d'un multiple de 90° doivent être retouchés, ton système est donc le mieux de faisable sans faire une vrai usine à gaz (ce qui n'est pas le but). On obtient déjà les calculs des zones automatiquement et la rotation à 90° de l'image. En plus, en règle génrale, 8 directions suffisent la plus part du temps. | |
| | | Klaus
Nombre de messages : 12295 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Construire un masque pour les sprites Mer 17 Juin 2015 - 8:30 | |
| J'ai trouvé un outil de rotation d'images, qui me semble parfait. Gratuit (SourceForge), il accepte pas mal de formats d'image, permet de paramétrer le centre de rotation (par défaut: le centre de l'image) ainsi que l'angle au degré près. Il est accessible dans:
WebDav\==>Outils\Outils graphiques\RotateSanline.exe
En plus, il est ultra-rapide. Avec ça, on peut produire facilement un sprite tourné légèrement qui qui servira de base pour les 4 rotations à 90°. | |
| | | Invité Invité
| Sujet: Re: Construire un masque pour les sprites Mer 17 Juin 2015 - 8:36 | |
| Bonjour Klaus. Je suis le sujet de loin. Sans faire les essais de ce qui est proposé, difficile de comprendre.
Pour la rotation; j'ai pensé à la théière qu'on pivote. Ne peut-on pas se servir de 3d_rotate et 3d_image_texture pour récupérer les images produites.Sur un fond noir, on doit avoir des sprites je pense.
Je ne peux pas faire d'essai en ce moment, trop à faire ailleurs. |
| | | Klaus
Nombre de messages : 12295 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Construire un masque pour les sprites Mer 17 Juin 2015 - 8:59 | |
| @Cosmos70: Je ne vois pas comment on pourrait récupérer l'image tournée d'un objet 3D, en 2 dimensions? A moins de faire une copie d'écran ? Mais ça ne fait pas l'affaire du tout, puisqu'on perd l'échelle (la dimension précise au pixel près). @Tous: Nouvelle version: V1.2 du 17/06/2015Nouveauté: l'angle est maintenant mis systématiquement dans le nom des fichiers. et même une bitmap chargée sans cette information sera automatiquement renommée pour inclure "(0)" indiquant "sans rotation". Voici le code: - Code:
-
' build_sprite_mask.bas
' historique des versions ' Version Date Motif ' =================================================================================== ' V1.0 15/06/2015 Première version stable ' V1.1 16/06/2015 Suppression d'un tune par clic sur le tune ' V1.2 17/06/2015 Mettre systématiquement l'angle dans les noms des fichiers
dim version$ : version$ = "V1.2 17/06/2015" dim debug% : debug% = 0 : ' pour tests en cours de développement...
label build, load, save, loadm, savem, savet, rect, tune, close100 label enlargeup, moveup, moveleft, enlargeleft, moveright, reduceright, movedown, reducedown label right90, left90, flipleft, flipdown, click3
dim s$, f$, fm$, ft$, fl$, w%, h%, x%, y%, i%, toprow%, bottomrow%, leftcol%, rightcol%, ntune% dim img_w%, img_h%, angle%, seltune%, tunes%(64,3), ntunes$(64)
hide 0 form 100 : caption 100,"Sprite size" : on_close 100,close100 alpha 101 : parent 101,100 : top 101,20 : left 101,20 : caption 101,"Width:" 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,"Height:" 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,"Validate" on_click 105,close100 alpha 106 : parent 106,100 : top 106,140 : left 106,20 : caption 106,"Version: "+version$
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 : on_click 3,click3 picture 4 : top 4,300 : left 4,750 : width 4,200 : height 4,200 : ' hide 4 picture 6 : top 6,300 : left 6,10 : width 6,200 : height 6,200 : if debug%=0 then hide 6 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)
if debug%=1 then memo 123 : top 123,top(57)+height(57)+1 : left 123,left(57)-40
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 click3: if hide(51)=1 then return LocateTune() if seltune%>0 if message_confirmation_yes_no("Remove tune "+str$(seltune%)+"="+ntunes$(seltune%)+" ?")=1 ' copier de picture 2 dans picture 3 if debug%=1 then item_add 123,"del "+str$(tunes%(seltune%,0))+","+str$(tunes%(seltune%,1))+" "+str$(tunes%(seltune%,2))+","+str$(tunes%(seltune%,3))+" = "+ntunes$(seltune%)+chr$(13)+chr$(10)+item_read$(42,seltune%) 2d_target_is 6 2d_image_copy 43,tunes%(seltune%,0)-1,tunes%(seltune%,1)-1,tunes%(seltune%,2),tunes%(seltune%,3) 2d_target_is 3 2d_image_paste 43,tunes%(seltune%,0),tunes%(seltune%,1) 2d_target_is 2 ' supprimer le tune de la liste clear 42 if seltune%=ntune% ntune% = ntune% - 1 else for i%=seltune% to ntune%-1 tunes%(i%,0) = tunes%(i%+1,0) tunes%(i%,1) = tunes%(i%+1,1) tunes%(i%,2) = tunes%(i%+1,2) tunes%(i%,3) = tunes%(i%+1,3) ntunes$(i%) = ntunes$(i%+1) next i% end_if if ntune%>0 for i%=1 to ntune% item_add 42,str$(i%)+","+str$(tunes%(i%,0))+","+str$(tunes%(i%,1))+","+str$(tunes%(i%,2))+","+str$(tunes%(i%,3))+","+ntunes$(i%) next i% end_if end_if end_if 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 6 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. ' Dans ce cas, le fichier sera automatiquement renommé pour inclure le "(0)". 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" i% = instr(f$,"(") if i%=0 s$ = left$(f$,len(f$)-4)+"(0).bmp" file_rename f$,s$ f$ = s$ end_if file_load 1,f$ if file_exists(fm$)=1 i% = instr(fm$,"(") if i%=0 i% = instr(fm$,"_mask.bmp") s$ = left$(fm$,i%-1)+"(0)_mask.bmp" file_rename fm$,s$ fm$ = s$ end_if file_load 2,fm$ 2d_target_is 2 2d_image_copy 41,0,0,img_w%-1,img_h%-1 2d_target_is 6 2d_image_paste 41,0,0 2d_target_is 2 if file_exists(ft$)=1 i% = instr(ft$,"(") if i%=0 i% = instr(ft$,"_mask_tuned.bmp") s$ = left$(ft$,i%-1)+"(0)_mask_tuned.bmp" file_rename ft$,s$ ft$ = s$ end_if file_load 3,ft$ if file_exists(fl$)=1 i% = instr(fl$,"(") if i%=0 i% = instr(fl$,"_mask_tuned_list.bmp") s$ = left$(fl$,i%-1)+"(0)_mask_tuned_list.txt" file_rename fl$,s$ fl$ = s$ end_if 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) LoadTunes() 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%) tunes%(ntune%,0) = leftcol% tunes%(ntune%,1) = toprow% tunes%(ntune%,2) = rightcol% tunes%(ntune%,3) = bottomcol% ntunes$(ntune%) = s$ 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%,img_h% 2d_target_is 6 2d_image_paste 41,0,0 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%,img_h% 2d_target_is 6 2d_image_paste 41,0,0 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%,img_h% 2d_target_is 6 2d_image_paste 41,0,0 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%,img_h% 2d_target_is 6 2d_image_paste 41,0,0 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%, w%, h% if count(42)>0 caption 69,"Tune transposition..." display w% = width(1) h% = height(1) 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% = h%-rcx%-1 rc% = brx% br% = h%-lcx%-1 tunes%(t%,0) = lc% tunes%(t%,1) = tr% tunes%(t%,2) = rc% tunes%(t%,3) = br%
item_delete 42,t% item_insert 42,t%,str$(nt%)+","+str$(lc%)+","+str$(tr%)+","+str$(rc%)+","+str$(br%)+","+n$ if debug%=1 then item_add 123,item_read$(42,t%) 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% = h%-rc%-1 rightcol% = br% bottomrow% = h%-lc%-1 ' 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 w% = width(1) h% = height(1) 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%
tunes%(t%,0) = lc% tunes%(t%,1) = tr% tunes%(t%,2) = rc% tunes%(t%,3) = br%
item_delete 42,t% item_insert 42,t%,str$(nt%)+","+str$(lc%)+","+str$(tr%)+","+str$(rc%)+","+str$(br%)+","+n$ if debug%=1 then item_add 123,item_read$(42,t%) 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%
tunes%(t%,0) = lc% tunes%(t%,1) = tr% tunes%(t%,2) = rc% tunes%(t%,3) = br%
item_delete 42,t% item_insert 42,t%,str$(nt%)+","+str$(lc%)+","+str$(tr%)+","+str$(rc%)+","+str$(br%)+","+n$ if debug%=1 then item_add 123,item_read$(42,t%) 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
tunes%(t%,0) = lc% tunes%(t%,1) = tr% tunes%(t%,2) = rc% tunes%(t%,3) = br%
item_delete 42,t% item_insert 42,t%,str$(nt%)+","+str$(lc%)+","+str$(tr%)+","+str$(rc%)+","+str$(br%)+","+n$ if debug%=1 then item_add 123,item_read$(42,t%) next t% caption 69,"" end_if ' ajuster les coordonnées du rectangle actuel 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
sub LoadTunes() dim_local i%, t%, p%, s$ if ntune%=0 then exit_sub for t%=1 to ntune% s$ = item_read$(42,t%) p% = instr(s$,",") s$ = mid$(s$,p%+1,100) for i%=0 to 3 p% = instr(s$,",") tunes%(t%,i%) = val(left$(s$,p%-1)) s$ = mid$(s$,p%+1,100) next i% ntunes$(t%) = s$ if debug%=1 then item_add 123,str$(tunes%(t%,0))+","+str$(tunes%(t%,1))+" "+str$(tunes%(t%,2))+","+str$(tunes%(t%,3))+" = "+ntunes$(t%) next t% end_sub
sub LocateTune() dim_local x%, y%, t% seltune% = 0 if ntune%=0 then return x% = mouse_x_left_down(3) y% = mouse_y_left_down(3) if debug%=1 then item_add 123,str$(x%)+","+str$(y%) for t%=1 to ntune% if (x%>=tunes%(t%,0)) and (x%<=tunes%(t%,2)) if (y%>=tunes%(t%,1)) and (y%<=tunes%(t%,3)) seltune% = t% exit_sub end_if end_if next t% end_sub
| |
| | | papydall
Nombre de messages : 7009 Age : 73 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Construire un masque pour les sprites Mer 17 Juin 2015 - 13:49 | |
| 1er test : Not correct string expression :Function call with negative value.Line :509 Ligne 509 - Code:
-
fm$ = left$(fm$,p1%-1)+a$+mid$(fm$,p2%+1,len(fm$)) 2ème test : OK | |
| | | Klaus
Nombre de messages : 12295 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Construire un masque pour les sprites Jeu 18 Juin 2015 - 0:09 | |
| Nouvelle version: V1.3 du 18/06/2015Nouveauté: bouton "Save to zip" pour sauver les 4 fichiers d'un sprite dans une archive ZIP bouton "Load from zip" pour charger le contenu d'un de ces archives de sprite - Code:
-
' build_sprite_mask.bas
' historique des versions ' Version Date Motif ' ========================================================================================== ' V1.0 15/06/2015 Première version stable ' V1.1 16/06/2015 Suppression d'un tune par clic sur le tune ' V1.2 17/06/2015 Mettre systématiquement l'angle dans les noms des fichiers ' V1.3 18/06/2015 Ajouter boutons pour créer/charger une archive ZIP pour le sprite en cours
dim version$ : version$ = "V1.3 18/06/2015" dim debug% : debug% = 0 : ' pour tests en cours de développement...
label build, load, load1, loadfromzip, save, savetozip, loadm, savem, savet, rect, tune, close100 label enlargeup, moveup, moveleft, enlargeleft, moveright, reduceright, movedown, reducedown label right90, left90, flipleft, flipdown, click3
dim s$, f$, fm$, ft$, fl$, w%, h%, x%, y%, i%, toprow%, bottomrow%, leftcol%, rightcol%, ntune% dim img_w%, img_h%, angle%, seltune%, tunes%(64,3), ntunes$(64), z$, d$, dold$
hide 0 form 100 : caption 100,"Sprite size" : on_close 100,close100 alpha 101 : parent 101,100 : top 101,20 : left 101,20 : caption 101,"Width:" 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,"Height:" 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,"Validate" on_click 105,close100 alpha 106 : parent 106,100 : top 106,140 : left 106,20 : caption 106,"Version: "+version$
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 : on_click 3,click3 picture 4 : top 4,300 : left 4,750 : width 4,200 : height 4,200 : ' hide 4 picture 6 : top 6,300 : left 6,10 : width 6,200 : height 6,200 : if debug%=0 then hide 6 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 18 : top 18,220 : left 18,130 : caption 18,"Load from zip" : on_click 18,loadfromzip button 16 : top 16,250 : left 16,50 : caption 16,"Save image" : on_click 16,save button 17 : top 17,250 : left 17,130 : caption 17,"Save to zip" : on_click 17,savetozip 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" open_dialog 22 : filter 22,"*.zip|*.zip" 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)
if debug%=1 then memo 123 : top 123,top(57)+height(57)+1 : left 123,left(57)-40
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 click3: if hide(51)=1 then return LocateTune() if seltune%>0 if message_confirmation_yes_no("Remove tune "+str$(seltune%)+"="+ntunes$(seltune%)+" ?")=1 ' copier de picture 2 dans picture 3 if debug%=1 then item_add 123,"del "+str$(tunes%(seltune%,0))+","+str$(tunes%(seltune%,1))+" "+str$(tunes%(seltune%,2))+","+str$(tunes%(seltune%,3))+" = "+ntunes$(seltune%)+chr$(13)+chr$(10)+item_read$(42,seltune%) 2d_target_is 6 2d_image_copy 43,tunes%(seltune%,0)-1,tunes%(seltune%,1)-1,tunes%(seltune%,2),tunes%(seltune%,3) 2d_target_is 3 2d_image_paste 43,tunes%(seltune%,0),tunes%(seltune%,1) 2d_target_is 2 ' supprimer le tune de la liste clear 42 if seltune%=ntune% ntune% = ntune% - 1 else for i%=seltune% to ntune%-1 tunes%(i%,0) = tunes%(i%+1,0) tunes%(i%,1) = tunes%(i%+1,1) tunes%(i%,2) = tunes%(i%+1,2) tunes%(i%,3) = tunes%(i%+1,3) ntunes$(i%) = ntunes$(i%+1) next i% end_if if ntune%>0 for i%=1 to ntune% item_add 42,str$(i%)+","+str$(tunes%(i%,0))+","+str$(tunes%(i%,1))+","+str$(tunes%(i%,2))+","+str$(tunes%(i%,3))+","+ntunes$(i%) next i% end_if end_if end_if 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 6 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 loadfromzip: z$ = file_name$(22) if z$="_" then return if lower$(right$(z$,4))<>".zip" then z$ = z$ + ".zip" if file_exists(z$)=0 message "ZIP file not found" return end_if d$ = file_extract_path$(z$) + "SpriteArchive\" if dir_exists(d$)=0 then dir_make d$ archiver_on archiver_extract z$,d$ archiver_off dold$ = dir_current$ dir_change d$ s$ = file_find_first$ while s$<>"_" if left$(s$,1)<>"." if file_exists("..\"+s$)=1 then file_delete "..\"+s$ file_rename s$,"..\"+s$ end_if s$ = file_find_next$ end_while file_find_close dir_change dold$ dir_remove d$ s$ = left$(z$,len(z$)-3)+"bmp" gosub load1 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. ' Dans ce cas, le fichier sera automatiquement renommé pour inclure le "(0)". 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 load1: 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" i% = instr(f$,"(") if i%=0 s$ = left$(f$,len(f$)-4)+"(0).bmp" file_rename f$,s$ f$ = s$ end_if file_load 1,f$ if file_exists(fm$)=1 i% = instr(fm$,"(") if i%=0 i% = instr(fm$,"_mask.bmp") s$ = left$(fm$,i%-1)+"(0)_mask.bmp" file_rename fm$,s$ fm$ = s$ end_if file_load 2,fm$ 2d_target_is 2 2d_image_copy 41,0,0,img_w%-1,img_h%-1 2d_target_is 6 2d_image_paste 41,0,0 2d_target_is 2 if file_exists(ft$)=1 i% = instr(ft$,"(") if i%=0 i% = instr(ft$,"_mask_tuned.bmp") s$ = left$(ft$,i%-1)+"(0)_mask_tuned.bmp" file_rename ft$,s$ ft$ = s$ end_if file_load 3,ft$ if file_exists(fl$)=1 i% = instr(fl$,"(") if i%=0 i% = instr(fl$,"_mask_tuned_list.bmp") s$ = left$(fl$,i%-1)+"(0)_mask_tuned_list.txt" file_rename fl$,s$ fl$ = s$ end_if 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) LoadTunes() GetAngle(f$) z$ = left$(f$,len(f$)-3)+"zip" 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 savetozip: if file_exists(z$)=1 if message_confirmation_yes_no("File does already exist. Replace it ?")<>1 then return end_if d$ = file_extract_path$(z$) + "SpriteArchive\" if dir_exists(d$)=0 then dir_make d$ file_save 1,d$+file_extract_name$(f$) 2d_target_is 2 2d_image_paste 41,0,0 file_save 2,d$+file_extract_name$(fm$) file_save 3,d$+file_extract_name$(ft$) file_save 42,d$+file_extract_name$(fl$) archiver_on archiver_add d$,z$ archiver_off file_delete d$+file_extract_name$(f$) file_delete d$+file_extract_name$(fm$) file_delete d$+file_extract_name$(ft$) file_delete d$+file_extract_name$(fl$) dir_remove d$ message "Archive file created:"+chr$(13)+chr$(10)+z$ 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%) tunes%(ntune%,0) = leftcol% tunes%(ntune%,1) = toprow% tunes%(ntune%,2) = rightcol% tunes%(ntune%,3) = bottomcol% ntunes$(ntune%) = s$ 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%,img_h% 2d_target_is 6 2d_image_paste 41,0,0 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%,img_h% 2d_target_is 6 2d_image_paste 41,0,0 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%,img_h% 2d_target_is 6 2d_image_paste 41,0,0 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%,img_h% 2d_target_is 6 2d_image_paste 41,0,0 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$)) z$ = left$(f$,len(f$)-3)+"zip" ' 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%, w%, h% if count(42)>0 caption 69,"Tune transposition..." display w% = width(1) h% = height(1) 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% = h%-rcx%-1 rc% = brx% br% = h%-lcx%-1 tunes%(t%,0) = lc% tunes%(t%,1) = tr% tunes%(t%,2) = rc% tunes%(t%,3) = br%
item_delete 42,t% item_insert 42,t%,str$(nt%)+","+str$(lc%)+","+str$(tr%)+","+str$(rc%)+","+str$(br%)+","+n$ if debug%=1 then item_add 123,item_read$(42,t%) 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% = h%-rc%-1 rightcol% = br% bottomrow% = h%-lc%-1 ' 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 w% = width(1) h% = height(1) 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%
tunes%(t%,0) = lc% tunes%(t%,1) = tr% tunes%(t%,2) = rc% tunes%(t%,3) = br%
item_delete 42,t% item_insert 42,t%,str$(nt%)+","+str$(lc%)+","+str$(tr%)+","+str$(rc%)+","+str$(br%)+","+n$ if debug%=1 then item_add 123,item_read$(42,t%) 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%
tunes%(t%,0) = lc% tunes%(t%,1) = tr% tunes%(t%,2) = rc% tunes%(t%,3) = br%
item_delete 42,t% item_insert 42,t%,str$(nt%)+","+str$(lc%)+","+str$(tr%)+","+str$(rc%)+","+str$(br%)+","+n$ if debug%=1 then item_add 123,item_read$(42,t%) 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
tunes%(t%,0) = lc% tunes%(t%,1) = tr% tunes%(t%,2) = rc% tunes%(t%,3) = br%
item_delete 42,t% item_insert 42,t%,str$(nt%)+","+str$(lc%)+","+str$(tr%)+","+str$(rc%)+","+str$(br%)+","+n$ if debug%=1 then item_add 123,item_read$(42,t%) next t% caption 69,"" end_if ' ajuster les coordonnées du rectangle actuel 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
sub LoadTunes() dim_local i%, t%, p%, s$ if ntune%=0 then exit_sub for t%=1 to ntune% s$ = item_read$(42,t%) p% = instr(s$,",") s$ = mid$(s$,p%+1,100) for i%=0 to 3 p% = instr(s$,",") tunes%(t%,i%) = val(left$(s$,p%-1)) s$ = mid$(s$,p%+1,100) next i% ntunes$(t%) = s$ if debug%=1 then item_add 123,str$(tunes%(t%,0))+","+str$(tunes%(t%,1))+" "+str$(tunes%(t%,2))+","+str$(tunes%(t%,3))+" = "+ntunes$(t%) next t% end_sub
sub LocateTune() dim_local x%, y%, t% seltune% = 0 if ntune%=0 then return x% = mouse_x_left_down(3) y% = mouse_y_left_down(3) if debug%=1 then item_add 123,str$(x%)+","+str$(y%) for t%=1 to ntune% if (x%>=tunes%(t%,0)) and (x%<=tunes%(t%,2)) if (y%>=tunes%(t%,1)) and (y%<=tunes%(t%,3)) seltune% = t% exit_sub end_if end_if next t% end_sub
| |
| | | Klaus
Nombre de messages : 12295 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Construire un masque pour les sprites Jeu 18 Juin 2015 - 13:08 | |
| Nouvelle version: V1.4 du 18/06/2015Nouveauté: Ajout bouton "Save all rotations to zip"Ce bouton permet de créer un seul fichier ZIP portant le nom du sprite chargé, avec l'extension ZIP. Cette archive contient les 4 fichiers pour chaque rotation du sprite, donc avec (xxx), xxx étant l'angle de rotation. Ceci est vrai même pour des configurations avec des sprites en rotation de 45°, 30° etc, en incluant tous leurs clones de rotation de 90° pour chaque angle de base. Le bouton "Load from zip" introduit dans la version précédente charge le sprite avec la rotation correspondant au nom du fichier zip, mais restaure l'ensemble des rotations mémorisées dans l'archive. Voici le code (toujours 100 % Panoramic, sans DLL): - Code:
-
' build_sprite_mask.bas
' historique des versions ' Version Date Motif ' ========================================================================================== ' V1.0 15/06/2015 Première version stable ' V1.1 16/06/2015 Suppression d'un tune par clic sur le tune ' V1.2 17/06/2015 Mettre systématiquement l'angle dans les noms des fichiers ' V1.3 18/06/2015 Ajouter boutons pour créer/charger une archive ZIP pour le sprite en cours ' V1.4 18/06/2015 Ajouterbouton "Save all rotations to zip"
dim version$ : version$ = "V1.4 18/06/2015" dim debug% : debug% = 0 : ' pour tests en cours de développement...
label build, load, load1, loadfromzip, save, savetozip, savealltozip label loadm, savem, savet, rect, tune, close100 label enlargeup, moveup, moveleft, enlargeleft, moveright, reduceright, movedown, reducedown label right90, left90, flipleft, flipdown, click3
dim s$, f$, fm$, ft$, fl$, w%, h%, x%, y%, i%, toprow%, bottomrow%, leftcol%, rightcol%, ntune% dim img_w%, img_h%, angle%, seltune%, tunes%(64,3), ntunes$(64), z$, d$, dold$
hide 0 form 100 : caption 100,"Sprite size" : on_close 100,close100 alpha 101 : parent 101,100 : top 101,20 : left 101,20 : caption 101,"Width:" 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,"Height:" 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,"Validate" on_click 105,close100 alpha 106 : parent 106,100 : top 106,140 : left 106,20 : caption 106,"Version: "+version$
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 : on_click 3,click3 picture 4 : top 4,300 : left 4,750 : width 4,200 : height 4,200 : ' hide 4 picture 6 : top 6,300 : left 6,10 : width 6,200 : height 6,200 : if debug%=0 then hide 6 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 18 : top 18,220 : left 18,130 : caption 18,"Load from zip" : on_click 18,loadfromzip button 16 : top 16,250 : left 16,50 : caption 16,"Save image" : on_click 16,save button 17 : top 17,250 : left 17,130 : caption 17,"Save to zip" : on_click 17,savetozip button 19 : top 19,280 : left 19,50 : caption 19,"Save all rotations to zip" : on_click 19,savealltozip : width 19,155 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" open_dialog 22 : filter 22,"*.zip|*.zip" 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)
if debug%=1 then memo 123 : top 123,top(57)+height(57)+1 : left 123,left(57)-40
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 click3: if hide(51)=1 then return LocateTune() if seltune%>0 if message_confirmation_yes_no("Remove tune "+str$(seltune%)+"="+ntunes$(seltune%)+" ?")=1 ' copier de picture 2 dans picture 3 if debug%=1 then item_add 123,"del "+str$(tunes%(seltune%,0))+","+str$(tunes%(seltune%,1))+" "+str$(tunes%(seltune%,2))+","+str$(tunes%(seltune%,3))+" = "+ntunes$(seltune%)+chr$(13)+chr$(10)+item_read$(42,seltune%) 2d_target_is 6 2d_image_copy 43,tunes%(seltune%,0)-1,tunes%(seltune%,1)-1,tunes%(seltune%,2),tunes%(seltune%,3) 2d_target_is 3 2d_image_paste 43,tunes%(seltune%,0),tunes%(seltune%,1) 2d_target_is 2 ' supprimer le tune de la liste clear 42 if seltune%=ntune% ntune% = ntune% - 1 else for i%=seltune% to ntune%-1 tunes%(i%,0) = tunes%(i%+1,0) tunes%(i%,1) = tunes%(i%+1,1) tunes%(i%,2) = tunes%(i%+1,2) tunes%(i%,3) = tunes%(i%+1,3) ntunes$(i%) = ntunes$(i%+1) next i% end_if if ntune%>0 for i%=1 to ntune% item_add 42,str$(i%)+","+str$(tunes%(i%,0))+","+str$(tunes%(i%,1))+","+str$(tunes%(i%,2))+","+str$(tunes%(i%,3))+","+ntunes$(i%) next i% end_if end_if end_if 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 6 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 loadfromzip: z$ = file_name$(22) if z$="_" then return if lower$(right$(z$,4))<>".zip" then z$ = z$ + ".zip" if file_exists(z$)=0 message "ZIP file not found" return end_if d$ = file_extract_path$(z$) + "SpriteArchive\" if dir_exists(d$)=0 then dir_make d$ archiver_on archiver_extract z$,d$ archiver_off dold$ = dir_current$ dir_change d$ s$ = file_find_first$ while s$<>"_" if left$(s$,1)<>"." if file_exists("..\"+s$)=1 then file_delete "..\"+s$ file_rename s$,"..\"+s$ end_if s$ = file_find_next$ end_while file_find_close dir_change dold$ dir_remove d$ s$ = left$(z$,len(z$)-3)+"bmp" gosub load1 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. ' Dans ce cas, le fichier sera automatiquement renommé pour inclure le "(0)". 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 load1: 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" i% = instr(f$,"(") if i%=0 s$ = left$(f$,len(f$)-4)+"(0).bmp" file_rename f$,s$ f$ = s$ end_if file_load 1,f$ if file_exists(fm$)=1 i% = instr(fm$,"(") if i%=0 i% = instr(fm$,"_mask.bmp") s$ = left$(fm$,i%-1)+"(0)_mask.bmp" file_rename fm$,s$ fm$ = s$ end_if file_load 2,fm$ 2d_target_is 2 2d_image_copy 41,0,0,img_w%-1,img_h%-1 2d_target_is 6 2d_image_paste 41,0,0 2d_target_is 2 if file_exists(ft$)=1 i% = instr(ft$,"(") if i%=0 i% = instr(ft$,"_mask_tuned.bmp") s$ = left$(ft$,i%-1)+"(0)_mask_tuned.bmp" file_rename ft$,s$ ft$ = s$ end_if file_load 3,ft$ if file_exists(fl$)=1 i% = instr(fl$,"(") if i%=0 i% = instr(fl$,"_mask_tuned_list.bmp") s$ = left$(fl$,i%-1)+"(0)_mask_tuned_list.txt" file_rename fl$,s$ fl$ = s$ end_if 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) LoadTunes() GetAngle(f$) z$ = left$(f$,len(f$)-3)+"zip" 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 savetozip: if file_exists(z$)=1 if message_confirmation_yes_no("File does already exist. Replace it ?")<>1 then return file_delete z$ end_if d$ = file_extract_path$(z$) + "SpriteArchive\" if dir_exists(d$)=0 then dir_make d$ file_save 1,d$+file_extract_name$(f$) 2d_target_is 2 2d_image_paste 41,0,0 file_save 2,d$+file_extract_name$(fm$) file_save 3,d$+file_extract_name$(ft$) file_save 42,d$+file_extract_name$(fl$) archiver_on archiver_add d$,z$ archiver_off file_delete d$+file_extract_name$(f$) file_delete d$+file_extract_name$(fm$) file_delete d$+file_extract_name$(ft$) file_delete d$+file_extract_name$(fl$) dir_remove d$ message "Archive file created:"+chr$(13)+chr$(10)+z$ return
savealltozip: if file_exists(z$)=1 if message_confirmation_yes_no("File does already exist. Replace it ?")<>1 then return file_delete z$ end_if d$ = file_extract_path$(z$) + "SpriteArchive\" if dir_exists(d$)=0 then dir_make d$ file_save 1,d$+file_extract_name$(f$) 2d_target_is 2 2d_image_paste 41,0,0 file_save 2,d$+file_extract_name$(fm$) file_save 3,d$+file_extract_name$(ft$) file_save 42,d$+file_extract_name$(fl$)
CopyOtherRotations(d$) archiver_on archiver_add d$,z$ archiver_off RemoveTempFolder(d$) message "All sprite rotations are achived in:"+chr$(13)+chr$(10)+z$ return sub CopyOtherRotations(dest$) dim_local x$, deb$, p1%, p2% x$ = file_extract_name$(f$) p1% = instr(x$,"(") p2% = instr(x$,")") if (p1%=0) or (p2%=0) then exit_sub deb$ = left$(x$,p1%) x$ = file_find_first$ while x$<>"_" if left$(x$,p1%)=deb$ if file_exists(dest$+x$)=0 then file_copy x$,dest$+x$ end_if x$ = file_find_next$ end_while file_find_close end_sub
sub RemoveTempFolder(dir$) dim_local dold$, x$ dold$ = dir_current$ dir_change d$ x$ = file_find_first$ while x$<>"_" if left$(x$,1)<>"." then file_delete x$ x$ = file_find_next$ end_while file_find_close dir_change dold$ dir_remove dir$ end_sub 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%) tunes%(ntune%,0) = leftcol% tunes%(ntune%,1) = toprow% tunes%(ntune%,2) = rightcol% tunes%(ntune%,3) = bottomcol% ntunes$(ntune%) = s$ 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%,img_h% 2d_target_is 6 2d_image_paste 41,0,0 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%,img_h% 2d_target_is 6 2d_image_paste 41,0,0 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%,img_h% 2d_target_is 6 2d_image_paste 41,0,0 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%,img_h% 2d_target_is 6 2d_image_paste 41,0,0 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$)) z$ = left$(f$,len(f$)-3)+"zip" ' 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%, w%, h% if count(42)>0 caption 69,"Tune transposition..." display w% = width(1) h% = height(1) 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% = h%-rcx%-1 rc% = brx% br% = h%-lcx%-1 tunes%(t%,0) = lc% tunes%(t%,1) = tr% tunes%(t%,2) = rc% tunes%(t%,3) = br%
item_delete 42,t% item_insert 42,t%,str$(nt%)+","+str$(lc%)+","+str$(tr%)+","+str$(rc%)+","+str$(br%)+","+n$ if debug%=1 then item_add 123,item_read$(42,t%) 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% = h%-rc%-1 rightcol% = br% bottomrow% = h%-lc%-1 ' 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 w% = width(1) h% = height(1) 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%
tunes%(t%,0) = lc% tunes%(t%,1) = tr% tunes%(t%,2) = rc% tunes%(t%,3) = br%
item_delete 42,t% item_insert 42,t%,str$(nt%)+","+str$(lc%)+","+str$(tr%)+","+str$(rc%)+","+str$(br%)+","+n$ if debug%=1 then item_add 123,item_read$(42,t%) 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%
tunes%(t%,0) = lc% tunes%(t%,1) = tr% tunes%(t%,2) = rc% tunes%(t%,3) = br%
item_delete 42,t% item_insert 42,t%,str$(nt%)+","+str$(lc%)+","+str$(tr%)+","+str$(rc%)+","+str$(br%)+","+n$ if debug%=1 then item_add 123,item_read$(42,t%) 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
tunes%(t%,0) = lc% tunes%(t%,1) = tr% tunes%(t%,2) = rc% tunes%(t%,3) = br%
item_delete 42,t% item_insert 42,t%,str$(nt%)+","+str$(lc%)+","+str$(tr%)+","+str$(rc%)+","+str$(br%)+","+n$ if debug%=1 then item_add 123,item_read$(42,t%) next t% caption 69,"" end_if ' ajuster les coordonnées du rectangle actuel 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
sub LoadTunes() dim_local i%, t%, p%, s$ if ntune%=0 then exit_sub for t%=1 to ntune% s$ = item_read$(42,t%) p% = instr(s$,",") s$ = mid$(s$,p%+1,100) for i%=0 to 3 p% = instr(s$,",") tunes%(t%,i%) = val(left$(s$,p%-1)) s$ = mid$(s$,p%+1,100) next i% ntunes$(t%) = s$ if debug%=1 then item_add 123,str$(tunes%(t%,0))+","+str$(tunes%(t%,1))+" "+str$(tunes%(t%,2))+","+str$(tunes%(t%,3))+" = "+ntunes$(t%) next t% end_sub
sub LocateTune() dim_local x%, y%, t% seltune% = 0 if ntune%=0 then return x% = mouse_x_left_down(3) y% = mouse_y_left_down(3) if debug%=1 then item_add 123,str$(x%)+","+str$(y%) for t%=1 to ntune% if (x%>=tunes%(t%,0)) and (x%<=tunes%(t%,2)) if (y%>=tunes%(t%,1)) and (y%<=tunes%(t%,3)) seltune% = t% exit_sub end_if end_if next t% end_sub
| |
| | | Jicehel
Nombre de messages : 5947 Age : 51 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Construire un masque pour les sprites Jeu 18 Juin 2015 - 14:05 | |
| Ce sera en effet très pratique pour les échanges de sprites | |
| | | Klaus
Nombre de messages : 12295 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Construire un masque pour les sprites Ven 19 Juin 2015 - 14:35 | |
| Nouvelle version: V1.5 du 19/06/2015Nouveauté: - certains boutons conçus uniquement pour la mise au point sont cachés en fonctionnement normal - début de la documentation du code par commentaires extensifs - Code:
-
' build_sprite_mask.bas
' historique des versions ' Version Date Motif ' ========================================================================================== ' V1.0 15/06/2015 Première version stable ' V1.1 16/06/2015 Suppression d'un tune par clic sur le tune ' V1.2 17/06/2015 Mettre systématiquement l'angle dans les noms des fichiers ' V1.3 18/06/2015 Ajouter boutons pour créer/charger une archive ZIP pour le sprite en cours ' V1.4 18/06/2015 Ajouterbouton "Save all rotations to zip" ' V1.5 19/06/2015 Cacher certains boutons conçus uniquement pour la mise au point)
' ===== constantes dim version$ : version$ = "V1.5 19/06/2015" dim debug% : debug% = 0 : ' pour tests en cours de développement...
' =====labels label build, load, load1, loadfromzip, save, savetozip, savealltozip if debug%=1 then label loadm, savem, savet label rect, tune, close100 label enlargeup, moveup, moveleft, enlargeleft, moveright, reduceright, movedown, reducedown label right90, left90, flipleft, flipdown, click3
' ===== variables dim f$ : ' chemin et nom du fichier sprite dim fm$ : ' chemin et nom du fichier masque dim ft$ : ' chemin et nom du fichier masque avec tunes dim fl$ : ' chemin et nom du fichier liste des tunes dim w%, h%, x%, y%, i%, s$, z$, d$, dold$ : ' variabelms techniques dim toprow%, bottomrow%, leftcol%, rightcol% : ' coordonnées du rectangle de sélection dim img_w%, img_h% : ' dimensions du sprite dim ntune% : ' nombre de tunes définis dim angle% : ' angle de rotation dim seltune% : ' numéro du tune sélectionné dim tunes%(64,3), ntunes$(64) : ' tableau des tunes (géométrie et noms)
' ===== fenêtre de définition de la taille du sprite hide 0 form 100 : caption 100,"Sprite size" : on_close 100,close100 alpha 101 : parent 101,100 : top 101,20 : left 101,20 : caption 101,"Width:" 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,"Height:" 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,"Validate" on_click 105,close100 alpha 106 : parent 106,100 : top 106,140 : left 106,20 : caption 106,"Version: "+version$
' ===== configuration des objets de la fenêtre de travail 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 : on_click 3,click3 picture 4 : top 4,300 : left 4,750 : width 4,200 : height 4,200 : ' hide 4 picture 6 : top 6,300 : left 6,10 : width 6,200 : height 6,200 : if debug%=0 then hide 6 alpha 5 : top 5,280 : left 5,60
image 41 : ' sauvegardfe interne du maasque vierge, sans rectangle ni tunes dlist 42 : ' liste des tunes image 43 : ' copie interne du masque pour les rotations
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 18 : top 18,220 : left 18,130 : caption 18,"Load from zip" : on_click 18,loadfromzip button 16 : top 16,250 : left 16,50 : caption 16,"Save image" : on_click 16,save button 17 : top 17,250 : left 17,130 : caption 17,"Save to zip" : on_click 17,savetozip button 19 : top 19,280 : left 19,50 : caption 19,"Save all rotations to zip" : on_click 19,savealltozip : width 19,155 if debug%=1 then button 12 : top 12,220 : left 12,390 : caption 12,"Load mask" : on_click 12,loadm : hide 12 if debug%=1 then button 13 : top 13,250 : left 13,390 : caption 13,"Save mask" : on_click 13,savem : hide 13 if debug%=1 then button 15 : top 15,250 : left 15,600 : caption 15,"Save tune" : on_click 15,savet : hide 15
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" open_dialog 22 : filter 22,"*.zip|*.zip" 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)
if debug%=1 then memo 123 : top 123,top(57)+height(57)+1 : left 123,left(57)-40
end
' =================================== routines évènement
' ===== fermeture de la fenêtre de saisie des dimensions su sprite close100: img_w% = val(text$(102)) : ' prendre les dimensions saisies img_h% = val(text$(104)) width 1,img_w% : height 1,img_h% : ' adapter les pictures de la fenêtre 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) : ' car w% et h% sont souvent utilisés également... h% = height(1) hide 100 show 0 : ' cacher la fenêtre de saisie des dimensions return : ' et montrer la fenêtre principale ' ===== clic dans le picture du masque avec tunes pour identifier le tune cliqué click3: if hide(51)=1 then return : ' on n'est pas encore en mode "rectangle" ? LocateTune() : ' identifier le tune cliqué if seltune%>0 : ' est-ce qu'on a cliqué dans un tune ? if message_confirmation_yes_no("Remove tune "+str$(seltune%)+"="+ntunes$(seltune%)+" ?")=1 ' copier de picture 2 dans picture 3 pour effacer le tune dans le picture 3 if debug%=1 then item_add 123,"del "+str$(tunes%(seltune%,0))+","+str$(tunes%(seltune%,1))+" "+str$(tunes%(seltune%,2))+","+str$(tunes%(seltune%,3))+" = "+ntunes$(seltune%)+chr$(13)+chr$(10)+item_read$(42,seltune%) 2d_target_is 6 2d_image_copy 43,tunes%(seltune%,0)-1,tunes%(seltune%,1)-1,tunes%(seltune%,2),tunes%(seltune%,3) 2d_target_is 3 2d_image_paste 43,tunes%(seltune%,0),tunes%(seltune%,1) 2d_target_is 2 ' supprimer le tune de la liste clear 42 : ' effacer la liste des tunes if seltune%=ntune% : ' le tune à supprimer est le dernier de la liste ? ntune% = ntune% - 1 : ' alors simplement réduire le nombre else : ' sinon, décaler vers le bas les tunes au-delà du tune à supprimer for i%=seltune% to ntune%-1 tunes%(i%,0) = tunes%(i%+1,0) tunes%(i%,1) = tunes%(i%+1,1) tunes%(i%,2) = tunes%(i%+1,2) tunes%(i%,3) = tunes%(i%+1,3) ntunes$(i%) = ntunes$(i%+1) next i% end_if if ntune%>0 : ' est-ce qu'il reste ded tunes ? for i%=1 to ntune% : ' alors reconstruire la liste des tunes item_add 42,str$(i%)+","+str$(tunes%(i%,0))+","+str$(tunes%(i%,1))+","+str$(tunes%(i%,2))+","+str$(tunes%(i%,3))+","+ntunes$(i%) next i% end_if end_if end_if return
' ===== construire le masque à partir du sprite build: caption 31,"Wait please..." : ' car c'est long... display 2d_target_is 2 for y%=0 to h%-1 : ' pour chaque ligne de pîxels for x%=0 to w%-1 : ' pour chaque pixel dans la ligne 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 : ' les pixels noirs restent noirs (transparence) else 2d_pen_color 255,255,255 : ' les autres deviennent blancs end_if 2d_point x%,y% : ' et dessiner le point dans le picture du masque next x% caption 31,"Wait please... "+str$(int(y%*100/img_h%))+" %" : ' indicateur d'avancement display next y% 2d_image_copy 41,0,0,img_w%-1,img_h%-1 : ' copier le masque dans l'image 41 qui contient le masque vierge sans rectangle 2d_target_is 3 2d_image_paste 41,0,0 : ' copier également le masque dans le picture du masque avec tunes 2d_target_is 6 2d_image_paste 41,0,0 : ' picture normalement caché pour la construction des rotations 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 : ' aucun tne défini pour le nouveau masque caption 32,"Tunes: "+str$(ntune%) clear 42 caption 31,"" : ' effacer le message d'attente return ' ===== charger un sprite à partir d'une archive ZIP, ainsi que tout le contenu du ZIP. loadfromzip: z$ = file_name$(22) : ' dialogue d'ouverture de fichier if z$="_" then return : ' abandon ? if lower$(right$(z$,4))<>".zip" then z$ = z$ + ".zip" : ' forcer l'extension zip if file_exists(z$)=0 : ' non trouvé ? message "ZIP file not found" return end_if d$ = file_extract_path$(z$) + "SpriteArchive\" : ' construire un dossier temporaire if dir_exists(d$)=0 then dir_make d$ : ' le créer si inexistant archiver_on archiver_extract z$,d$ : ' extraire tous les fichiers du zip dans le dossier temporaire archiver_off dold$ = dir_current$ : ' mémoriser l'actuel dossier par défaut dir_change d$ : ' se positionner dans le dossier temporaire s$ = file_find_first$ : ' chercher le premier fichier while s$<>"_" : ' et en boucle sur tous les fichiers du dossier: if left$(s$,1)<>"." : ' traiter tout sauf dossiers "." et ".." if file_exists("..\"+s$)=1 then file_delete "..\"+s$ : ' supprimer un fichier éventuellement préexistant file_rename s$,"..\"+s$ : ' déplacer le fichier du dossier temporaire vers le dossier parent end_if s$ = file_find_next$ : ' passer au fichier suivant end_while file_find_close : ' clore la boucle de recherche dir_change dold$ : ' restaurerl'ancien dossier par défaut dir_remove d$ : ' supprimer le dossier temporaire (forcément vide !) s$ = left$(z$,len(z$)-3)+"bmp" : ' faire comme si l'on avait sélectonné le sprite de base gosub load1 : ' et charger ce sprite return ' ===== charger un sprite à partir d'un fichier bmp load: ' Le nom du fichier doit contenir l'angle de rotation de l'image, sous forme: ' xxx(nnn).bmp (xxx étant le nom du sprite) ' Si l'angle est 0 (pas de rotation), la portion "(nnn)" peut ne pas être indiquée. ' Dans ce cas, le fichier sera automatiquement renommé pour inclure le "(0)". s$ = file_name$(20) : ' dialogue d'ouverture if s$="_" then return : ' abandon ? if lower$(right$(s$,4))<>".bmp" then s$ = s$ + ".bmp" : ' forcer l'extenion 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" : ' est-ce qu'on a choisi un des autres fichiers du sprite ? return end_if load1: : ' point d'entrée pour le chargement à partir d'un zip f$ = s$ i% = instr(f$,"(") : ' chercher le début de la marque de l'angle de rotation if i%=0 : ' aucune marque présente ? s$ = left$(f$,len(f$)-4)+"(0).bmp" : ' alors imposer 0° file_rename f$,s$ : ' renommer le sprite f$ = s$ : ' et mémoriser le nouveau nom end_if fm$ = left$(f$,len(f$)-4)+"_mask.bmp" : ' construire les noms des fichiers auxiliaires à partir du nom du sprite ft$ = left$(fm$,len(fm$)-4)+"_tuned.bmp" fl$ = left$(fm$,len(fm$)-4)+"_tuned_list.txt" file_load 1,f$ : ' charger le sprite dans le picture de gauche if file_exists(fm$)=1 : ' est-ce que le masque exiets ? file_load 2,fm$ : ' alors le charger 2d_target_is 2 2d_image_copy 41,0,0,img_w%-1,img_h%-1 : ' et le copier dans l'image 41 qui est la sauvegarde du masque 2d_target_is 6 : ' et le copier également dans le picture invisible 6 2d_image_paste 41,0,0 2d_target_is 2 if file_exists(ft$)=1 : ' est-ce que le masque avec tunes existe ? file_load 3,ft$ : ' alors le charger if file_exists(fl$)=1 : ' est-ce que la liste des tunes existe ? file_load 42,fl$ : ' alors la charger dans la dlist else clear 42 : ' sinon, l'effacer end_if else : ' pas de masque avec tunes: color 3,255,255,255 : ' alors remplir avec blanc clear 42 : ' et effacer la dlist end_if show 50 : ' montrer le bouton "Rectangle" else : ' pas de fichier masque: color 2,255,255,255 : ' alors remplir les deux picture avec blanc color 3,255,255,255 clear 42 : ' effacer la liste des tunes hide 50 : ' cacher le bouton "Rectangle" (il n'y a pas de masque) end_if ntune% = count(42) : ' mémoriser le nombre de tunes LoadTunes() : ' charger la liste des tunes GetAngle(f$) : ' déterminer l'angle de rotation à partir du nom du fichier sprite z$ = left$(f$,len(f$)-3)+"zip" : ' construire le nom di fichier zip éventuel 2d_target_is 2 caption 32,"Tunes: "+str$(ntune%) caption 0,f$ : ' effacer le message d'attente 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 ' ===== charger un masque avec ou sans tunes (en mode debug uniquement) 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 "Mask 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
' ===== sauver le sprite et tous ses fichiers auxiliaires save: if file_exists(f$)=1 : ' sécurité d'écrasement if message_confirmation_yes_no("File does already exist. Replace it ?")<>1 then return end_if file_save 1,f$ : ' enregistrer le sprite 2d_target_is 2 2d_image_paste 41,0,0 : ' restaurer le masque d'origine file_save 2,fm$ : ' enregistrer le masque file_save 3,ft$ : ' enregistrer le masque avec tunes file_save 42,fl$ : ' enregistrer la liste des sprites 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$ : ' signaler les fichiers créés caption 0,f$ : ' adapter le titre de la fenêtre return '===== sauver le sprite et ses fichiers auxiliaires dans une archive zip savetozip: if file_exists(z$)=1 : ' protection contre l'écrasement if message_confirmation_yes_no("File does already exist. Replace it ?")<>1 then return file_delete z$ end_if d$ = file_extract_path$(z$) + "SpriteArchive\" : ' construire le chemin vers on dossier temporaire if dir_exists(d$)=0 then dir_make d$ : ' créer le dossier temporaire s'il n'existe pas file_save 1,d$+file_extract_name$(f$) : ' y placer une copie du sprite 2d_target_is 2 2d_image_paste 41,0,0 : ' récupérer le masque vierge file_save 2,d$+file_extract_name$(fm$) : ' et l'enregistrer aussi file_save 3,d$+file_extract_name$(ft$) : ' ainsi que le masque avec tunes file_save 42,d$+file_extract_name$(fl$) : ' et la liste des tunes archiver_on archiver_add d$,z$ : ' placer tous ces fichiers dans une archive zip archiver_off file_delete d$+file_extract_name$(f$) : ' supprimer les 4 fichiers du dossier temporaire file_delete d$+file_extract_name$(fm$) file_delete d$+file_extract_name$(ft$) file_delete d$+file_extract_name$(fl$) dir_remove d$ : ' et supprimer le dossier temporaire message "Archive file created:"+chr$(13)+chr$(10)+z$ return
' ===== sauver le sprite et toutes ces rotations, avec leurs fichiers auxiliaires, dans une archive zip savealltozip: if file_exists(z$)=1 : ' protecion contre l'écrasement if message_confirmation_yes_no("File does already exist. Replace it ?")<>1 then return file_delete z$ end_if d$ = file_extract_path$(z$) + "SpriteArchive\" : ' construire le chemin vers on dossier temporaire if dir_exists(d$)=0 then dir_make d$ : ' créer le dossier temporaire s'il n'existe pas file_save 1,d$+file_extract_name$(f$) : ' y enregistrer le sprite 2d_target_is 2 2d_image_paste 41,0,0 : ' récupérer le masque vierge file_save 2,d$+file_extract_name$(fm$) : ' et l'y enregistrer aussi file_save 3,d$+file_extract_name$(ft$) : ' ainsi que le masque avec tunes file_save 42,d$+file_extract_name$(fl$) : ' et la liste des tunes
CopyOtherRotations(d$) : ' y placer toutes les autres rotations, également archiver_on archiver_add d$,z$ : ' copier tout le dossier temporaire dans uen archive zip archiver_off RemoveTempFolder(d$) : ' vider et supprimer le dossier temporaire
message "All sprite rotations are achived in:"+chr$(13)+chr$(10)+z$ return ' ===== enregistrer un masque avec ou sans tunes (en mode debug uniquement) 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 ' ===== enregister un masque avec tunes (en mode debug uniquement)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
' ===== montrer un nouveau rectangle symbolisant un tune rect: 2d_target_is 2 2d_image_paste 41,0,0 : ' récipérer le masque vierge toprow% = int(img_h%/4) : ' calculer les coordonnées du rectangle par défaut bottomrow% = int((img_h%*3)/4) leftcol% = int(img_w%/4) rightcol% = int((img_w%*3)/4) 2d_pen_color 255,0,0 : ' tracer en rouge 2d_fill_off : ' mais sans remplissage 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% : ' tracer le rectangle 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
' ===== agrandir le rectangle vers le haut enlargeup: if toprow%=0 then return : ' on touche déjà le haut du masque ? toprow% = toprow% - 1 : ' agrandir d'un pixel vers le haut 2d_image_paste 41,0,0 : ' reprendre le masque vierge 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% : ' et tracer le nouveau rectangle (rouge sans remplissage) return ' ===== déplacer le rectangle vers le haut moveup: if toprow%=0 then return : ' on touche déjà le haut du masque ? toprow% = toprow% - 1 : ' décaler le bord supérieur d'un pixel vers le haut bottomrow% = bottomrow% - 1 : ' décaler le bord inférieur d'un pixel vers le haut 2d_image_paste 41,0,0 : ' reprendre le masque vierge 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% : ' et tracer le nouveau rectangle (rouge sans remplissage) return
' ===== déplacer le rectangle vers la gauche moveleft: if leftcol%=0 then return : ' on touche déjà le bord gauche du masque ? leftcol% = leftcol% - 1 : ' décaler le bord gauche d'un pixel vers la gauche rightcol% = rightcol% - 1 : ' décaler le bord droit d'un pixel vers la gauche 2d_image_paste 41,0,0 : ' reprendre le masque vierge 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% : ' et tracer le nouveau rectangle (rouge sans remplissage) return
' ===== agrandir le rectangle vers la gauche enlargeleft: if leftcol%=0 then return : ' on touche déjà le bord gauche du masque ? leftcol% = leftcol% - 1 : ' décaler le bord gauche d'un pixel vers la gauche 2d_image_paste 41,0,0 : ' reprendre le masque vierge 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% : ' et tracer le nouveau rectangle (rouge sans remplissage) return
' ===== déplacer le rectangle vers la gauche moveright: if rightcol%=(w%-1) then return : ' on touche déjà le bord droit du masque ? rightcol% = rightcol% + 1 : ' décaler le bord droit d'un pixel vers la droite leftcol% = leftcol% + 1 : ' décaler le bord gauche d'un pixel vers la droite 2d_image_paste 41,0,0 : ' reprendre le masque vierge 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% : ' et tracer le nouveau rectangle (rouge sans remplissage) return
' ===== réduire le rectangle à partir de la gauche reduceright: if rightcol%=leftcol% then return : ' déjà réduit à une largeur de 0 pixels ? rightcol% = rightcol% - 1 : ' décaler le bord droit d'un pixel vers la gauche 2d_image_paste 41,0,0 : ' reprendre le masque vierge 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% : ' et tracer le nouveau rectangle (rouge sans remplissage) return
' ===== réduire le rectangle à partir du bas reducedown: if bottomrow%=toprow% then return : ' déjà réduit à une hauteur de 0 pixels ? bottomrow% = bottomrow% - 1 : ' décaler le bord bas d'un pixel vers le haut 2d_image_paste 41,0,0 : ' reprendre le masque vierge 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% : ' et tracer le nouveau rectangle (rouge sans remplissage) return
' ===== déplacer le rectangle vers le bas movedown: if bottomrow%=(H%-1) then return : ' on touche déjà le bord bas du masque ? bottomrow% = bottomrow% + 1 : ' décaler le bord bas d'un pixel vers le bas toprow% = toprow% + 1 : ' décaler le bord haut d'un pixel vers le bas 2d_image_paste 41,0,0 : ' reprendre le masque vierge 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% : ' et tracer le nouveau rectangle (rouge sans remplissage) return
' ===== enregistrer le rectangle actuel sous forme de tune tune: if ntune%>=63 : ' on ne peut créer que 63 tunes maxi ! message "Too many tune sections" return end_if ntune% = ntune% + 1 : ' compter le nouveau tune s$ = trim$(text$(34)) : ' récupérer le nom du nouveau tune if s$="" then s$ = "Tune "+str$(ntune%) : ' nom vide? Alors générer un nom synthétique tunes%(ntune%,0) = leftcol% : ' mémoriser les coordnnées du tune tunes%(ntune%,1) = toprow% tunes%(ntune%,2) = rightcol% tunes%(ntune%,3) = bottomcol% ntunes$(ntune%) = s$ : ' et son nom item_add 42,str$(ntune%)+","+str$(leftcol%)+","+str$(toprow%)+","+str$(rightcol%)+","+str$(bottomrow%)+","+s$ : 'ajouter dans la liste 2d_target_is 3 : ' cibler le picture du masque avec tuned 2d_fill_on : ' passer en mode "remplissage" 2d_fill_color 255,255,ntune%*4 : ' couleur jaune pour l'intérieur, altéré par le numéro du tune 2d_pen_color 255,255,ntune%*4 : ' et pour le bord 2d_rectangle leftcol%,toprow%,rightcol%,bottomrow% : ' la composante B de la valeur RBG est le numéro du tune * 4 2d_target_is 2 : ' basculer à nouveau vers le picture du masque central 2d_pen_color 255,0,0 : ' desin en rouge 2d_fill_off : ' sans remplssage caption 32,"Tunes: "+str$(ntune%) : ' informer du nombre de tuned return
' ===== rotation à droite de 90° right90: RotatePictureRight(1) : ' rotation du sprite 2d_target_is 2 2d_image_paste 41,0,0 : ' récupérer le masque vierge RotatePictureRight(2) : ' rotation du masque 2d_image_copy 41,0,0,img_w%,img_h% : ' sauvegarder le masque nouveau vierge 2d_target_is 6 2d_image_paste 41,0,0 : ' récupérer le masque vierge RotatePictureRight(3) : ' rotation du masque avec tunes RotateTunesRight() : ' rotation des tunes AdjustAngle(0-90) : ' recalculer l'angle 2d_target_is 2 return
' ===== rotation à gauche de 90° left90: RotatePictureLeft(1) : ' rotation du sprite 2d_target_is 2 2d_image_paste 41,0,0 : ' récupérer le masque vierge RotatePictureLeft(2) : ' rotation du masque 2d_image_copy 41,0,0,img_w%,img_h% : ' sauvegarder le masque nouveau vierge 2d_target_is 6 2d_image_paste 41,0,0 : ' récupérer le masque vierge RotatePictureLeft(3) : ' rotation du masque avec tunes RotateTunesLeft() : ' rotation des tunes AdjustAngle(90) : ' recalculer l'angle 2d_target_is 2 return
' ===== effet miroir horizontal flipdown: FlipPictureDown(1) : ' renverser le sprite horizontalement 2d_target_is 2 2d_image_paste 41,0,0 : ' récupérer le masque vierge FlipPictureDown(2) : ' renverser le masque horizontalement 2d_image_copy 41,0,0,img_w%,img_h% : ' sauvegarder le masque nouveau vierge 2d_target_is 6 2d_image_paste 41,0,0 : ' récupérer le masque vierge FlipPictureDown(3) : ' renverser le masque avec tunes horizontalement FlipTunesDown() : ' renversement des tunes 2d_target_is 2 return
' ===== effet miroir vertical flipleft: FlipPictureLeft(1) : ' renverser le sprite vertictalement 2d_target_is 2 2d_image_paste 41,0,0 : ' récupérer le masque vierge FlipPictureLeft(2) : ' renverser le sprite vertictalement 2d_image_copy 41,0,0,img_w%,img_h% : ' sauvegarder le masque nouveau vierge 2d_target_is 6 2d_image_paste 41,0,0 : ' récupérer le masque vierge FlipPictureLeft(3) : ' renverser le sprite vertictalement FlipTunesLeft() : ' renversement des tunes 2d_target_is 2 return
' =================================== procédures de service
' ===== varier l'angle de rotation (+/- 90°) sub AdjustAngle(delta%) dim_local s$, p1%, p2%, a$, oldangle% oldangle% = angle% : ' sauvegarder la valeur actuelle angle% = angle% + delta% : ' calculer l'angle résultant if angle%<0 then angle% = 270 : ' projeter sur l'intervalle [0,360[ if angle%=360 then angle% = 0 ' adapter les noms des fichiers: f$, fm$, ft$, fl$ a$ = "("+str$(angle%)+")" : ' la marque pour indiquer l'angle p1% = instr(f$,"(") : ' chercher la position actuelle de la marque d'angle p2% = instr(f$,")") f$ = left$(f$,p1%-1)+a$+mid$(f$,p2%+1,len(f$)) : ' nouveu nom du fichier sprite p1% = instr(fm$,"(") p2% = instr(fm$,")") fm$ = left$(fm$,p1%-1)+a$+mid$(fm$,p2%+1,len(fm$)) : ' nouveu nom du fichier masque p1% = instr(ft$,"(") p2% = instr(ft$,")") ft$ = left$(ft$,p1%-1)+a$+mid$(ft$,p2%+1,len(ft$)) : ' nouveu nom du fichier masque avec tunes p1% = instr(fl$,"(") p2% = instr(fl$,")") fl$ = left$(fl$,p1%-1)+a$+mid$(fl$,p2%+1,len(fl$)) : ' nouveu nom du fichier liste des tunes z$ = left$(f$,len(f$)-3)+"zip" caption 5,"Angle: "+str$(angle%)+"°" : ' afficher la nouvelle valeur de l'angle caption 0,f$ : ' et le nom du fichier sprite 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
' ===== rotation du contenu d'un objet picture de 90° vers la gauche sub RotatePictureLeft(pic%) dim_local w%, h%, l%, c% caption 69,"Wait please.." : ' car ça peut être long... h% = height(pic%) : w% = width(pic%) : ' inverser largeur et hauteur width 4,h% : height 4,w% : ' configurer un picture de travail 2d_target_is 4 for l%=0 to h%-1 : ' pour chaque ligne de pixels for c%=0 to w%-1 : ' pour chaque pixel dans la ligne 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 : ' dessiner le même point mais en inversant ligne et colonne next c% caption 69,"Wait please... "+str$(int(l%*100/h%))+" %" : ' état d'avancement display next l% width pic%,h% : height pic%,w% : ' redimensionner le picture à traiter color pic%,0,0,0 : ' et l'effacer 2d_image_copy 43,0,0,h%-1,w%-1 : ' copier le picture de travail dans une image interne 2d_target_is pic% 2d_image_paste 43,0,0 : ' et recopier dans le picture à traiter caption 69,"" : ' effacer l'indicateur d'avancement end_sub
' ===== effet miroir le long d'un axe central vertical sub FlipPictureLeft(pic%) dim_local w%, h%, l%, c% caption 69,"Wait please.." : ' car ça peut être long... h% = height(pic%) : w% = width(pic%) : ' prendre les dimensions actuelles du picture width 4,h% : height 4,w% : ' prendre les dimensions actuelles du picture 2d_target_is 4 for l%=0 to h%-1 : ' pour chaque ligne de pixels for c%=0 to w%-1 : ' pour chaque pixel d'une ligne 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% : ' dessiner le même point à l'abscisse opposée next c% caption 69,"Wait please... "+str$(int(l%*100/h%))+" %" : ' état d'avancement display next l% width pic%,h% : height pic%,w% : ' sûrement inutile ici... color pic%,0,0,0 : ' effacer le picture 2d_image_copy 43,0,0,h%-1,w%-1 : ' copier le picture de travail dans un image 2d_target_is pic% 2d_image_paste 43,0,0 : ' et recopier l'image dans le picture initial caption 69,"" : ' effacer l'indicateur d'avancement end_sub
' ===== effet miroir le long d'un axe central horizontal sub FlipPictureDown(pic%) dim_local w%, h%, l%, c% caption 69,"Wait please.." : ' car ça peut être long... h% = height(pic%) : w% = width(pic%) : ' prendre les dimensions actuelles du picture width 4,h% : height 4,w% : ' prendre les dimensions actuelles du picture 2d_target_is 4 for l%=0 to h%-1 : ' pour chaque ligne de pixels for c%=0 to w%-1 : ' pour chaque pixel d'une ligne 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 : ' dessiner le même point à l'ordonnée opposée next c% caption 69,"Wait please... "+str$(int(l%*100/h%))+" %" : ' état d'avancement display next l% width pic%,h% : height pic%,w% : ' sûrement inutile ici... color pic%,0,0,0 : ' effacer le picture 2d_image_copy 43,0,0,h%-1,w%-1 : ' copier le picture de travail dans un image 2d_target_is pic% 2d_image_paste 43,0,0 : ' et recopier l'image dans le picture initial caption 69,"" : ' effacer l'indicateur d'avancement end_sub
' ===== rotation du contenu d'un objet picture de 90° vers la droite sub RotatePictureRight(pic%) dim_local w%, h%, l%, c% caption 69,"Wait please.." : ' car ça peut être long... h% = height(pic%) : w% = width(pic%) : ' inverser largeur et hauteur width 4,h% : height 4,w% : ' configurer un picture de travail 2d_target_is 4 for l%=0 to h%-1 : ' pour chaque ligne de pixels for c%=0 to w%-1 : ' pour chaque pixel dans la ligne 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% : ' dessiner le même point mais en inversant ligne et colonne next c% caption 69,"Wait please... "+str$(int(l%*100/h%))+" %" : ' état d'avancement display next l% width pic%,h% : height pic%,w% : ' redimensionner le picture à traiter color pic%,0,0,0 : ' et l'effacer 2d_image_copy 43,0,0,h%-1,w%-1 : ' copier le picture de travail dans une image interne 2d_target_is pic% 2d_image_paste 43,0,0 : ' et recopier dans le picture à traiter caption 69,"" : ' effacer l'indicateur d'avancement end_sub
' ===== appliquer la rotation de 90° à gauche aux tunes sub RotateTunesLeft() dim_local t%, t$, n$, p%, nt%, lc%, tr%, rc%, br%, lcx%, trx%, rcx%, brx%, w%, h% if count(42)>0 caption 69,"Tune transposition..." : ' car ça peut être long... display w% = width(1) : ' récupérer les nouvelles dimensions du sprite h% = height(1) for t%=1 to count(42) : ' boucle sur la liste des tunes t$ = item_read$(42,t%) : ' lire une définition d'un tune p% = instr(t$,",") nt% = val(left$(t$,p%-1)) : ' extraire le numéro du tune t$ = mid$(t$,p%+1,100) p% = instr(t$,",") lcx% = val(left$(t$,p%-1)) : ' extraire l'ancienne coordonnée x0 t$ = mid$(t$,p%+1,100) p% = instr(t$,",") trx% = val(left$(t$,p%-1)) : ' extraire l'ancienne coordonnée y0 t$ = mid$(t$,p%+1,100) p% = instr(t$,",") rcx% = val(left$(t$,p%-1)) : ' extraire l'ancienne coordonnée x1 t$ = mid$(t$,p%+1,100) p% = instr(t$,",") brx% = val(left$(t$,p%-1)) : ' extraire l'ancienne coordonnée y1 n$ = mid$(t$,p%+1,100) : ' extraire le nom du tune
lc% = trx% : ' nouvelle coordonnée x0 tr% = h%-rcx%-1 : ' nouvelle coordonnée y0 rc% = brx% : ' nouvelle coordonnée x1 br% = h%-lcx%-1 : ' nouvelle coordonnée y0 tunes%(t%,0) = lc% : ' mettre la table des tunes à jour tunes%(t%,1) = tr% tunes%(t%,2) = rc% tunes%(t%,3) = br%
item_delete 42,t% : ' supprimer la ligne dans la liste des tunes et la recréer item_insert 42,t%,str$(nt%)+","+str$(lc%)+","+str$(tr%)+","+str$(rc%)+","+str$(br%)+","+n$ if debug%=1 then item_add 123,item_read$(42,t%) next t% : ' fin de boucle sur les lignes de définition des tunes caption 69,"" : ' effacer l'indicateur d'avancement end_if ' ajuster les coordonnées du rectangle actuel qui doit être tourné également lc% = leftcol% tr% = toprow% rc% = rightcol% br% = bottomrow% leftcol% = tr% toprow% = h%-rc%-1 rightcol% = br% bottomrow% = h%-lc%-1 ' ajuster les variables donnant les dimensions actuelles img_w% = width(1) img_h% = height(1) w% = img_w% h% = img_h% end_sub
' ===== appliquer la rotation de 90° à droite aux tunes 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..." : ' car ça peut être long... display w% = width(1) : ' récupérer les nouvelles dimensions du sprite h% = height(1) for t%=1 to count(42) : ' boucle sur la liste des tunes t$ = item_read$(42,t%) : ' lire une définition d'un tune p% = instr(t$,",") nt% = val(left$(t$,p%-1)) : ' lire une définition d'un tune t$ = mid$(t$,p%+1,100) p% = instr(t$,",") lcx% = val(left$(t$,p%-1)) : ' extraire l'ancienne coordonnée x0 t$ = mid$(t$,p%+1,100) p% = instr(t$,",") trx% = val(left$(t$,p%-1)) : ' extraire l'ancienne coordonnée y0 t$ = mid$(t$,p%+1,100) p% = instr(t$,",") rcx% = val(left$(t$,p%-1)) : ' extraire l'ancienne coordonnée x1 t$ = mid$(t$,p%+1,100) p% = instr(t$,",") brx% = val(left$(t$,p%-1)) : ' extraire l'ancienne coordonnée y1 n$ = mid$(t$,p%+1,100) : ' extraire le nom du tune
lc% = w%-brx%-1 : ' nouvelle coordonnée x0 tr% = lcx% : ' nouvelle coordonnée y0 rc% = w%-trx%-1 : ' nouvelle coordonnée x1 br% = rcx% : ' nouvelle coordonnée y1
tunes%(t%,0) = lc% : ' mettre la table des tunes à jour tunes%(t%,1) = tr% tunes%(t%,2) = rc% tunes%(t%,3) = br%
item_delete 42,t% : ' supprimer la ligne dans la liste des tunes et la recréer item_insert 42,t%,str$(nt%)+","+str$(lc%)+","+str$(tr%)+","+str$(rc%)+","+str$(br%)+","+n$ if debug%=1 then item_add 123,item_read$(42,t%) next t% : ' fin de boucle sur les lignes de définition des tunes caption 69,"" : ' effacer l'indicateur d'avancement 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%
tunes%(t%,0) = lc% tunes%(t%,1) = tr% tunes%(t%,2) = rc% tunes%(t%,3) = br%
item_delete 42,t% item_insert 42,t%,str$(nt%)+","+str$(lc%)+","+str$(tr%)+","+str$(rc%)+","+str$(br%)+","+n$ if debug%=1 then item_add 123,item_read$(42,t%) 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
tunes%(t%,0) = lc% tunes%(t%,1) = tr% tunes%(t%,2) = rc% tunes%(t%,3) = br%
item_delete 42,t% item_insert 42,t%,str$(nt%)+","+str$(lc%)+","+str$(tr%)+","+str$(rc%)+","+str$(br%)+","+n$ if debug%=1 then item_add 123,item_read$(42,t%) next t% caption 69,"" end_if ' ajuster les coordonnées du rectangle actuel 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
sub LoadTunes() dim_local i%, t%, p%, s$ if ntune%=0 then exit_sub for t%=1 to ntune% s$ = item_read$(42,t%) p% = instr(s$,",") s$ = mid$(s$,p%+1,100) for i%=0 to 3 p% = instr(s$,",") tunes%(t%,i%) = val(left$(s$,p%-1)) s$ = mid$(s$,p%+1,100) next i% ntunes$(t%) = s$ if debug%=1 then item_add 123,str$(tunes%(t%,0))+","+str$(tunes%(t%,1))+" "+str$(tunes%(t%,2))+","+str$(tunes%(t%,3))+" = "+ntunes$(t%) next t% end_sub
' ===== localiser un tune après un click dans le picture du masque avec tunes sub LocateTune() dim_local x%, y%, t% seltune% = 0 if ntune%=0 then return x% = mouse_x_left_down(3) y% = mouse_y_left_down(3) if debug%=1 then item_add 123,str$(x%)+","+str$(y%) for t%=1 to ntune% if (x%>=tunes%(t%,0)) and (x%<=tunes%(t%,2)) if (y%>=tunes%(t%,1)) and (y%<=tunes%(t%,3)) seltune% = t% exit_sub end_if end_if next t% end_sub
sub CopyOtherRotations(dest$) dim_local x$, deb$, p1%, p2% x$ = file_extract_name$(f$) p1% = instr(x$,"(") p2% = instr(x$,")") if (p1%=0) or (p2%=0) then exit_sub deb$ = left$(x$,p1%) x$ = file_find_first$ while x$<>"_" if left$(x$,p1%)=deb$ if file_exists(dest$+x$)=0 then file_copy x$,dest$+x$ end_if x$ = file_find_next$ end_while file_find_close end_sub
sub RemoveTempFolder(dir$) dim_local dold$, x$ dold$ = dir_current$ dir_change d$ x$ = file_find_first$ while x$<>"_" if left$(x$,1)<>"." then file_delete x$ x$ = file_find_next$ end_while file_find_close dir_change dold$ dir_remove dir$ end_sub
| |
| | | Klaus
Nombre de messages : 12295 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Construire un masque pour les sprites Sam 20 Juin 2015 - 18:53 | |
| Voici le source de la même version, avec une correction mineure, mais surtout avec une documentation complète sous forme de commentaires dans le source, tant pour le mode d'emploi en début de programme que pour l'explication du code au fil des instructions.
Malheureusement, le programme est devenu trop long pour tenir dans un post de ce forum. J'ai donc tout placé dans mon WebDav, dossier Outils\Outils graphiques\. Vous y trouverez build_sprite_mask.bas (ce programme) 2d_utilities.bas (SUBs de Klaus pour gérer les collisions) et RotateScanline qui est un utilitaire freeware proposé par SourceForge. Donc, n'hésitez pas !
| |
| | | Klaus
Nombre de messages : 12295 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Construire un masque pour les sprites Dim 21 Juin 2015 - 11:13 | |
| Nouvelle version: V1.6 du 20/06/2015
Nouveauté: permettre des sprites de 900x600 pixels
Ceci est une refonte majeure au niveau de la présentation visuelle. En effet, on ne peut pas représenter 4 pictures de 900x600 pixels dans la fenêtre visible. J'ai donc utilisé les tout nouveaux objets CONTAINER_TAB et TAB pour restructurer l'affichage.
Le dossier Outils\Outils graphiques\ est à jour sur le WebDav. | |
| | | Klaus
Nombre de messages : 12295 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Construire un masque pour les sprites Dim 21 Juin 2015 - 18:43 | |
| Nouvelle version: V1.7 du 21/06/2015
Nouveauté: pouvoir déplacer et/ou redimensionner un tune existant
On peut maintenant sélectionner un tune en cliquant dessus dans le picture (onglet) du masque avec tunes. Si l'on répond "Non" à la question de confirmation pour la suppression, ce tune est alors sélectionné, et son rectangle rouge s'affiche dans le picture (onglet) du masque vierge. On peut alors déplacer et/ou redimensionner ce rectangle comme lors d'une création d'un nouveau tune, puis cliquer sur le bouton de validation. Dans le picture (onglet) du masque avec tunes, l'ancien tune sera alors effacé et se réaffiche à sa nouvelle position. Si le libellé a été changé dans l'opération, il sera également mis à jour.
Le dossier Outils\Outils graphiques\ est à jour sur le WebDav. | |
| | | Jicehel
Nombre de messages : 5947 Age : 51 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Construire un masque pour les sprites Dim 21 Juin 2015 - 22:27 | |
| Je viens de tester, c'est excellent Klaus. Très bien fait | |
| | | Klaus
Nombre de messages : 12295 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Construire un masque pour les sprites Dim 21 Juin 2015 - 22:52 | |
| | |
| | | Jicehel
Nombre de messages : 5947 Age : 51 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Construire un masque pour les sprites Dim 21 Juin 2015 - 23:17 | |
| Klaus, je me pose une question. Aurais-tu le temps et verrais tu comment procéder facilement pour faire une autre opération.
Disons qu'un personnage soit définit sur plusieurs images (pas encore des sprites, mais des images "sources" du même personnage.) Pour en faire un sprite, il est possible d'uniformiser les tailles avec un logiciel de dessin ce qui est plus ou moins fastidieux.
Avec ton utilitaire, je pense à une autre approche, mais je ne sais pas encore si c'est une bonne idée réalisable. Ce serait de définir le zones sur une image de référence puis sur une autre image. Disons par exemple que l'on définit 3 zones visibles sur les 2 images dans un peu près les mêmes dispositions: la tête, un pied et la ceinture. L'idée serait alors que le programme calcul le facteur de multiplication de la taille à appliquer à la deuxième image pour que le personnage ait la même taille que sur la première.
Qu'en penses-tu ? Est-ce une bonne idée ? Si oui penses tu pouvoir le coder (par rapport à ton envie et à ton temps par rapport à tes autres projets ?) | |
| | | Klaus
Nombre de messages : 12295 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Construire un masque pour les sprites Dim 21 Juin 2015 - 23:51 | |
| Eh bien, le problème que tu évoques, a un lien évident avec un sujet pour lequel je fais des recherches en ce moment: des algorithmes d'agrandissement/réduction d'une image, en minimisant les pertes de qualité. Il est en effet facile de calculer un facteur de changement de taille par direction, mais il est beaucoup moins facile de l'appliquer, que ce soit sur une image entière ou une partie d'image comme on bras ou une tête par exemple. Le problème est identique. J'ai une solution satisfaisante dans KGF.dll avec une fonction qui redimensionne une image. Mais dans le programme présent, je suis en 100 % Panoramic, et ça change tout. Mais je ne suis pas encore au bout de mes recherches. | |
| | | Jicehel
Nombre de messages : 5947 Age : 51 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Construire un masque pour les sprites Lun 22 Juin 2015 - 7:53 | |
| OK, de toute façon je propose des idées et toi après tu vois ce que tu veux prendre dedans | |
| | | Klaus
Nombre de messages : 12295 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Construire un masque pour les sprites Lun 22 Juin 2015 - 11:57 | |
| Nouvelle version: V1.8 du 22/06/2015
Nouveauté: ajout de deux boutons: "Magnify x2" et "Reduce :2"
Le code est à jour dans le dossier Outils\Outils graphiques\ de mon WebDav.
On peut maintenant agrandir le sprite et ses tunes, d'un facteur 2, par interpolation bi-linéaire. A condition que cela tienne dans les limites des 900x600 pixels qui sont le maximum autorisé.
On peut aussi réduire d'un facteur 2. Dans tous les cas, les sprites sont redimensionnés aussi.
Je n'ai pas changé les noms de fichiers après changement de dimension. Un enregistrement d'un sprite redimensionné remplace donc l'original sur disque. | |
| | | Jicehel
Nombre de messages : 5947 Age : 51 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Construire un masque pour les sprites Lun 22 Juin 2015 - 12:02 | |
| Ta remarque me fait penser qu'un enregistrer sous pourrait être interessant. L'utilisateur ne souhaitant pas forcément modifier son original. | |
| | | 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
| |
| |
| |