FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  FAQFAQ  RechercherRechercher  S'enregistrerS'enregistrer  MembresMembres  GroupesGroupes  Connexion  
Derniers sujets
» Panoramic et ses curiosités
par Jean Claude Aujourd'hui à 21:48

» Synedit Parameters
par Jean Claude Aujourd'hui à 21:15

» Utilitaire de suppression de fichiers
par Jean Claude Aujourd'hui à 21:11

» Code à vérifier SVP (Oups ! résolu)
par Jean Claude Hier à 21:16

» Compilateur FBPano
par jean_debord Hier à 9:56

» Bienvenue à Virtualalan !
par UltraVox Hier à 9:18

» Concours de Morpions
par jjn4 Hier à 0:04

» ShortName$(F) [Cloturé]
par papydall Mer 21 Juin 2017 - 16:19

» Remplacer espace par tiret dans noms des dossiers / fichiers
par papydall Mer 21 Juin 2017 - 15:27

» Menu personalisé avec icones et menu contextuel
par Laurent (Minibug) Mer 21 Juin 2017 - 12:44

» La liste des choses à faire ...
par Jack Mar 20 Juin 2017 - 22:49

» Quoi de neuf à propos de Goric 3D ? (@Jack)
par UltraVox Mar 20 Juin 2017 - 21:06

» Nom court et anti fenetre dos
par silverman Mar 20 Juin 2017 - 18:31

» Ludothèque Panoramic
par jjn4 Mar 20 Juin 2017 - 18:09

» Proposition à la communauté
par Yannick Mar 20 Juin 2017 - 15:02

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Juin 2017
LunMarMerJeuVenSamDim
   1234
567891011
12131415161718
19202122232425
2627282930  
CalendrierCalendrier

Partagez | 
 

 Construire un masque pour les sprites

Voir le sujet précédent Voir le sujet suivant Aller en bas 
Aller à la page : Précédent  1, 2, 3, 4  Suivant
AuteurMessage
Jicehel

avatar

Nombre de messages : 5838
Age : 44
Localisation : 77500
Date d'inscription : 19/04/2011

MessageSujet: Re: Construire un masque pour les sprites   Lun 15 Juin 2015 - 12:53

cool, j'essaye ce soir Wink
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 9969
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Construire un masque pour les sprites   Mar 16 Juin 2015 - 14: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\.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Jean Claude

avatar

Nombre de messages : 4933
Age : 63
Localisation : 83 Var
Date d'inscription : 07/05/2009

MessageSujet: Re: Construire un masque pour les sprites   Mar 16 Juin 2015 - 15: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+
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Jicehel

avatar

Nombre de messages : 5838
Age : 44
Localisation : 77500
Date d'inscription : 19/04/2011

MessageSujet: Re: Construire un masque pour les sprites   Mar 16 Juin 2015 - 15: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...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
papydall

avatar

Nombre de messages : 5384
Age : 66
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

MessageSujet: Re: Construire un masque pour les sprites   Mar 16 Juin 2015 - 17:50

Au boulot Jicehel, au boulot! Laughing
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://papydall-panoramic.forumarabia.com/
Klaus

avatar

Nombre de messages : 9969
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Construire un masque pour les sprites   Mar 16 Juin 2015 - 21: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 ?
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Jicehel

avatar

Nombre de messages : 5838
Age : 44
Localisation : 77500
Date d'inscription : 19/04/2011

MessageSujet: Re: Construire un masque pour les sprites   Mar 16 Juin 2015 - 23: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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 9969
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Construire un masque pour les sprites   Mer 17 Juin 2015 - 9: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°.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Invité
Invité



MessageSujet: Re: Construire un masque pour les sprites   Mer 17 Juin 2015 - 9: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.
Revenir en haut Aller en bas
Klaus

avatar

Nombre de messages : 9969
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Construire un masque pour les sprites   Mer 17 Juin 2015 - 9: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/2015

Nouveauté:
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

Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
papydall

avatar

Nombre de messages : 5384
Age : 66
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

MessageSujet: Re: Construire un masque pour les sprites   Mer 17 Juin 2015 - 14: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
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://papydall-panoramic.forumarabia.com/
Klaus

avatar

Nombre de messages : 9969
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Construire un masque pour les sprites   Jeu 18 Juin 2015 - 1:09

Nouvelle version:
V1.3 du 18/06/2015

Nouveauté:
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

Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Klaus

avatar

Nombre de messages : 9969
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Construire un masque pour les sprites   Jeu 18 Juin 2015 - 14:08

Nouvelle version:
V1.4 du 18/06/2015

Nouveauté:
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

Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Jicehel

avatar

Nombre de messages : 5838
Age : 44
Localisation : 77500
Date d'inscription : 19/04/2011

MessageSujet: Re: Construire un masque pour les sprites   Jeu 18 Juin 2015 - 15:05

Ce sera en effet très pratique pour les échanges de sprites Wink
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 9969
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Construire un masque pour les sprites   Ven 19 Juin 2015 - 15:35

Nouvelle version:
V1.5 du 19/06/2015

Nouveauté:
- 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
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Klaus

avatar

Nombre de messages : 9969
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Construire un masque pour les sprites   Sam 20 Juin 2015 - 19: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 !
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Klaus

avatar

Nombre de messages : 9969
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Construire un masque pour les sprites   Dim 21 Juin 2015 - 12: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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Klaus

avatar

Nombre de messages : 9969
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Construire un masque pour les sprites   Dim 21 Juin 2015 - 19: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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Jicehel

avatar

Nombre de messages : 5838
Age : 44
Localisation : 77500
Date d'inscription : 19/04/2011

MessageSujet: Re: Construire un masque pour les sprites   Dim 21 Juin 2015 - 23:27

Je viens de tester, c'est excellent Klaus. Très bien fait
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 9969
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Construire un masque pour les sprites   Dim 21 Juin 2015 - 23:52

Merci, Jicehel !
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Jicehel

avatar

Nombre de messages : 5838
Age : 44
Localisation : 77500
Date d'inscription : 19/04/2011

MessageSujet: Re: Construire un masque pour les sprites   Lun 22 Juin 2015 - 0: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 ?)
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 9969
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Construire un masque pour les sprites   Lun 22 Juin 2015 - 0: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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Jicehel

avatar

Nombre de messages : 5838
Age : 44
Localisation : 77500
Date d'inscription : 19/04/2011

MessageSujet: Re: Construire un masque pour les sprites   Lun 22 Juin 2015 - 8:53

OK, de toute façon je propose des idées et toi après tu vois ce que tu veux prendre dedans Wink
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 9969
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Construire un masque pour les sprites   Lun 22 Juin 2015 - 12: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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Jicehel

avatar

Nombre de messages : 5838
Age : 44
Localisation : 77500
Date d'inscription : 19/04/2011

MessageSujet: Re: Construire un masque pour les sprites   Lun 22 Juin 2015 - 13:02

Ta remarque me fait penser qu'un enregistrer sous pourrait être interessant. L'utilisateur ne souhaitant pas forcément modifier son original.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Contenu sponsorisé




MessageSujet: Re: Construire un masque pour les sprites   

Revenir en haut Aller en bas
 
Construire un masque pour les sprites
Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 2 sur 4Aller à la page : Précédent  1, 2, 3, 4  Suivant
 Sujets similaires
-
» Recherche sprites (et eventuellement musiques) pour un jeu..
» Construire un chargeur d'accus pour FR3b
» Les sprites
» Ressources intéressantes pour créer des sprites isométriques
» squellette pour perso 3d et monstre sur gam maker !

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: PANORAMIC 32 bits :: Vos sources, vos utilitaires à partager-
Sauter vers: