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
» A propos des attributs de fichier
par Oscaribout Aujourd'hui à 1:53

» Problème de math
par Marc37 Hier à 23:04

» Problème de math
par braveen Hier à 21:40

» I Love You
par papydall Hier à 19:22

» Un petit "coucou" à tous les Panoramiciens !
par mindstorm Hier à 17:06

» MARK_ON déclenche un événement ON_CLICK à la place de ...
par Jean Claude Mer 18 Oct 2017 - 18:08

» mise a jour calculatrice
par joeeee2017 Mer 18 Oct 2017 - 15:57

» [solved] 3D_LINE How to ?
par Jicehel Mer 18 Oct 2017 - 11:01

» Convertisseur de base 10 de 2 à 36
par gigi75 Mar 17 Oct 2017 - 18:49

» calculatrice avec touches movibles
par joeeee2017 Dim 15 Oct 2017 - 1:11

» CORTANA
par gigi75 Sam 14 Oct 2017 - 16:32

» Calculatrice
par Jean Claude Sam 14 Oct 2017 - 12:30

» Compilateur FBPano
par jean_debord Jeu 12 Oct 2017 - 9:53

» KGF_dll - nouvelles versions
par Klaus Mar 10 Oct 2017 - 18:49

» à propos de Panoramic_Editor [Résolu]
par Klaus Mar 10 Oct 2017 - 3:19

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Octobre 2017
LunMarMerJeuVenSamDim
      1
2345678
9101112131415
16171819202122
23242526272829
3031     
CalendrierCalendrier

Partagez | 
 

 Construire un masque pour les sprites

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

avatar

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

MessageSujet: Construire un masque pour les sprites   Lun 25 Mai 2015 - 10:56

En lien avec une discussion sur la détection des collisions entre sprites dans un scene2d, j'ai fait un utilitaire build_sprite_mask.bas. Il prend en entrée une image BMP en format 200x200, construit un masque blanc/noir à partir de cette image, puis permet de définir des zones rectangulaires de contact nommées tunes) jusqu'à un maximum de 63 zones par image. L'ensemble de ces zones se superposent au masque blanc/noir dans un second masque appelé tune qui peut être sauvegardé, comme le masque. Le programme crée simultanément un fichier texte contenant la définition de tous les rectangles tune, avec une ligne par tune dans le format n,x0,y0,x1,y1, n étant le numéro du tune (1, 2, ...). Les tunes ont des couleurs dérivées du jaune: 255,255,n*4, afin de pouvoir les différencier par programme (visuellement, c'est difficile, mais inutile).

Ainsi, un programme utilisant une détection de collisions par masque, pourra utiliser le fichier tune avec les règles suivantes, pour chaque couleur RGB de pixel rencontrée:
(0,0,0) = zone transparente, pas de contact
(255,255,255) = contact, zone non différenciée (pas de tune)
(255,255,t) ) zone de contact différenciée, le numéro du tube est t/4

Autre solution: un programme utilisant la détection par zones rectangulaires, pourra utiliser la liste des tunes dans le fichier texte pour identifier un rectangle de contact.

A partir d'un nom de fichier contenant l'image du sprite (obligatoirement *.bmp), le programme construit les noms de fichiers suivants:
xxx.bmp
xxx_mask.bmp
xxx_mask_tuned.bmp
xxx_mask_tuned_list.txt
Les noms contiennent directement le sens du fichier concerné.

Après le chargement d'une image, on a un bouton "Build mask" qui construit le masque et met les tunes à zéro. On a alors un bouton "Rectangle" qui s'affiche. Un clic sur ce bouton affiche un cadre en fil rouge sur le masque, ainsi qu'une série de boutons permettant de "piloter" le cadre. On peut le déplacer, l'agrandir et/ou réduire en hauteur et/ou largeur. Un bouton "Tune" valide la position actuelle du cadre comme un nouveau tune qui s'affiche alors dans une image à côté. On peut ainsi constituer jusqu'à 63 tunes. Les boutons "Save mask" et "Save tune" font ce qu'ils disent, sachant que "Save mask" sauvegarde également les tunes et la liste, et "Save tune" sauvegarde également la liste.

Voici le programme, très court:
Code:
' build_sprite_mask.bas

label build, load, loadm, savem, savet, rect, tune
label enlargeup, moveup, moveleft, enlargeleft, moveright, reduceright, movedown, reducedown

dim s$, f$, fm$, ft$, fl$, w%, h%, x%, y%, toprow%, bottomrow%, leftcol%, rightcol%, ntune%

width 0,1000 : height 0,600

picture 1 : top 1,10 : left 1, 10 : width 1,200 : height 1,200
picture 2 : top 2,10 : left 2,350 : width 2,200 : height 2,200
picture 3 : top 3,10 : left 3,560 : width 3,200 : height 3,200

image 41
dlist 42

button 10 : top 10,90 : left 10,240 : caption 10,"Build mask" : on_click 10,build
button 11 : top 11,220 : left 11,50 : caption 11,"Load image" : on_click 11,load
button 12 : top 12,220 : left 12,390 : caption 12,"Load mask" : on_click 12,loadm
button 13 : top 13,250 : left 13,390 : caption 13,"Save mask" : on_click 13,savem
button 15 : top 15,250 : left 15,600 : caption 15,"Save tune" : on_click 15,savet



button 52 : top 52,310 : left 52,390 : caption 52,"Move ^" :    on_click 52,moveup    : hide 52
button 51 : top 51,340 : left 51,390 : caption 51,"Enlarge ^" : on_click 51,enlargeup : hide 51
button 50 : top 50,370 : left 50,370 : caption 50,"Rectangle" : on_click 50,rect      : hide 50 : width 50,60
button 59 : top 59,370 : left 59,430 : caption 59,"Tune"      : on_click 59,tune      : hide 59 : width 59,60
button 54 : top 54,370 : left 54,290 : caption 54,"Enlarge <" : on_click 54,enlargeleft : hide 54
button 53 : top 53,370 : left 53,210 : caption 53,"Move <" :    on_click 53,moveleft    : hide 53
button 55 : top 55,370 : left 55,500 : caption 55,"Reduce >" : on_click 55,reduceright : hide 55
button 56 : top 56,370 : left 56,580 : caption 56,"Move >" :    on_click 56,moveright    : hide 56
button 57 : top 57,430 : left 57,390 : caption 57,"Move v" :    on_click 57,movedown    : hide 57
button 58 : top 58,400 : left 58,390 : caption 58,"Reduce v" : on_click 58,reducedown : hide 58


open_dialog 20 : filter 20,"*.bmp|*.bmp"
save_dialog 21 : filter 21,"*.bmp|*.bmp"
alpha 31 : top 31,120 : left 31,230
alpha 32 : top 32,220 : left 32,600 : caption 32,"Tunes: 0"

w% = width(1)
h% = height(1)

end

build:
  caption 31,"Wait please..."
  display
  2d_target_is 2
  for y%=0 to h%
    for x%=0 to w%
      if (color_pixel_red(1,x%,y%)=0) and (color_pixel_green(1,x%,y%)=0) and (color_pixel_blue(1,x%,y%)=0)
        2d_pen_color 0,0,0
      else
        2d_pen_color 255,255,255
      end_if
      2d_point x%,y%
    next x%
    caption 31,"Wait please... "+str$(int(y%*100/200))+" %"
    display
  next y%
  2d_image_copy 41,0,0,200,200
  2d_target_is 3
  2d_image_paste 41,0,0
  2d_target_is 2
  show 50 : hide 51 : hide 52 : hide 53 : hide 54 : hide 55 : hide 56 : hide 57 : hide 58 : hide 59
  ntune% = 0
  caption 32,"Tunes: "+str$(ntune%)
  clear 42
  caption 31,""
  return
 
load:
  s$ = file_name$(20)
  if s$="_" then return
  if lower$(right$(s$,4))<>".bmp" then s$ = s$ + bmp
  if (instr(s$,"_mask.bmp")>0) or (instr(s$,"_tuned.bmp")>0)  or (instr(s$,"_list.txt")>0)
    message "Invalid image file name format"
    return
  end_if
  f$ = s$
  fm$ = left$(f$,len(f$)-4)+"_mask.bmp"
  ft$ = left$(fm$,len(fm$)-4)+"_tuned.bmp"
  fl$ = left$(fm$,len(fm$)-4)+"_tuned_list.txt"
  file_load 1,f$
  if file_exists(fm$)=1
    file_load 2,fm$
    if file_exists(ft$)=1
      file_load 3,ft$
      if file_exists(fl$)=1
        file_load 42,fl$
      else
        clear 42
      end_if
    else
      color 3,255,255,255
      clear 42
    end_if
  else
    color 2,255,255,255
    color 3,255,255,255
    clear 42
  end_if
  ntune% = count(42)
  caption 32,"Tunes: "+str$(ntune%)
  hide 50 : hide 51 : hide 52 : hide 53 : hide 54 : hide 55 : hide 56 : hide 57 : hide 58 : hide 59
  return
 
loadm:
  s$ = file_name$(20)
  if s$="_" then return
  if right$(s$,4)<>".bmp" then s$ = s$ + ".bmp"
  if right$(s$,9)<>"_mask.bmp"
    message "Invalid mask file name format"
    return
  end_if
  if file_exists(s$)=0
    message "Masl file not found"
    return
  end_if
  f$ = left$(s$,len(s$)-9) + ".bmp"
  fm$ = s$
  ft$ = left$(fm$,len(s$)-4)+"_tuned.bmp"
  fl$ = left$(fm$,len(s$)-4)+"_tuned_list.txt"
  file_load 2,fm$
  if file_exists(ft$)=1
    file_load 3,ft$
    if file_exists(fl$)=1
      file_load 42,fl$
      ntune% = count(42)
    else
      clear 42
      ntune% = 0
    end_if
  else
    2d_target_is 2
    2d_image_copy 41,0,0,200,200
    2d_target_is 3
    2d_image_paste 41,0,0
    ntune% = 0
    clear 42
  end_if
  caption 32,"Tunes: "+str$(ntune%)
  2d_target_is 2
  show 50 : hide 51 : hide 52 : hide 53 : hide 54 : hide 55 : hide 56 : hide 57 : hide 58 : hide 59
  return

savem:
  if file_exists(fm$)=1
    if message_confirmation_yes_no("File does already exist. Replace it ?")<>1 then return
  end_if
  file_save 2,fm$
  file_save 3,ft$
  file_save 42,fl$
  s$ =      "mask saved into: "+fm$+chr$(13)+chr$(10)
  s$ = s$ + "tuned mask saved into: "+ft$+chr$(13)+chr$(10)
  s$ = s$ + "tuned list saved into: "+fl$
  message s$
  return
 
savet:
  if file_exists(ft$)=1
    if message_confirmation_yes_no("File does already exist. Replace it ?")<>1 then return
  end_if
  file_save 3,ft$
  file_save 42,fl$
  s$ =      "tuned mask saved into: "+ft$+chr$(13)+chr$(10)
  s$ = s$ + "tuned list saved into: "+fl$
  message s$
  return

rect:
  2d_image_paste 41,0,0
  toprow%    =  50
  bottomrow%  = 150
  leftcol%    =  50
  rightcol%  = 150
  2d_pen_color 255,0,0
  2d_fill_off
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  show 51 : show 52 : show 53 : show 54 : show 55 : show 56 : show 57 : show 58 : show 59
  return

enlargeup:
  if toprow%=0 then return
  toprow% = toprow% - 1
  2d_image_paste 41,0,0
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  return
 
moveup:
  if toprow%=0 then return
  toprow% = toprow% - 1
  bottomrow% = bottomrow% - 1
  2d_image_paste 41,0,0
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  return

moveleft:
  if leftcol%=0 then return
  leftcol% = leftcol% - 1
  rightcol% = rightcol% - 1
  2d_image_paste 41,0,0
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  return

enlargeleft:
  if leftcol%=0 then return
  leftcol% = leftcol% - 1
  2d_image_paste 41,0,0
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  return

moveright:
  if rightcol%=w% then return
  rightcol% = rightcol% + 1
  leftcol% = leftcol% + 1
  2d_image_paste 41,0,0
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  return

reduceright:
  if rightcol%=leftcol% then return
  rightcol% = rightcol% - 1
  2d_image_paste 41,0,0
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  return

reducedown:
  if bottomrow%=toprow% then return
  bottomrow% = bottomrow% - 1
  2d_image_paste 41,0,0
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  return

movedown:
  if bottomrow%=H% then return
  bottomrow% = bottomrow% + 1
  toprow% = toprow% + 1
  2d_image_paste 41,0,0
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  return

tune:
  if ntune%>=63
    message "Too many tune sections"
    return
  end_if
  ntune% = ntune% + 1
  item_add 42,str$(ntune%)+","+str$(leftcol%)+","+str$(toprow%)+","+str$(rightcol%)+","+str$(bottomrow%)
  2d_target_is 3
  2d_fill_on
  2d_fill_color 255,255,ntune%*4
  2d_pen_color 255,255,ntune%*4
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  2d_target_is 2
  2d_pen_color 255,0,0
  2d_fill_off
  caption 32,"Tunes: "+str$(ntune%)
  return

Et, pour la démo, voici une image 200x200 pixels: Android.bmp


Voici le masque résultant: Android_mask.bmp


Voici le tune résultant: Android_mask_tuned.bmp


Et voici la liste des tunes générés: Android_mask_tuned_list.txt
Citation :
1,43,0,159,69
2,23,67,64,140
3,140,67,181,136
4,51,131,96,200
5,111,131,152,197

Installez tous ces fichiers dans un même dossier, chargez Android.bmp dans l'image de gauche, et admirez le résultat. Ou construisez vos propres masques, et éventuellement leurs tunes...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Jicehel

avatar

Nombre de messages : 5858
Age : 45
Localisation : 77500
Date d'inscription : 19/04/2011

MessageSujet: Re: Construire un masque pour les sprites   Lun 25 Mai 2015 - 11:50

C'est génial Klaus, je teste ça ce soir.

Pour la gestion avancée des sprites c'est carrément pratique. Une fois que j'aurais testé Klaus, tu m'autorises à en parler dans mon article volet 2 sur les collisions ? Ca va me simplifier les choses et avec un peu de chance, si tout le monde adopte le système, ca va standardiser la façon de faire.

Je pense que de mon côté, je ferais une banque de sprites avec les infos.

Ca va peut être relancer l'usage des sprites et des jeux à base de sprites. Je pense à un des premiers jeux que j'avais repris de type Galaxian. j'essaierais bien de le refaire avec la gestion de colision que tu viens de mettre en place et les procédures qui n'existaient pas à l'époque. Je pense que le listing pourra être beaucoup plus clair et j'espère aussi pouvoir un peu optimiser le jeu car à l'époque c'était quand même assez lent et la vitesse variée en fonction du nombre de sprites qui restaient. Mais c'était un de mes premiers essais après un jeux de tir entre un Xwing et des Tie fighters.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

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

MessageSujet: Re: Construire un masque pour les sprites   Lun 25 Mai 2015 - 11:58

Mais bien sûr, Jicehel ! Ca me fera plaisir ! Comme tu le sais bien, absolument tous mes sources sont libres pour tous et pour tous les usages? Plus il y a d'utilisateurs, même sous forme de modification, extrait, clône ou autre dérivé, plus je serai content. Alors, n'hésite pas !
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Jicehel

avatar

Nombre de messages : 5858
Age : 45
Localisation : 77500
Date d'inscription : 19/04/2011

MessageSujet: Re: Construire un masque pour les sprites   Lun 25 Mai 2015 - 12:01

Merci Klaus. Je me doutais de ta réponse, mais par principe, je préfère demander confirmation.
J'inclurais tes procédures de gestion des sprites quand tu les auras mises à jour de manière à pousser un peu cette méthode de gestion.
J'essayerais de faire quelques sprties et de les mettre dans une banque avec les infos de sorte que l'on puisse facilement piocher dedans pour fabriquer des jeux sans avoir besoin de refaire les masques ou les fichiers d'informations (au début, il n'y en aura pas bcp, mais ça devrait grossir avec le temps).


Dernière édition par Jicehel le Mer 27 Mai 2015 - 12:01, édité 1 fois
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

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

MessageSujet: Re: Construire un masque pour les sprites   Mer 27 Mai 2015 - 11:57

Voici une nouvelle version du programme de construction de masque et de tunes. On peut maintenant saisir un nom pour chaque tune, avant de le valider par le bouton "Tune". Il sera mémorisé dans le fichier xxx_mask_tuned_list.txt, sous forme d'un paramètre supplémentaire. Mon programme de détection l'utilise pour afficher le nom du tune touché - c'est plus parlant qu'un simple numéro. Si un tune sans nom est touché, son nom par défaut est "Tune x" avec x étant le numéro du tune.

Voici le code:
Code:
' build_sprite_mask.bas

label build, load, loadm, savem, savet, rect, tune
label enlargeup, moveup, moveleft, enlargeleft, moveright, reduceright, movedown, reducedown

dim s$, f$, fm$, ft$, fl$, w%, h%, x%, y%, toprow%, bottomrow%, leftcol%, rightcol%, ntune%

width 0,1000 : height 0,600

picture 1 : top 1,10 : left 1, 10 : width 1,200 : height 1,200
picture 2 : top 2,10 : left 2,350 : width 2,200 : height 2,200
picture 3 : top 3,10 : left 3,560 : width 3,200 : height 3,200

image 41
dlist 42

button 10 : top 10,90 : left 10,240 : caption 10,"Build mask" : on_click 10,build
button 11 : top 11,220 : left 11,50 : caption 11,"Load image" : on_click 11,load
button 12 : top 12,220 : left 12,390 : caption 12,"Load mask" : on_click 12,loadm
button 13 : top 13,250 : left 13,390 : caption 13,"Save mask" : on_click 13,savem
button 15 : top 15,250 : left 15,600 : caption 15,"Save tune" : on_click 15,savet



button 52 : top 52,310 : left 52,390 : caption 52,"Move ^" :    on_click 52,moveup    : hide 52
button 51 : top 51,340 : left 51,390 : caption 51,"Enlarge ^" : on_click 51,enlargeup : hide 51
button 50 : top 50,370 : left 50,370 : caption 50,"Rectangle" : on_click 50,rect      : hide 50 : width 50,60
button 59 : top 59,370 : left 59,430 : caption 59,"Tune"      : on_click 59,tune      : hide 59 : width 59,60
button 54 : top 54,370 : left 54,290 : caption 54,"Enlarge <" : on_click 54,enlargeleft : hide 54
button 53 : top 53,370 : left 53,210 : caption 53,"Move <" :    on_click 53,moveleft    : hide 53
button 55 : top 55,370 : left 55,500 : caption 55,"Reduce >" : on_click 55,reduceright : hide 55
button 56 : top 56,370 : left 56,580 : caption 56,"Move >" :    on_click 56,moveright    : hide 56
button 57 : top 57,430 : left 57,390 : caption 57,"Move v" :    on_click 57,movedown    : hide 57
button 58 : top 58,400 : left 58,390 : caption 58,"Reduce v" : on_click 58,reducedown : hide 58


open_dialog 20 : filter 20,"*.bmp|*.bmp"
save_dialog 21 : filter 21,"*.bmp|*.bmp"
alpha 31 : top 31,120 : left 31,230
alpha 32 : top 32,220 : left 32,600 : caption 32,"Tunes: 0"
alpha 33 : top 33,430 : left 33,550 : caption 33,"Tune name:" : hide 33
edit  34 : top 34,430 : left 34,620 : width 34,150 : hide 34

w% = width(1)
h% = height(1)

end

build:
  caption 31,"Wait please..."
  display
  2d_target_is 2
  for y%=0 to h%
    for x%=0 to w%
      if (color_pixel_red(1,x%,y%)=0) and (color_pixel_green(1,x%,y%)=0) and (color_pixel_blue(1,x%,y%)=0)
        2d_pen_color 0,0,0
      else
        2d_pen_color 255,255,255
      end_if
      2d_point x%,y%
    next x%
    caption 31,"Wait please... "+str$(int(y%*100/200))+" %"
    display
  next y%
  2d_image_copy 41,0,0,200,200
  2d_target_is 3
  2d_image_paste 41,0,0
  2d_target_is 2
  show 50 : hide 51 : hide 52 : hide 53 : hide 54 : hide 55 : hide 56 : hide 57 : hide 58 : hide 59
  hide 33 : hide 34
  ntune% = 0
  caption 32,"Tunes: "+str$(ntune%)
  clear 42
  caption 31,""
  return
 
load:
  s$ = file_name$(20)
  if s$="_" then return
  if lower$(right$(s$,4))<>".bmp" then s$ = s$ + bmp
  if (instr(s$,"_mask.bmp")>0) or (instr(s$,"_tuned.bmp")>0)  or (instr(s$,"_list.txt")>0)
    message "Invalid image file name format"
    return
  end_if
  f$ = s$
  fm$ = left$(f$,len(f$)-4)+"_mask.bmp"
  ft$ = left$(fm$,len(fm$)-4)+"_tuned.bmp"
  fl$ = left$(fm$,len(fm$)-4)+"_tuned_list.txt"
  file_load 1,f$
  if file_exists(fm$)=1
    file_load 2,fm$
    if file_exists(ft$)=1
      file_load 3,ft$
      if file_exists(fl$)=1
        file_load 42,fl$
      else
        clear 42
      end_if
    else
      color 3,255,255,255
      clear 42
    end_if
    show 50
  else
    color 2,255,255,255
    color 3,255,255,255
    clear 42
    hide 50
  end_if
  ntune% = count(42)
  caption 32,"Tunes: "+str$(ntune%)
  hide 51 : hide 52 : hide 53 : hide 54 : hide 55 : hide 56 : hide 57 : hide 58 : hide 59
  hide 33 : hide 34
  return
 
loadm:
  s$ = file_name$(20)
  if s$="_" then return
  if right$(s$,4)<>".bmp" then s$ = s$ + ".bmp"
  if right$(s$,9)<>"_mask.bmp"
    message "Invalid mask file name format"
    return
  end_if
  if file_exists(s$)=0
    message "Masl file not found"
    return
  end_if
  f$ = left$(s$,len(s$)-9) + ".bmp"
  fm$ = s$
  ft$ = left$(fm$,len(s$)-4)+"_tuned.bmp"
  fl$ = left$(fm$,len(s$)-4)+"_tuned_list.txt"
  file_load 2,fm$
  if file_exists(ft$)=1
    file_load 3,ft$
    if file_exists(fl$)=1
      file_load 42,fl$
      ntune% = count(42)
    else
      clear 42
      ntune% = 0
    end_if
  else
    2d_target_is 2
    2d_image_copy 41,0,0,200,200
    2d_target_is 3
    2d_image_paste 41,0,0
    ntune% = 0
    clear 42
  end_if
  caption 32,"Tunes: "+str$(ntune%)
  2d_target_is 2
  show 50 : hide 51 : hide 52 : hide 53 : hide 54 : hide 55 : hide 56 : hide 57 : hide 58 : hide 59
  hide 33 : hide 34
  return

savem:
  if file_exists(fm$)=1
    if message_confirmation_yes_no("File does already exist. Replace it ?")<>1 then return
  end_if
  file_save 2,fm$
  file_save 3,ft$
  file_save 42,fl$
  s$ =      "mask saved into: "+fm$+chr$(13)+chr$(10)
  s$ = s$ + "tuned mask saved into: "+ft$+chr$(13)+chr$(10)
  s$ = s$ + "tuned list saved into: "+fl$
  message s$
  return
 
savet:
  if file_exists(ft$)=1
    if message_confirmation_yes_no("File does already exist. Replace it ?")<>1 then return
  end_if
  file_save 3,ft$
  file_save 42,fl$
  s$ =      "tuned mask saved into: "+ft$+chr$(13)+chr$(10)
  s$ = s$ + "tuned list saved into: "+fl$
  message s$
  return

rect:
  2d_image_paste 41,0,0
  toprow%    =  50
  bottomrow%  = 150
  leftcol%    =  50
  rightcol%  = 150
  2d_pen_color 255,0,0
  2d_fill_off
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  show 51 : show 52 : show 53 : show 54 : show 55 : show 56 : show 57 : show 58 : show 59
  show 33 : show 34
  return

enlargeup:
  if toprow%=0 then return
  toprow% = toprow% - 1
  2d_image_paste 41,0,0
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  return
 
moveup:
  if toprow%=0 then return
  toprow% = toprow% - 1
  bottomrow% = bottomrow% - 1
  2d_image_paste 41,0,0
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  return

moveleft:
  if leftcol%=0 then return
  leftcol% = leftcol% - 1
  rightcol% = rightcol% - 1
  2d_image_paste 41,0,0
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  return

enlargeleft:
  if leftcol%=0 then return
  leftcol% = leftcol% - 1
  2d_image_paste 41,0,0
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  return

moveright:
  if rightcol%=w% then return
  rightcol% = rightcol% + 1
  leftcol% = leftcol% + 1
  2d_image_paste 41,0,0
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  return

reduceright:
  if rightcol%=leftcol% then return
  rightcol% = rightcol% - 1
  2d_image_paste 41,0,0
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  return

reducedown:
  if bottomrow%=toprow% then return
  bottomrow% = bottomrow% - 1
  2d_image_paste 41,0,0
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  return

movedown:
  if bottomrow%=H% then return
  bottomrow% = bottomrow% + 1
  toprow% = toprow% + 1
  2d_image_paste 41,0,0
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  return

tune:
  if ntune%>=63
    message "Too many tune sections"
    return
  end_if
  ntune% = ntune% + 1
  s$ = trim$(text$(34))
  if s$="" then s$ = "Tune "+str$(ntune%)
  item_add 42,str$(ntune%)+","+str$(leftcol%)+","+str$(toprow%)+","+str$(rightcol%)+","+str$(bottomrow%)+","+s$
  2d_target_is 3
  2d_fill_on
  2d_fill_color 255,255,ntune%*4
  2d_pen_color 255,255,ntune%*4
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  2d_target_is 2
  2d_pen_color 255,0,0
  2d_fill_off
  caption 32,"Tunes: "+str$(ntune%)
  return

Et voici le résultat pour mon sprite Android:
Citation :
1,43,0,159,69,Tête
2,23,67,64,140,Bras droit
3,140,67,181,136,Bras gauche
4,51,131,96,200,Jambe droite
5,111,131,152,197,Jambe gauche
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Jicehel

avatar

Nombre de messages : 5858
Age : 45
Localisation : 77500
Date d'inscription : 19/04/2011

MessageSujet: Re: Construire un masque pour les sprites   Mer 27 Mai 2015 - 12:03

Oui, c'est clair que c'est plus facile pour s'y retrouver, surtout si on se fait une banque de sprite.
Il est plus facile de savoir à quelle zone correspond le bras droit si on recupère le fichier texte que d'analyser les coordonnées Wink
Très bonne idée (comme d'habitude Wink )
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Jean Claude

avatar

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

MessageSujet: Re: Construire un masque pour les sprites   Ven 12 Juin 2015 - 9:35

@Klaus,

Je suis à la découverte de ce programme, car il est nécessaire pour utiliser pleinement les procédures que tu as faites dans le sujet "sprite_show et .....".

J'ai 2 pécisions à te demander (sur ta présentation en début de ce post):

Citation :
((255,255,t) ) zone de contact différenciée, le numéro du tube est t/4
A quoi sert cette méthode  Question

Citation :
Les boutons "Save mask" et "Save tune" font ce qu'ils disent, sachant que "Save mask" sauvegarde également les tunes et la liste, et "Save tune" sauvegarde également la liste.
Je ne saisi pas la différence entre les 2, la phrase n'est pas claire.  Question

A+
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

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

MessageSujet: Re: Construire un masque pour les sprites   Ven 12 Juin 2015 - 10:25

Citation :
(255,255,t) ) zone de contact différenciée, le numéro du tube est t/4
C'est la couleur RGB que j'affecte aux pixels faisant partie d'une zone de contact. D'ailleurs, ce devrait être "tune" au lieu de "tube" - faute de frappe. Je gère jusqu'à 63 zones de contact par sprite. Avec x étant le numéro du tune (zone de contact), je donne la couleur (255,255,x*4). On simple test sur pixel_color_blue peut donner ainsi le numéro du tune. Ceci est appliqué au masque, bien sûr, pas sur l'image d'origine !

Citation :
Les boutons "Save mask" et "Save tune" font ce qu'ils disent, sachant que "Save mask" sauvegarde également les tunes et la liste, et "Save tune" sauvegarde également la liste.
Il y a 3 éléments: le masque qui est une bitmap, les tunes et un fichier texte contenant la définition des tunes. Le bouton "Save mask" sauvgarde le tout. Le bouton "Save tune" ne sauvegarde que les tunes et le fichier de définition, mais pas le masque.

Pour mes procédures, seuls l'image d'origine et le fichier de définition sont utilisés. Le masque est généré pour ce que voulait faire Jicehel.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Jean Claude

avatar

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

MessageSujet: Re: Construire un masque pour les sprites   Ven 12 Juin 2015 - 11:11

Merci Klaus pour ta réponse, c'est plus clair dans ma tête...

Vu la réponse qu'a fait Jack, sur le post "sprites animés....", j'ai comme l'impression que toutes les SUB(s) que tu as faites, ne sont pas prêtes de partir à la poubelle. Elle serviront pour la 2D en Panoramic.

A+
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

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

MessageSujet: Re: Construire un masque pour les sprites   Ven 12 Juin 2015 - 11:26

Oui, j'ai l'impression.

Mes subs sont fonctionnelles. Mais à l'évidence, ce n'est pas un foudre de guerre s'il y a beaucoup de sprites et tunes. Et c'est normal - à chaque pixel de déplacement d'un sprite, il faut tester l'ensemble des autres sprites, avec éventuellement leurs zones de contact.

Je vais poursuivre deux pistes:
1. trouver des méthodes d'optimisation algorithmique pour améliorer les performances en Panoramic pur
2. faire des fonctions DLL pour la détection, aussi bien intégrées dans KGF.dll que dans une DLL séparée

Ainsi, j'espère venir à bout des ralentissements que les calculs de détection entraînent.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Jicehel

avatar

Nombre de messages : 5858
Age : 45
Localisation : 77500
Date d'inscription : 19/04/2011

MessageSujet: Re: Construire un masque pour les sprites   Ven 12 Juin 2015 - 12:16

L'usage le plus approprié pour les masques de couleur ce sont les jeux de type point and click.
Vous vous souvenez des jeux type "Day of the tentacule" ou "Sam et Max", "Maniac Mansion", "Indiana Jones", "Monkey Island", "Diskworld". Maintenant sur internet il y a beaucoup de jeux type inspection d'une scène où l'on doit retrouver rapidement des objets, c'est pareil, c'est du point and clic et tout a fait adapté à l'utilisation des masques.

Si l'utilisateur clique sur un élément actif quelque soit sa forme, avec les masques, c'est très simple à détecter. Sur le masque, on a jusqu'à 64 formes quand l'utilisateur clique sur l'image, on teste sur le masque à l'endroit ou il a cliqué sur l'image et on voit s'il a cliqué sur un objet actif ou non.
Mais je ferais l'article. Pour le moment, je fais d'autres choses le soir et j'avais une petite flemme d'écriture, mais je vais le faire avec un exemple utilisant les programmes de Klaus.
Ce soir je suis tranquille et demain aussi, je devrais avancer et ça devrait aller vite avec les programmes de Klaus qui sont déjà fait... Par contre je ne vais pas bâcler car les programmes et l'utilisation mérites un bon article. Qui sait, j'aurais peut être à utiliser la technique du double buffer aussi ...On verra bien
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

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

MessageSujet: Re: Construire un masque pour les sprites   Ven 12 Juin 2015 - 16:22

Voici une version de l'outil de génération de masques et de tunes, permettant de paramétrer les dimensions largeur et hauteur, dans les limites de [10,200] pixels. Plus grand n'a pas de sens car on dépasse les limites d'un sprite. Le sprite peut être rectangulaire.

Code:
' build_sprite_mask.bas

label build, load, loadm, savem, savet, rect, tune, close100
label enlargeup, moveup, moveleft, enlargeleft, moveright, reduceright, movedown, reducedown

dim s$, f$, fm$, ft$, fl$, w%, h%, x%, y%, toprow%, bottomrow%, leftcol%, rightcol%, ntune%
dim img_w%, img_h%

hide 0
form 100 : caption 100,"Taille du sprite" : on_close 100,close100
alpha 101 : parent 101,100 : top 101,20 : left 101,20 : caption 101,"Largeur:"
spin 102 : parent 102,100 : top 102,20 : left 102,100 : width 102,60
  min 102,10 : max 102,200 : position 102,200
alpha 103 : parent 103,100 : top 103,50 : left 103,20 : caption 103,"Hauteur:"
spin 104 : parent 104,100 : top 104,50 : left 104,100 : width 104,60
  min 104,10 : max 104,200 : position 104,200
button 105 : parent 105,100 : top 105,80 : left 105,100 : caption 105,"Valider"
  on_click 105,close100

width 0,1000 : height 0,600

picture 1 : top 1,10 : left 1, 10 : width 1,200 : height 1,200
picture 2 : top 2,10 : left 2,350 : width 2,200 : height 2,200
picture 3 : top 3,10 : left 3,560 : width 3,200 : height 3,200

image 41
dlist 42

button 10 : top 10,90 : left 10,240 : caption 10,"Build mask" : on_click 10,build
button 11 : top 11,220 : left 11,50 : caption 11,"Load image" : on_click 11,load
button 12 : top 12,220 : left 12,390 : caption 12,"Load mask" : on_click 12,loadm
button 13 : top 13,250 : left 13,390 : caption 13,"Save mask" : on_click 13,savem
button 15 : top 15,250 : left 15,600 : caption 15,"Save tune" : on_click 15,savet



button 52 : top 52,310 : left 52,390 : caption 52,"Move ^" :    on_click 52,moveup    : hide 52
button 51 : top 51,340 : left 51,390 : caption 51,"Enlarge ^" : on_click 51,enlargeup : hide 51
button 50 : top 50,370 : left 50,370 : caption 50,"Rectangle" : on_click 50,rect      : hide 50 : width 50,60
button 59 : top 59,370 : left 59,430 : caption 59,"Tune"      : on_click 59,tune      : hide 59 : width 59,60
button 54 : top 54,370 : left 54,290 : caption 54,"Enlarge <" : on_click 54,enlargeleft : hide 54
button 53 : top 53,370 : left 53,210 : caption 53,"Move <" :    on_click 53,moveleft    : hide 53
button 55 : top 55,370 : left 55,500 : caption 55,"Reduce >" : on_click 55,reduceright : hide 55
button 56 : top 56,370 : left 56,580 : caption 56,"Move >" :    on_click 56,moveright    : hide 56
button 57 : top 57,430 : left 57,390 : caption 57,"Move v" :    on_click 57,movedown    : hide 57
button 58 : top 58,400 : left 58,390 : caption 58,"Reduce v" : on_click 58,reducedown : hide 58


open_dialog 20 : filter 20,"*.bmp|*.bmp"
save_dialog 21 : filter 21,"*.bmp|*.bmp"
alpha 31 : top 31,120 : left 31,230
alpha 32 : top 32,220 : left 32,600 : caption 32,"Tunes: 0"
alpha 33 : top 33,430 : left 33,550 : caption 33,"Tune name:" : hide 33
edit  34 : top 34,430 : left 34,620 : width 34,150 : hide 34

w% = width(1)
h% = height(1)

end

close100:
  img_w% = val(text$(102))
  img_h% = val(text$(104))
  width 1,img_w% : height 1,img_h%
  width 2,img_w% : height 2,img_h%
  width 3,img_w% : height 3,img_h%
  w% = width(1)
  h% = height(1)
  hide 100
  show 0
  return

build:
  caption 31,"Wait please..."
  display
  2d_target_is 2
  for y%=0 to h%
    for x%=0 to w%
      if (color_pixel_red(1,x%,y%)=0) and (color_pixel_green(1,x%,y%)=0) and (color_pixel_blue(1,x%,y%)=0)
        2d_pen_color 0,0,0
      else
        2d_pen_color 255,255,255
      end_if
      2d_point x%,y%
    next x%
    caption 31,"Wait please... "+str$(int(y%*100/img_h%))+" %"
    display
  next y%
  2d_image_copy 41,0,0,img_w%,img_h%
  2d_target_is 3
  2d_image_paste 41,0,0
  2d_target_is 2
  show 50 : hide 51 : hide 52 : hide 53 : hide 54 : hide 55 : hide 56 : hide 57 : hide 58 : hide 59
  hide 33 : hide 34
  ntune% = 0
  caption 32,"Tunes: "+str$(ntune%)
  clear 42
  caption 31,""
  return
 
load:
  s$ = file_name$(20)
  if s$="_" then return
  if lower$(right$(s$,4))<>".bmp" then s$ = s$ + bmp
  if (instr(s$,"_mask.bmp")>0) or (instr(s$,"_tuned.bmp")>0)  or (instr(s$,"_list.txt")>0)
    message "Invalid image file name format"
    return
  end_if
  f$ = s$
  fm$ = left$(f$,len(f$)-4)+"_mask.bmp"
  ft$ = left$(fm$,len(fm$)-4)+"_tuned.bmp"
  fl$ = left$(fm$,len(fm$)-4)+"_tuned_list.txt"
  file_load 1,f$
  if file_exists(fm$)=1
    file_load 2,fm$
    if file_exists(ft$)=1
      file_load 3,ft$
      if file_exists(fl$)=1
        file_load 42,fl$
      else
        clear 42
      end_if
    else
      color 3,255,255,255
      clear 42
    end_if
    show 50
  else
    color 2,255,255,255
    color 3,255,255,255
    clear 42
    hide 50
  end_if
  ntune% = count(42)
  caption 32,"Tunes: "+str$(ntune%)
  hide 51 : hide 52 : hide 53 : hide 54 : hide 55 : hide 56 : hide 57 : hide 58 : hide 59
  hide 33 : hide 34
  return
 
loadm:
  s$ = file_name$(20)
  if s$="_" then return
  if right$(s$,4)<>".bmp" then s$ = s$ + ".bmp"
  if right$(s$,9)<>"_mask.bmp"
    message "Invalid mask file name format"
    return
  end_if
  if file_exists(s$)=0
    message "Masl file not found"
    return
  end_if
  f$ = left$(s$,len(s$)-9) + ".bmp"
  fm$ = s$
  ft$ = left$(fm$,len(s$)-4)+"_tuned.bmp"
  fl$ = left$(fm$,len(s$)-4)+"_tuned_list.txt"
  file_load 2,fm$
  if file_exists(ft$)=1
    file_load 3,ft$
    if file_exists(fl$)=1
      file_load 42,fl$
      ntune% = count(42)
    else
      clear 42
      ntune% = 0
    end_if
  else
    2d_target_is 2
    2d_image_copy 41,0,0,img_w%,img_h%
    2d_target_is 3
    2d_image_paste 41,0,0
    ntune% = 0
    clear 42
  end_if
  caption 32,"Tunes: "+str$(ntune%)
  2d_target_is 2
  show 50 : hide 51 : hide 52 : hide 53 : hide 54 : hide 55 : hide 56 : hide 57 : hide 58 : hide 59
  hide 33 : hide 34
  return

savem:
  if file_exists(fm$)=1
    if message_confirmation_yes_no("File does already exist. Replace it ?")<>1 then return
  end_if
  file_save 2,fm$
  file_save 3,ft$
  file_save 42,fl$
  s$ =      "mask saved into: "+fm$+chr$(13)+chr$(10)
  s$ = s$ + "tuned mask saved into: "+ft$+chr$(13)+chr$(10)
  s$ = s$ + "tuned list saved into: "+fl$
  message s$
  return
 
savet:
  if file_exists(ft$)=1
    if message_confirmation_yes_no("File does already exist. Replace it ?")<>1 then return
  end_if
  file_save 3,ft$
  file_save 42,fl$
  s$ =      "tuned mask saved into: "+ft$+chr$(13)+chr$(10)
  s$ = s$ + "tuned list saved into: "+fl$
  message s$
  return

rect:
  2d_image_paste 41,0,0
  toprow%    =  50
  bottomrow%  = 150
  leftcol%    =  50
  rightcol%  = 150
  2d_pen_color 255,0,0
  2d_fill_off
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  show 51 : show 52 : show 53 : show 54 : show 55 : show 56 : show 57 : show 58 : show 59
  show 33 : show 34
  return

enlargeup:
  if toprow%=0 then return
  toprow% = toprow% - 1
  2d_image_paste 41,0,0
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  return
 
moveup:
  if toprow%=0 then return
  toprow% = toprow% - 1
  bottomrow% = bottomrow% - 1
  2d_image_paste 41,0,0
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  return

moveleft:
  if leftcol%=0 then return
  leftcol% = leftcol% - 1
  rightcol% = rightcol% - 1
  2d_image_paste 41,0,0
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  return

enlargeleft:
  if leftcol%=0 then return
  leftcol% = leftcol% - 1
  2d_image_paste 41,0,0
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  return

moveright:
  if rightcol%=w% then return
  rightcol% = rightcol% + 1
  leftcol% = leftcol% + 1
  2d_image_paste 41,0,0
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  return

reduceright:
  if rightcol%=leftcol% then return
  rightcol% = rightcol% - 1
  2d_image_paste 41,0,0
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  return

reducedown:
  if bottomrow%=toprow% then return
  bottomrow% = bottomrow% - 1
  2d_image_paste 41,0,0
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  return

movedown:
  if bottomrow%=H% then return
  bottomrow% = bottomrow% + 1
  toprow% = toprow% + 1
  2d_image_paste 41,0,0
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  return

tune:
  if ntune%>=63
    message "Too many tune sections"
    return
  end_if
  ntune% = ntune% + 1
  s$ = trim$(text$(34))
  if s$="" then s$ = "Tune "+str$(ntune%)
  item_add 42,str$(ntune%)+","+str$(leftcol%)+","+str$(toprow%)+","+str$(rightcol%)+","+str$(bottomrow%)+","+s$
  2d_target_is 3
  2d_fill_on
  2d_fill_color 255,255,ntune%*4
  2d_pen_color 255,255,ntune%*4
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  2d_target_is 2
  2d_pen_color 255,0,0
  2d_fill_off
  caption 32,"Tunes: "+str$(ntune%)
  return
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Jicehel

avatar

Nombre de messages : 5858
Age : 45
Localisation : 77500
Date d'inscription : 19/04/2011

MessageSujet: Re: Construire un masque pour les sprites   Ven 12 Juin 2015 - 18:28

PS: Pour les exemple que je citais de point en clic, il faut juste adapter ta procédure créée pour les sprite pour franchir la limite des sprites car dans ce cas, il est souvent plus interessant de travailler sur un picture que sur un sprite. Le masque s'appliquerait le plus souvent sur le fond du scene_2d que sur les sprites qui bougent devant.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

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

MessageSujet: Re: Construire un masque pour les sprites   Ven 12 Juin 2015 - 18:58

Je vois ce que tu veux dire, Jicehel. Il faut que je fasse alors une version spéciale "plein écran" pour des images de grande taille, pour lesquelles on construit un masque. C'est bien ça ?
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   Ven 12 Juin 2015 - 19:30

Je suis un peu géné de te répondre, car je ne sais pas si je me plante ou pas.
Klaus a écrit:
Voici une version de l'outil de génération de masques et de tunes, permettant de paramétrer les dimensions largeur et hauteur, dans les limites de [10,200] pixels. Plus grand n'a pas de sens car on dépasse les limites d'un sprite. Le sprite peut être rectangulaire.

C'est curieux, mais je pensais aussi la même chose, mais cela fait un deux programmes que j'ai fait, et pour moi, la limite de 200  X 200 pixels n'est plus valable, et il me semble que Jack avait dit que la limite avait été levé, (il y a un bon moment).

Je cherche partout un programme sur mon ordi, et finalement j'ai été sur mon site, car je ne le retrouve pas.

Avec l'I.D.E. simplifié' je déplace des sprites comme un form qui ont des dimensions importantes.
Je ne veux pas t'inciter à y aller, je ne sais pas, mais il me semble que maintenant il n'y a plus cette limite.
Revenir en haut Aller en bas
Klaus

avatar

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

MessageSujet: Re: Construire un masque pour les sprites   Ven 12 Juin 2015 - 19:43

C'est une information intéressante, Cosmos70. J'ai dû rater cela. Je vais vérifier cette affaire et ajuster mes codes en fonction du résultat. Merci !
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Jicehel

avatar

Nombre de messages : 5858
Age : 45
Localisation : 77500
Date d'inscription : 19/04/2011

MessageSujet: Re: Construire un masque pour les sprites   Ven 12 Juin 2015 - 22:34

@Cosmos70: Merci pour ta vigileance. Comme quoi même dans les sujets où nous pensons ne pas avoir beaucoup intervenir, on peut apporter des précisions ou des informations.

@Klaus c'est exactement ça. En fait il faut bien apprendre à utiliser la meilleure méthode et bidouiller comme direr certains pour optimiser notre programmation au niveau de la lisibilité, de la performance et de lafacilité de développement
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Jicehel

avatar

Nombre de messages : 5858
Age : 45
Localisation : 77500
Date d'inscription : 19/04/2011

MessageSujet: Re: Construire un masque pour les sprites   Dim 14 Juin 2015 - 1:26

J'ai plusieurs petites remarques sur le programme:
1 - j'ai l'impression que si l'on dit que le sprite fait 62 pixels, le programme prends de 0 à 62 pixels soit 63 pixels ( à vérifier)

2 - le rectangle par défaut ne tient pas compte de la taille du sprite, ce qui fait que si le sprite est petit, on ne voit pas le rectangle au début quand on le créé.
Il faudrait modifier le coin en bas à droite en fonction de la taille et modifier le coin superieur gauche aussi

3 - le rectangle est visible sur l'image: en _mask et non sur celle en _mask_tuned. Ca me semble être une erreur

Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

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

MessageSujet: Re: Construire un masque pour les sprites   Dim 14 Juin 2015 - 1:46

(1) et (2):
Code:
' build_sprite_mask.bas

label build, load, loadm, savem, savet, rect, tune, close100
label enlargeup, moveup, moveleft, enlargeleft, moveright, reduceright, movedown, reducedown

dim s$, f$, fm$, ft$, fl$, w%, h%, x%, y%, toprow%, bottomrow%, leftcol%, rightcol%, ntune%
dim img_w%, img_h%

hide 0
form 100 : caption 100,"Taille du sprite" : on_close 100,close100
alpha 101 : parent 101,100 : top 101,20 : left 101,20 : caption 101,"Largeur:"
spin 102 : parent 102,100 : top 102,20 : left 102,100 : width 102,60
  min 102,10 : max 102,200 : position 102,200
alpha 103 : parent 103,100 : top 103,50 : left 103,20 : caption 103,"Hauteur:"
spin 104 : parent 104,100 : top 104,50 : left 104,100 : width 104,60
  min 104,10 : max 104,200 : position 104,200
button 105 : parent 105,100 : top 105,80 : left 105,100 : caption 105,"Valider"
  on_click 105,close100

width 0,1000 : height 0,600

picture 1 : top 1,10 : left 1, 10 : width 1,200 : height 1,200
picture 2 : top 2,10 : left 2,350 : width 2,200 : height 2,200
picture 3 : top 3,10 : left 3,560 : width 3,200 : height 3,200

image 41
dlist 42

button 10 : top 10,90 : left 10,240 : caption 10,"Build mask" : on_click 10,build
button 11 : top 11,220 : left 11,50 : caption 11,"Load image" : on_click 11,load
button 12 : top 12,220 : left 12,390 : caption 12,"Load mask" : on_click 12,loadm
button 13 : top 13,250 : left 13,390 : caption 13,"Save mask" : on_click 13,savem
button 15 : top 15,250 : left 15,600 : caption 15,"Save tune" : on_click 15,savet



button 52 : top 52,310 : left 52,390 : caption 52,"Move ^" :    on_click 52,moveup    : hide 52
button 51 : top 51,340 : left 51,390 : caption 51,"Enlarge ^" : on_click 51,enlargeup : hide 51
button 50 : top 50,370 : left 50,370 : caption 50,"Rectangle" : on_click 50,rect      : hide 50 : width 50,60
button 59 : top 59,370 : left 59,430 : caption 59,"Tune"      : on_click 59,tune      : hide 59 : width 59,60
button 54 : top 54,370 : left 54,290 : caption 54,"Enlarge <" : on_click 54,enlargeleft : hide 54
button 53 : top 53,370 : left 53,210 : caption 53,"Move <" :    on_click 53,moveleft    : hide 53
button 55 : top 55,370 : left 55,500 : caption 55,"Reduce >" : on_click 55,reduceright : hide 55
button 56 : top 56,370 : left 56,580 : caption 56,"Move >" :    on_click 56,moveright    : hide 56
button 57 : top 57,430 : left 57,390 : caption 57,"Move v" :    on_click 57,movedown    : hide 57
button 58 : top 58,400 : left 58,390 : caption 58,"Reduce v" : on_click 58,reducedown : hide 58


open_dialog 20 : filter 20,"*.bmp|*.bmp"
save_dialog 21 : filter 21,"*.bmp|*.bmp"
alpha 31 : top 31,120 : left 31,230
alpha 32 : top 32,220 : left 32,600 : caption 32,"Tunes: 0"
alpha 33 : top 33,430 : left 33,550 : caption 33,"Tune name:" : hide 33
edit  34 : top 34,430 : left 34,620 : width 34,150 : hide 34

w% = width(1)
h% = height(1)

end

close100:
  img_w% = val(text$(102))
  img_h% = val(text$(104))
  width 1,img_w% : height 1,img_h%
  width 2,img_w% : height 2,img_h%
  width 3,img_w% : height 3,img_h%
  w% = width(1)
  h% = height(1)
  hide 100
  show 0
  return

build:
  caption 31,"Wait please..."
  display
  2d_target_is 2
  for y%=0 to h%-1
    for x%=0 to w%-1
      if (color_pixel_red(1,x%,y%)=0) and (color_pixel_green(1,x%,y%)=0) and (color_pixel_blue(1,x%,y%)=0)
        2d_pen_color 0,0,0
      else
        2d_pen_color 255,255,255
      end_if
      2d_point x%,y%
    next x%
    caption 31,"Wait please... "+str$(int(y%*100/img_h%))+" %"
    display
  next y%
  2d_image_copy 41,0,0,img_w%-1,img_h%-1
  2d_target_is 3
  2d_image_paste 41,0,0
  2d_target_is 2
  show 50 : hide 51 : hide 52 : hide 53 : hide 54 : hide 55 : hide 56 : hide 57 : hide 58 : hide 59
  hide 33 : hide 34
  ntune% = 0
  caption 32,"Tunes: "+str$(ntune%)
  clear 42
  caption 31,""
  return
 
load:
  s$ = file_name$(20)
  if s$="_" then return
  if lower$(right$(s$,4))<>".bmp" then s$ = s$ + bmp
  if (instr(s$,"_mask.bmp")>0) or (instr(s$,"_tuned.bmp")>0)  or (instr(s$,"_list.txt")>0)
    message "Invalid image file name format"
    return
  end_if
  f$ = s$
  fm$ = left$(f$,len(f$)-4)+"_mask.bmp"
  ft$ = left$(fm$,len(fm$)-4)+"_tuned.bmp"
  fl$ = left$(fm$,len(fm$)-4)+"_tuned_list.txt"
  file_load 1,f$
  if file_exists(fm$)=1
    file_load 2,fm$
    if file_exists(ft$)=1
      file_load 3,ft$
      if file_exists(fl$)=1
        file_load 42,fl$
      else
        clear 42
      end_if
    else
      color 3,255,255,255
      clear 42
    end_if
    show 50
  else
    color 2,255,255,255
    color 3,255,255,255
    clear 42
    hide 50
  end_if
  ntune% = count(42)
  caption 32,"Tunes: "+str$(ntune%)
  hide 51 : hide 52 : hide 53 : hide 54 : hide 55 : hide 56 : hide 57 : hide 58 : hide 59
  hide 33 : hide 34
  return
 
loadm:
  s$ = file_name$(20)
  if s$="_" then return
  if right$(s$,4)<>".bmp" then s$ = s$ + ".bmp"
  if right$(s$,9)<>"_mask.bmp"
    message "Invalid mask file name format"
    return
  end_if
  if file_exists(s$)=0
    message "Masl file not found"
    return
  end_if
  f$ = left$(s$,len(s$)-9) + ".bmp"
  fm$ = s$
  ft$ = left$(fm$,len(s$)-4)+"_tuned.bmp"
  fl$ = left$(fm$,len(s$)-4)+"_tuned_list.txt"
  file_load 2,fm$
  if file_exists(ft$)=1
    file_load 3,ft$
    if file_exists(fl$)=1
      file_load 42,fl$
      ntune% = count(42)
    else
      clear 42
      ntune% = 0
    end_if
  else
    2d_target_is 2
    2d_image_copy 41,0,0,img_w%-1,img_h%-1
    2d_target_is 3
    2d_image_paste 41,0,0
    ntune% = 0
    clear 42
  end_if
  caption 32,"Tunes: "+str$(ntune%)
  2d_target_is 2
  show 50 : hide 51 : hide 52 : hide 53 : hide 54 : hide 55 : hide 56 : hide 57 : hide 58 : hide 59
  hide 33 : hide 34
  return

savem:
  if file_exists(fm$)=1
    if message_confirmation_yes_no("File does already exist. Replace it ?")<>1 then return
  end_if
  file_save 2,fm$
  file_save 3,ft$
  file_save 42,fl$
  s$ =      "mask saved into: "+fm$+chr$(13)+chr$(10)
  s$ = s$ + "tuned mask saved into: "+ft$+chr$(13)+chr$(10)
  s$ = s$ + "tuned list saved into: "+fl$
  message s$
  return
 
savet:
  if file_exists(ft$)=1
    if message_confirmation_yes_no("File does already exist. Replace it ?")<>1 then return
  end_if
  file_save 3,ft$
  file_save 42,fl$
  s$ =      "tuned mask saved into: "+ft$+chr$(13)+chr$(10)
  s$ = s$ + "tuned list saved into: "+fl$
  message s$
  return

rect:
  2d_image_paste 41,0,0
  toprow%    = int(img_h%/4)
  bottomrow%  = int((img_h%*3)/4)
  leftcol%    = int(img_w%/4)
  rightcol%  = int((img_w%*3)/4)
  2d_pen_color 255,0,0
  2d_fill_off
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  show 51 : show 52 : show 53 : show 54 : show 55 : show 56 : show 57 : show 58 : show 59
  show 33 : show 34
  return

enlargeup:
  if toprow%=0 then return
  toprow% = toprow% - 1
  2d_image_paste 41,0,0
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  return
 
moveup:
  if toprow%=0 then return
  toprow% = toprow% - 1
  bottomrow% = bottomrow% - 1
  2d_image_paste 41,0,0
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  return

moveleft:
  if leftcol%=0 then return
  leftcol% = leftcol% - 1
  rightcol% = rightcol% - 1
  2d_image_paste 41,0,0
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  return

enlargeleft:
  if leftcol%=0 then return
  leftcol% = leftcol% - 1
  2d_image_paste 41,0,0
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  return

moveright:
  if rightcol%=(w%-1) then return
  rightcol% = rightcol% + 1
  leftcol% = leftcol% + 1
  2d_image_paste 41,0,0
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  return

reduceright:
  if rightcol%=leftcol% then return
  rightcol% = rightcol% - 1
  2d_image_paste 41,0,0
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  return

reducedown:
  if bottomrow%=toprow% then return
  bottomrow% = bottomrow% - 1
  2d_image_paste 41,0,0
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  return

movedown:
  if bottomrow%=(H%-1) then return
  bottomrow% = bottomrow% + 1
  toprow% = toprow% + 1
  2d_image_paste 41,0,0
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  return

tune:
  if ntune%>=63
    message "Too many tune sections"
    return
  end_if
  ntune% = ntune% + 1
  s$ = trim$(text$(34))
  if s$="" then s$ = "Tune "+str$(ntune%)
  item_add 42,str$(ntune%)+","+str$(leftcol%)+","+str$(toprow%)+","+str$(rightcol%)+","+str$(bottomrow%)+","+s$
  2d_target_is 3
  2d_fill_on
  2d_fill_color 255,255,ntune%*4
  2d_pen_color 255,255,ntune%*4
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  2d_target_is 2
  2d_pen_color 255,0,0
  2d_fill_off
  caption 32,"Tunes: "+str$(ntune%)
  return

(3): Le rectangle apparaît sur le picture de droite lorsque le bouton "Tune" est cliqué, donc lorsque le tune est validé.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Klaus

avatar

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

MessageSujet: Re: Construire un masque pour les sprites   Dim 14 Juin 2015 - 17:40

J'ai fait une version de cet utilitaire qui permet de produire les rotations à gauche (à droite, ça viendra...) par intervalles de 90°. C'est toujours 100 % Panoramic !

Sur mon WebDav, dossier Sources\KGF\, vous trouverez un fichier Android_4_orientations.zip qui contient les 4 orientations de mon sprite Android, avec les masques, tunes et listes des tunes adaptées.

Pour cela, il faut charger un sprite, construire éventuellement son masque s'il n'existe pas encore (sinon, il sera chargé automatiquement, avec éventuellement ses tunes), puis cliquer sur "Rectangle". A droite des 3 pictures apparait alors le bouton "Rotate left 90°". Ce bouton effectue une rotation, en utilisant un picture "de travail" qui s'affiche pour le moment pour plus de clarté (la commande HIDE 4 est mise en commentaire pour le moment). La rotation est effectuée successivement sur le sprite d'origine, puis sur le masque, puis sur le masque avec tunes. Enfin, la liste des coordonnées des tunes est ajustée aussi.

Pour ne pas écraser le sprite d'origine, les noms des 4 fichiers sont adaptés automatiquement, en insérant "(nnn)" juste après le nom du sprite, avant le "." de l'extension ou avant "_mask". Ceci permet de se constituer un ensemble de sprites avec ses fichiers associés, sans conflit, et avec on nom identifiant clairement le contenu du fichier.

Voici le source de cette version:
Code:
' build_sprite_mask.bas

label build, load, save, loadm, savem, savet, rect, tune, close100
label enlargeup, moveup, moveleft, enlargeleft, moveright, reduceright, movedown, reducedown
label right90, left90

dim s$, f$, fm$, ft$, fl$, w%, h%, x%, y%, toprow%, bottomrow%, leftcol%, rightcol%, ntune%
dim img_w%, img_h%, angle%

hide 0
form 100 : caption 100,"Taille du sprite" : on_close 100,close100
alpha 101 : parent 101,100 : top 101,20 : left 101,20 : caption 101,"Largeur:"
spin 102 : parent 102,100 : top 102,20 : left 102,100 : width 102,60
  min 102,10 : max 102,200 : position 102,200
alpha 103 : parent 103,100 : top 103,50 : left 103,20 : caption 103,"Hauteur:"
spin 104 : parent 104,100 : top 104,50 : left 104,100 : width 104,60
  min 104,10 : max 104,200 : position 104,200
button 105 : parent 105,100 : top 105,80 : left 105,100 : caption 105,"Valider"
  on_click 105,close100

width 0,1000 : height 0,600

picture 1 : top 1,10 : left 1, 10 : width 1,200 : height 1,200
picture 2 : top 2,10 : left 2,350 : width 2,200 : height 2,200
picture 3 : top 3,10 : left 3,560 : width 3,200 : height 3,200
picture 4 : top 4,300 : left 4,750 : width 4,200 : height 4,200 : ' hide 4
alpha 5 : top 5,280 : left 5,60

image 41
dlist 42
image 43

button 10 : top 10,90 : left 10,240 : caption 10,"Build mask" : on_click 10,build
button 11 : top 11,220 : left 11,50 : caption 11,"Load image" : on_click 11,load
button 16 : top 16,250 : left 16,50 : caption 16,"Save image" : on_click 16,save
button 12 : top 12,220 : left 12,390 : caption 12,"Load mask" : on_click 12,loadm
button 13 : top 13,250 : left 13,390 : caption 13,"Save mask" : on_click 13,savem
button 15 : top 15,250 : left 15,600 : caption 15,"Save tune" : on_click 15,savet



button 52 : top 52,310 : left 52,390 : caption 52,"Move ^" :    on_click 52,moveup    : hide 52
button 51 : top 51,340 : left 51,390 : caption 51,"Enlarge ^" : on_click 51,enlargeup : hide 51
button 50 : top 50,370 : left 50,370 : caption 50,"Rectangle" : on_click 50,rect      : hide 50 : width 50,60
button 59 : top 59,370 : left 59,430 : caption 59,"Tune"      : on_click 59,tune      : hide 59 : width 59,60
button 54 : top 54,370 : left 54,290 : caption 54,"Enlarge <" : on_click 54,enlargeleft : hide 54
button 53 : top 53,370 : left 53,210 : caption 53,"Move <" :    on_click 53,moveleft    : hide 53
button 55 : top 55,370 : left 55,500 : caption 55,"Reduce >" : on_click 55,reduceright : hide 55
button 56 : top 56,370 : left 56,580 : caption 56,"Move >" :    on_click 56,moveright    : hide 56
button 57 : top 57,430 : left 57,390 : caption 57,"Move v" :    on_click 57,movedown    : hide 57
button 58 : top 58,400 : left 58,390 : caption 58,"Reduce v" : on_click 58,reducedown : hide 58

button 61 : top 61,60 : left 61,790 : width 61,120 : caption 61,"Rotate right 90°" : on_click 61,right90 : hide 61
button 62 : top 62,90 : left 62,790 : width 62,120 : caption 62,"Rotate left 90°" : on_click 62,left90 : hide 62
alpha 69 : top 69,120 : left 69,810

open_dialog 20 : filter 20,"*.bmp|*.bmp"
save_dialog 21 : filter 21,"*.bmp|*.bmp"
alpha 31 : top 31,120 : left 31,230
alpha 32 : top 32,220 : left 32,600 : caption 32,"Tunes: 0"
alpha 33 : top 33,430 : left 33,500 : caption 33,"Tune name:" : hide 33
edit  34 : top 34,430 : left 34,570 : width 34,150 : hide 34

w% = width(1)
h% = height(1)

end

close100:
  img_w% = val(text$(102))
  img_h% = val(text$(104))
  width 1,img_w% : height 1,img_h%
  width 2,img_w% : height 2,img_h%
  width 3,img_w% : height 3,img_h%
  width 4,img_w% : height 4,img_h%
  w% = width(1)
  h% = height(1)
  hide 100
  show 0
  return

build:
  caption 31,"Wait please..."
  display
  2d_target_is 2
  for y%=0 to h%-1
    for x%=0 to w%-1
      if (color_pixel_red(1,x%,y%)=0) and (color_pixel_green(1,x%,y%)=0) and (color_pixel_blue(1,x%,y%)=0)
        2d_pen_color 0,0,0
      else
        2d_pen_color 255,255,255
      end_if
      2d_point x%,y%
    next x%
    caption 31,"Wait please... "+str$(int(y%*100/img_h%))+" %"
    display
  next y%
  2d_image_copy 41,0,0,img_w%-1,img_h%-1
  2d_target_is 3
  2d_image_paste 41,0,0
  2d_target_is 2
  show 50 : hide 51 : hide 52 : hide 53 : hide 54 : hide 55 : hide 56 : hide 57 : hide 58 : hide 59
  hide 33 : hide 34 : hide 61 : hide 62
  ntune% = 0
  caption 32,"Tunes: "+str$(ntune%)
  clear 42
  caption 31,""
  return
 
load:
  ' Le nom du fichier doit contenir l'angle de rotation de l'image, sous forme:
  '    xxx(nnn).bmp
  ' Si l'angle est 0 (pas de rotation), la portion "(nnn)" peut ne pas être indiquée.
  s$ = file_name$(20)
  if s$="_" then return
  if lower$(right$(s$,4))<>".bmp" then s$ = s$ + bmp
  if (instr(s$,"_mask.bmp")>0) or (instr(s$,"_tuned.bmp")>0)  or (instr(s$,"_list.txt")>0)
    message "Invalid image file name format"
    return
  end_if
  f$ = s$
  fm$ = left$(f$,len(f$)-4)+"_mask.bmp"
  ft$ = left$(fm$,len(fm$)-4)+"_tuned.bmp"
  fl$ = left$(fm$,len(fm$)-4)+"_tuned_list.txt"
  file_load 1,f$
  if file_exists(fm$)=1
    file_load 2,fm$
    if file_exists(ft$)=1
      file_load 3,ft$
      if file_exists(fl$)=1
        file_load 42,fl$
      else
        clear 42
      end_if
    else
      color 3,255,255,255
      clear 42
    end_if
    show 50
  else
    color 2,255,255,255
    color 3,255,255,255
    clear 42
    hide 50
  end_if
  ntune% = count(42)
  GetAngle(f$)
  caption 32,"Tunes: "+str$(ntune%)
  hide 51 : hide 52 : hide 53 : hide 54 : hide 55 : hide 56 : hide 57 : hide 58 : hide 59
  hide 33 : hide 34  : hide 61 : hide 62
  return
 
loadm:
  s$ = file_name$(20)
  if s$="_" then return
  if right$(s$,4)<>".bmp" then s$ = s$ + ".bmp"
  if right$(s$,9)<>"_mask.bmp"
    message "Invalid mask file name format"
    return
  end_if
  if file_exists(s$)=0
    message "Masl file not found"
    return
  end_if
  f$ = left$(s$,len(s$)-9) + ".bmp"
  fm$ = s$
  ft$ = left$(fm$,len(s$)-4)+"_tuned.bmp"
  fl$ = left$(fm$,len(s$)-4)+"_tuned_list.txt"
  file_load 2,fm$
  if file_exists(ft$)=1
    file_load 3,ft$
    if file_exists(fl$)=1
      file_load 42,fl$
      ntune% = count(42)
    else
      clear 42
      ntune% = 0
    end_if
  else
    2d_target_is 2
    2d_image_copy 41,0,0,img_w%-1,img_h%-1
    2d_target_is 3
    2d_image_paste 41,0,0
    ntune% = 0
    clear 42
  end_if
  caption 32,"Tunes: "+str$(ntune%)
  2d_target_is 2
  show 50 : hide 51 : hide 52 : hide 53 : hide 54 : hide 55 : hide 56 : hide 57 : hide 58 : hide 59
  hide 33 : hide 34 : hide 61 : hide 62
  return

save:
  if file_exists(f$)=1
    if message_confirmation_yes_no("File does already exist. Replace it ?")<>1 then return
  end_if
  file_save 1,f$
  file_save 2,fm$
  file_save 3,ft$
  file_save 42,fl$
  s$ =      "image saved into: "+f$+chr$(13)+chr$(10)
  s$ = s$ + "mask saved into: "+fm$+chr$(13)+chr$(10)
  s$ = s$ + "tuned mask saved into: "+ft$+chr$(13)+chr$(10)
  s$ = s$ + "tuned list saved into: "+fl$
  message s$
  return

savem:
  if file_exists(fm$)=1
    if message_confirmation_yes_no("File does already exist. Replace it ?")<>1 then return
  end_if
  file_save 2,fm$
  file_save 3,ft$
  file_save 42,fl$
  s$ =      "mask saved into: "+fm$+chr$(13)+chr$(10)
  s$ = s$ + "tuned mask saved into: "+ft$+chr$(13)+chr$(10)
  s$ = s$ + "tuned list saved into: "+fl$
  message s$
  return
 
savet:
  if file_exists(ft$)=1
    if message_confirmation_yes_no("File does already exist. Replace it ?")<>1 then return
  end_if
  file_save 3,ft$
  file_save 42,fl$
  s$ =      "tuned mask saved into: "+ft$+chr$(13)+chr$(10)
  s$ = s$ + "tuned list saved into: "+fl$
  message s$
  return

rect:
  2d_image_paste 41,0,0
  toprow%    = int(img_h%/4)
  bottomrow%  = int((img_h%*3)/4)
  leftcol%    = int(img_w%/4)
  rightcol%  = int((img_w%*3)/4)
  2d_pen_color 255,0,0
  2d_fill_off
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  show 51 : show 52 : show 53 : show 54 : show 55 : show 56 : show 57 : show 58 : show 59
  show 33 : show 34 : show 61 : show 62
  return

enlargeup:
  if toprow%=0 then return
  toprow% = toprow% - 1
  2d_image_paste 41,0,0
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  return
 
moveup:
  if toprow%=0 then return
  toprow% = toprow% - 1
  bottomrow% = bottomrow% - 1
  2d_image_paste 41,0,0
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  return

moveleft:
  if leftcol%=0 then return
  leftcol% = leftcol% - 1
  rightcol% = rightcol% - 1
  2d_image_paste 41,0,0
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  return

enlargeleft:
  if leftcol%=0 then return
  leftcol% = leftcol% - 1
  2d_image_paste 41,0,0
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  return

moveright:
  if rightcol%=(w%-1) then return
  rightcol% = rightcol% + 1
  leftcol% = leftcol% + 1
  2d_image_paste 41,0,0
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  return

reduceright:
  if rightcol%=leftcol% then return
  rightcol% = rightcol% - 1
  2d_image_paste 41,0,0
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  return

reducedown:
  if bottomrow%=toprow% then return
  bottomrow% = bottomrow% - 1
  2d_image_paste 41,0,0
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  return

movedown:
  if bottomrow%=(H%-1) then return
  bottomrow% = bottomrow% + 1
  toprow% = toprow% + 1
  2d_image_paste 41,0,0
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  return

tune:
  if ntune%>=63
    message "Too many tune sections"
    return
  end_if
  ntune% = ntune% + 1
  s$ = trim$(text$(34))
  if s$="" then s$ = "Tune "+str$(ntune%)
  item_add 42,str$(ntune%)+","+str$(leftcol%)+","+str$(toprow%)+","+str$(rightcol%)+","+str$(bottomrow%)+","+s$
  2d_target_is 3
  2d_fill_on
  2d_fill_color 255,255,ntune%*4
  2d_pen_color 255,255,ntune%*4
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  2d_target_is 2
  2d_pen_color 255,0,0
  2d_fill_off
  caption 32,"Tunes: "+str$(ntune%)
  return

right90:
  RotatePictureRight(1)
  RotatePictureRight(2)
  RotatePictureRight(3)
  angle% = angle% - 90
  RotateTunesRight()
  AdjustAngle()
  return

left90:
  RotatePictureLeft(1)
  RotatePictureLeft(2)
  RotatePictureLeft(3)
  RotateTunesLeft()
  angle% = angle% + 90
  AdjustAngle()
  return
 
sub AdjustAngle()
' adapter les noms des fichiers:    f$, fm$, ft$, fl$
  dim_local s$, p1%, p2%, a$
  if angle%<0 then angle% = 270
  if angle%=360 then angle% = 0
  if angle%>0        : ' placer l'angle
    if angle%=90    : ' insérer l'angle
    ' nom.bmp ==> nom(xxx).bmp
    ' nom_mask.bmp ==> nom(xxx)_mask.bmp
    ' nom_mask_tuned.bmp ==> nom(xxx)_mask_tuned.bmp
    ' nom_mask_tuned_list.bmp ==> nom(xxx)_mask_tuned_list.bmp
      a$  = "(90)"
      p1% = instr(f$,".")
      f$  = left$(f$,p1%-1)+a$+mid$(f$,p1%,len(f$))
      p1% = instr(fm$,"_mask")
      fm$ = left$(fm$,p1%-1)+a$+mid$(fm$,p1%,len(fm$))
      p1% = instr(ft$,"_mask")
      ft$ = left$(ft$,p1%-1)+a$+mid$(ft$,p1%,len(ft$))
      p1% = instr(fl$,"_mask")
      fl$ = left$(fl$,p1%-1)+a$+mid$(fl$,p1%,len(fl$))
    else            : ' remplacer l'angle
      ' nom(xxx).bmp ==> nom(yyy).bmp
      ' nom(xxx)_mask.bmp ==> nom(yyy)_mask.bmp
      ' nom(xxx)_mask_tuned.bmp ==> nom(yyy)_mask_tuned.bmp
      ' nom(xxx)_mask_tuned_list.bmp ==> nom(yyy)_mask_tuned_list.bmp
      a$  = "("+str$(angle%)+")"
      p1% = instr(f$,"(")
      p2% = instr(f$,")")
      f$  = left$(f$,p1%-1)+a$+mid$(f$,p2%+1,len(f$))
      p1% = instr(fm$,"(")
      p2% = instr(fm$,")")
      fm$ = left$(fm$,p1%-1)+a$+mid$(fm$,p2%+1,len(fm$))
      p1% = instr(ft$,"(")
      p2% = instr(ft$,")")
      ft$ = left$(ft$,p1%-1)+a$+mid$(ft$,p2%+1,len(ft$))
      p1% = instr(fl$,"(")
      p2% = instr(fl$,")")
      fl$ = left$(fl$,p1%-1)+a$+mid$(fl$,p2%+1,len(fl$))
    end_if
  else          : ' retirer l'angle
    ' nom(xxx).bmp ==> nom.bmp
    ' nom(xxx)_mask.bmp ==> nom_mask.bmp
    ' nom(xxx)_mask_tuned.bmp ==> nom_mask_tuned.bmp
    ' nom(xxx)_mask_tuned_list.bmp ==> nom_mask_tuned_list.bmp
      p1% = instr(f$,"(")
      p2% = instr(f$,")")
      f$  = left$(f$,p1%-1)+mid$(f$,p2%+1,len(f$))
      p1% = instr(fm$,"(")
      p2% = instr(fm$,")")
      fm$ = left$(fm$,p1%-1)+mid$(fm$,p2%+1,len(fm$))
      p1% = instr(ft$,"(")
      p2% = instr(ft$,")")
      ft$ = left$(ft$,p1%-1)+mid$(ft$,p2%+1,len(ft$))
      p1% = instr(fl$,"(")
      p2% = instr(fl$,")")
      fl$ = left$(fl$,p1%-1)+mid$(fl$,p2%+1,len(fl$))
  end_if
  caption 5,"Angle: "+str$(angle%)+"°"
  s$ = "Nouveaux noms de fichiers:"+chr$(13)+chr$(10)
  message s$+f$+chr$(13)+chr$(10)+fm$+chr$(13)+chr$(10)+ft$+chr$(13)+chr$(10)+fl$+chr$(13)+chr$(10)
end_sub

sub RotatePictureLeft(pic%)
  dim_local w%, h%, l%, c%
  caption 69,"Wait please.."
  h% = height(pic%) : w% = width(pic%)
  width 4,h%  : height 4,w%
  2d_target_is 4
  for l%=0 to h%-1
    for c%=0 to w%-1
      2d_pen_color color_pixel_red(pic%,c%,l%),color_pixel_green(pic%,c%,l%),color_pixel_blue(pic%,c%,l%)
      2d_point l%,w%-c%-1
    next c%
    caption 69,"Wait please... "+str$(int(l%*100/h%))+" %"
    display
  next l%
  width pic%,h% : height pic%,w%
  color pic%,0,0,0
  2d_image_copy 43,0,0,h%-1,w%-1
  2d_target_is pic%
  2d_image_paste 43,0,0
  caption 69,""
end_sub

sub RotatePictureRight(pic%)

end_sub

sub RotateTunesLeft()
  dim_local t%, t$, n$, p%, nt%, lc%, tr%, rc%, br%, lcx%, trx%, rcx%, brx%
  if count(42)>0
    caption 69,"Tune transposition..."
    display
    for t%=1 to count(42)
      t$ = item_read$(42,t%)
      p% = instr(t$,",")
      nt% = val(left$(t$,p%-1))
      t$ = mid$(t$,p%+1,100)
      p% = instr(t$,",")
      lcx% = val(left$(t$,p%-1))
      t$ = mid$(t$,p%+1,100)
      p% = instr(t$,",")
      trx% = val(left$(t$,p%-1))
      t$ = mid$(t$,p%+1,100)
      p% = instr(t$,",")
      rcx% = val(left$(t$,p%-1))
      t$ = mid$(t$,p%+1,100)
      p% = instr(t$,",")
      brx% = val(left$(t$,p%-1))
      n$ = mid$(t$,p%+1,100)

      lc% = trx%
      tr% = w% - lcx%
      rc% = brx%
      br% = h% - rcx%
     
      item_delete 42,t%
      item_insert 42,t%,str$(nt%)+","+str$(lc%)+","+str$(tr%)+","+str$(rc%)+","+str$(br%)+","+n$
    next t%
    caption 69,""
  end_if
  ' ajuster les coordonnées du rectangle actuel
  lc% = leftcol%
  tr% = toprow%
  rc% = rightcol%
  br% = bottomrow%
  leftcol% = tr%
  toprow% = w% - lc%
  rightcol% = br%
  bottomrow% = h% - rc%
  ' ajuster les variables donnant les dimensions actuelles
  img_w% = width(1)
  img_h% = height(1)
  w% = img_w%
  h% = img_h%
end_sub

sub RotateTunesRight()

end_sub
 
sub GetAngle(f$)
  dim_local p1%, p2%
  angle% = 0
  p1% = instr(f$,"(")
  if p1%>0
    p2% = instr(f$,")")
    if p2%>p1%
      angle%=val(mid$(f$,p1%+1,p2%-p1%-1))
    end_if
  end_if
  caption 5,"Angle: "+str$(angle%)+"°"
end_sub

sub LoadPicture(pic%,nam$)
  width pic%,img_w%
  height pic%,img_h%
  color pic%,255,255,255
  file_load 4,nam$
  2d_target_is 4
  2d_image_copy 43,0,0,img_w%,img_h%
  2d_target_is pic%
  2d_image_paste 43,0,0
end_sub

Je vais réfléchir à une rotation autre que 90°.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Klaus

avatar

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

MessageSujet: Re: Construire un masque pour les sprites   Lun 15 Juin 2015 - 0:46

Après correction d'un petit bug, et la réalisation de la rotation à droite, voici une version réellement exploitable, avec la rotation dans les deux sens, par pas de 90°:
Code:
' build_sprite_mask.bas

label build, load, save, loadm, savem, savet, rect, tune, close100
label enlargeup, moveup, moveleft, enlargeleft, moveright, reduceright, movedown, reducedown
label right90, left90

dim s$, f$, fm$, ft$, fl$, w%, h%, x%, y%, toprow%, bottomrow%, leftcol%, rightcol%, ntune%
dim img_w%, img_h%, angle%

hide 0
form 100 : caption 100,"Taille du sprite" : on_close 100,close100
alpha 101 : parent 101,100 : top 101,20 : left 101,20 : caption 101,"Largeur:"
spin 102 : parent 102,100 : top 102,20 : left 102,100 : width 102,60
  min 102,10 : max 102,200 : position 102,200
alpha 103 : parent 103,100 : top 103,50 : left 103,20 : caption 103,"Hauteur:"
spin 104 : parent 104,100 : top 104,50 : left 104,100 : width 104,60
  min 104,10 : max 104,200 : position 104,200
button 105 : parent 105,100 : top 105,80 : left 105,100 : caption 105,"Valider"
  on_click 105,close100

width 0,1000 : height 0,600

picture 1 : top 1,10 : left 1, 10 : width 1,200 : height 1,200
picture 2 : top 2,10 : left 2,350 : width 2,200 : height 2,200
picture 3 : top 3,10 : left 3,560 : width 3,200 : height 3,200
picture 4 : top 4,300 : left 4,750 : width 4,200 : height 4,200 : ' hide 4
alpha 5 : top 5,280 : left 5,60

image 41
dlist 42
image 43

button 10 : top 10,90 : left 10,240 : caption 10,"Build mask" : on_click 10,build
button 11 : top 11,220 : left 11,50 : caption 11,"Load image" : on_click 11,load
button 16 : top 16,250 : left 16,50 : caption 16,"Save image" : on_click 16,save
button 12 : top 12,220 : left 12,390 : caption 12,"Load mask" : on_click 12,loadm
button 13 : top 13,250 : left 13,390 : caption 13,"Save mask" : on_click 13,savem
button 15 : top 15,250 : left 15,600 : caption 15,"Save tune" : on_click 15,savet



button 52 : top 52,310 : left 52,390 : caption 52,"Move ^" :    on_click 52,moveup    : hide 52
button 51 : top 51,340 : left 51,390 : caption 51,"Enlarge ^" : on_click 51,enlargeup : hide 51
button 50 : top 50,370 : left 50,370 : caption 50,"Rectangle" : on_click 50,rect      : hide 50 : width 50,60
button 59 : top 59,370 : left 59,430 : caption 59,"Tune"      : on_click 59,tune      : hide 59 : width 59,60
button 54 : top 54,370 : left 54,290 : caption 54,"Enlarge <" : on_click 54,enlargeleft : hide 54
button 53 : top 53,370 : left 53,210 : caption 53,"Move <" :    on_click 53,moveleft    : hide 53
button 55 : top 55,370 : left 55,500 : caption 55,"Reduce >" : on_click 55,reduceright : hide 55
button 56 : top 56,370 : left 56,580 : caption 56,"Move >" :    on_click 56,moveright    : hide 56
button 57 : top 57,430 : left 57,390 : caption 57,"Move v" :    on_click 57,movedown    : hide 57
button 58 : top 58,400 : left 58,390 : caption 58,"Reduce v" : on_click 58,reducedown : hide 58

button 61 : top 61,60 : left 61,790 : width 61,120 : caption 61,"Rotate right 90°" : on_click 61,right90 : hide 61
button 62 : top 62,90 : left 62,790 : width 62,120 : caption 62,"Rotate left 90°" : on_click 62,left90 : hide 62
alpha 69 : top 69,120 : left 69,810

open_dialog 20 : filter 20,"*.bmp|*.bmp"
save_dialog 21 : filter 21,"*.bmp|*.bmp"
alpha 31 : top 31,120 : left 31,230
alpha 32 : top 32,220 : left 32,600 : caption 32,"Tunes: 0"
alpha 33 : top 33,430 : left 33,500 : caption 33,"Tune name:" : hide 33
edit  34 : top 34,430 : left 34,570 : width 34,150 : hide 34

w% = width(1)
h% = height(1)

end

close100:
  img_w% = val(text$(102))
  img_h% = val(text$(104))
  width 1,img_w% : height 1,img_h%
  width 2,img_w% : height 2,img_h%
  width 3,img_w% : height 3,img_h%
  width 4,img_w% : height 4,img_h%
  w% = width(1)
  h% = height(1)
  hide 100
  show 0
  return

build:
  caption 31,"Wait please..."
  display
  2d_target_is 2
  for y%=0 to h%-1
    for x%=0 to w%-1
      if (color_pixel_red(1,x%,y%)=0) and (color_pixel_green(1,x%,y%)=0) and (color_pixel_blue(1,x%,y%)=0)
        2d_pen_color 0,0,0
      else
        2d_pen_color 255,255,255
      end_if
      2d_point x%,y%
    next x%
    caption 31,"Wait please... "+str$(int(y%*100/img_h%))+" %"
    display
  next y%
  2d_image_copy 41,0,0,img_w%-1,img_h%-1
  2d_target_is 3
  2d_image_paste 41,0,0
  2d_target_is 2
  show 50 : hide 51 : hide 52 : hide 53 : hide 54 : hide 55 : hide 56 : hide 57 : hide 58 : hide 59
  hide 33 : hide 34 : hide 61 : hide 62
  ntune% = 0
  caption 32,"Tunes: "+str$(ntune%)
  clear 42
  caption 31,""
  return
 
load:
  ' Le nom du fichier doit contenir l'angle de rotation de l'image, sous forme:
  '    xxx(nnn).bmp
  ' Si l'angle est 0 (pas de rotation), la portion "(nnn)" peut ne pas être indiquée.
  s$ = file_name$(20)
  if s$="_" then return
  if lower$(right$(s$,4))<>".bmp" then s$ = s$ + bmp
  if (instr(s$,"_mask.bmp")>0) or (instr(s$,"_tuned.bmp")>0)  or (instr(s$,"_list.txt")>0)
    message "Invalid image file name format"
    return
  end_if
  f$ = s$
  fm$ = left$(f$,len(f$)-4)+"_mask.bmp"
  ft$ = left$(fm$,len(fm$)-4)+"_tuned.bmp"
  fl$ = left$(fm$,len(fm$)-4)+"_tuned_list.txt"
  file_load 1,f$
  if file_exists(fm$)=1
    file_load 2,fm$
    2d_target_is 2
    2d_image_copy 41,0,0,img_w%-1,img_h%-1
    if file_exists(ft$)=1
      file_load 3,ft$
      if file_exists(fl$)=1
        file_load 42,fl$
      else
        clear 42
      end_if
    else
      color 3,255,255,255
      clear 42
    end_if
    show 50
  else
    color 2,255,255,255
    color 3,255,255,255
    clear 42
    hide 50
  end_if
  ntune% = count(42)
  GetAngle(f$)
  2d_target_is 2
  caption 32,"Tunes: "+str$(ntune%)
  hide 51 : hide 52 : hide 53 : hide 54 : hide 55 : hide 56 : hide 57 : hide 58 : hide 59
  hide 33 : hide 34  : hide 61 : hide 62
  return
 
loadm:
  s$ = file_name$(20)
  if s$="_" then return
  if right$(s$,4)<>".bmp" then s$ = s$ + ".bmp"
  if right$(s$,9)<>"_mask.bmp"
    message "Invalid mask file name format"
    return
  end_if
  if file_exists(s$)=0
    message "Masl file not found"
    return
  end_if
  f$ = left$(s$,len(s$)-9) + ".bmp"
  fm$ = s$
  ft$ = left$(fm$,len(s$)-4)+"_tuned.bmp"
  fl$ = left$(fm$,len(s$)-4)+"_tuned_list.txt"
  file_load 2,fm$
  2d_target_is 2
  2d_image_copy 41,0,0,img_w%-1,img_h%-1
  if file_exists(ft$)=1
    file_load 3,ft$
    if file_exists(fl$)=1
      file_load 42,fl$
      ntune% = count(42)
    else
      clear 42
      ntune% = 0
    end_if
  else
    2d_target_is 3
    2d_image_paste 41,0,0
    ntune% = 0
    clear 42
  end_if
  caption 32,"Tunes: "+str$(ntune%)
  2d_target_is 2
  show 50 : hide 51 : hide 52 : hide 53 : hide 54 : hide 55 : hide 56 : hide 57 : hide 58 : hide 59
  hide 33 : hide 34 : hide 61 : hide 62
  return

save:
  if file_exists(f$)=1
    if message_confirmation_yes_no("File does already exist. Replace it ?")<>1 then return
  end_if
  file_save 1,f$
  2d_target_is 2
  2d_image_paste 41,0,0
  file_save 2,fm$
  file_save 3,ft$
  file_save 42,fl$
  s$ =      "image saved into: "+f$+chr$(13)+chr$(10)
  s$ = s$ + "mask saved into: "+fm$+chr$(13)+chr$(10)
  s$ = s$ + "tuned mask saved into: "+ft$+chr$(13)+chr$(10)
  s$ = s$ + "tuned list saved into: "+fl$
  message s$
  return

savem:
  if file_exists(fm$)=1
    if message_confirmation_yes_no("File does already exist. Replace it ?")<>1 then return
  end_if
  file_save 2,fm$
  file_save 3,ft$
  file_save 42,fl$
  s$ =      "mask saved into: "+fm$+chr$(13)+chr$(10)
  s$ = s$ + "tuned mask saved into: "+ft$+chr$(13)+chr$(10)
  s$ = s$ + "tuned list saved into: "+fl$
  message s$
  return
 
savet:
  if file_exists(ft$)=1
    if message_confirmation_yes_no("File does already exist. Replace it ?")<>1 then return
  end_if
  file_save 3,ft$
  file_save 42,fl$
  s$ =      "tuned mask saved into: "+ft$+chr$(13)+chr$(10)
  s$ = s$ + "tuned list saved into: "+fl$
  message s$
  return

rect:
  2d_target_is 2
  2d_image_paste 41,0,0
  toprow%    = int(img_h%/4)
  bottomrow%  = int((img_h%*3)/4)
  leftcol%    = int(img_w%/4)
  rightcol%  = int((img_w%*3)/4)
  2d_pen_color 255,0,0
  2d_fill_off
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  show 51 : show 52 : show 53 : show 54 : show 55 : show 56 : show 57 : show 58 : show 59
  show 33 : show 34 : show 61 : show 62
  return

enlargeup:
  if toprow%=0 then return
  toprow% = toprow% - 1
  2d_image_paste 41,0,0
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  return
 
moveup:
  if toprow%=0 then return
  toprow% = toprow% - 1
  bottomrow% = bottomrow% - 1
  2d_image_paste 41,0,0
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  return

moveleft:
  if leftcol%=0 then return
  leftcol% = leftcol% - 1
  rightcol% = rightcol% - 1
  2d_image_paste 41,0,0
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  return

enlargeleft:
  if leftcol%=0 then return
  leftcol% = leftcol% - 1
  2d_image_paste 41,0,0
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  return

moveright:
  if rightcol%=(w%-1) then return
  rightcol% = rightcol% + 1
  leftcol% = leftcol% + 1
  2d_image_paste 41,0,0
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  return

reduceright:
  if rightcol%=leftcol% then return
  rightcol% = rightcol% - 1
  2d_image_paste 41,0,0
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  return

reducedown:
  if bottomrow%=toprow% then return
  bottomrow% = bottomrow% - 1
  2d_image_paste 41,0,0
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  return

movedown:
  if bottomrow%=(H%-1) then return
  bottomrow% = bottomrow% + 1
  toprow% = toprow% + 1
  2d_image_paste 41,0,0
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  return

tune:
  if ntune%>=63
    message "Too many tune sections"
    return
  end_if
  ntune% = ntune% + 1
  s$ = trim$(text$(34))
  if s$="" then s$ = "Tune "+str$(ntune%)
  item_add 42,str$(ntune%)+","+str$(leftcol%)+","+str$(toprow%)+","+str$(rightcol%)+","+str$(bottomrow%)+","+s$
  2d_target_is 3
  2d_fill_on
  2d_fill_color 255,255,ntune%*4
  2d_pen_color 255,255,ntune%*4
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  2d_target_is 2
  2d_pen_color 255,0,0
  2d_fill_off
  caption 32,"Tunes: "+str$(ntune%)
  return

right90:
  RotatePictureRight(1)
  2d_target_is 2
  2d_image_paste 41,0,0
  RotatePictureRight(2)
  2d_image_copy 41,0,0,img_w%-1,img_h%-1
  RotatePictureRight(3)
  RotateTunesRight()
  AdjustAngle(0-90)
  2d_target_is 2
  return

left90:
  RotatePictureLeft(1)
  2d_target_is 2
  2d_image_paste 41,0,0
  RotatePictureLeft(2)
  2d_image_copy 41,0,0,img_w%-1,img_h%-1
  RotatePictureLeft(3)
  RotateTunesLeft()
  AdjustAngle(90)
  2d_target_is 2
  return
 
sub AdjustAngle(delta%)
' adapter les noms des fichiers:    f$, fm$, ft$, fl$
  dim_local s$, p1%, p2%, a$, oldangle%
  oldangle% = angle%
  angle% = angle% + delta%
  if angle%<0 then angle% = 270
  if angle%=360 then angle% = 0
  if angle%>0        : ' placer l'angle
    if oldangle%=0  : ' insérer l'angle
    ' nom.bmp ==> nom(xxx).bmp
    ' nom_mask.bmp ==> nom(xxx)_mask.bmp
    ' nom_mask_tuned.bmp ==> nom(xxx)_mask_tuned.bmp
    ' nom_mask_tuned_list.bmp ==> nom(xxx)_mask_tuned_list.bmp
      a$  = "("+str$(angle%)+")"
      p1% = instr(f$,".")
      f$  = left$(f$,p1%-1)+a$+mid$(f$,p1%,len(f$))
      p1% = instr(fm$,"_mask")
      fm$ = left$(fm$,p1%-1)+a$+mid$(fm$,p1%,len(fm$))
      p1% = instr(ft$,"_mask")
      ft$ = left$(ft$,p1%-1)+a$+mid$(ft$,p1%,len(ft$))
      p1% = instr(fl$,"_mask")
      fl$ = left$(fl$,p1%-1)+a$+mid$(fl$,p1%,len(fl$))
    else            : ' remplacer l'angle
      ' nom(xxx).bmp ==> nom(yyy).bmp
      ' nom(xxx)_mask.bmp ==> nom(yyy)_mask.bmp
      ' nom(xxx)_mask_tuned.bmp ==> nom(yyy)_mask_tuned.bmp
      ' nom(xxx)_mask_tuned_list.bmp ==> nom(yyy)_mask_tuned_list.bmp
      a$  = "("+str$(angle%)+")"
      p1% = instr(f$,"(")
      p2% = instr(f$,")")
      f$  = left$(f$,p1%-1)+a$+mid$(f$,p2%+1,len(f$))
      p1% = instr(fm$,"(")
      p2% = instr(fm$,")")
      fm$ = left$(fm$,p1%-1)+a$+mid$(fm$,p2%+1,len(fm$))
      p1% = instr(ft$,"(")
      p2% = instr(ft$,")")
      ft$ = left$(ft$,p1%-1)+a$+mid$(ft$,p2%+1,len(ft$))
      p1% = instr(fl$,"(")
      p2% = instr(fl$,")")
      fl$ = left$(fl$,p1%-1)+a$+mid$(fl$,p2%+1,len(fl$))
    end_if
  else          : ' retirer l'angle
    ' nom(xxx).bmp ==> nom.bmp
    ' nom(xxx)_mask.bmp ==> nom_mask.bmp
    ' nom(xxx)_mask_tuned.bmp ==> nom_mask_tuned.bmp
    ' nom(xxx)_mask_tuned_list.bmp ==> nom_mask_tuned_list.bmp
      p1% = instr(f$,"(")
      p2% = instr(f$,")")
      f$  = left$(f$,p1%-1)+mid$(f$,p2%+1,len(f$))
      p1% = instr(fm$,"(")
      p2% = instr(fm$,")")
      fm$ = left$(fm$,p1%-1)+mid$(fm$,p2%+1,len(fm$))
      p1% = instr(ft$,"(")
      p2% = instr(ft$,")")
      ft$ = left$(ft$,p1%-1)+mid$(ft$,p2%+1,len(ft$))
      p1% = instr(fl$,"(")
      p2% = instr(fl$,")")
      fl$ = left$(fl$,p1%-1)+mid$(fl$,p2%+1,len(fl$))
  end_if
  caption 5,"Angle: "+str$(angle%)+"°"
  s$ = "Nouveaux noms de fichiers:"+chr$(13)+chr$(10)
  message s$+f$+chr$(13)+chr$(10)+fm$+chr$(13)+chr$(10)+ft$+chr$(13)+chr$(10)+fl$+chr$(13)+chr$(10)
end_sub

sub RotatePictureLeft(pic%)
  dim_local w%, h%, l%, c%
  caption 69,"Wait please.."
  h% = height(pic%) : w% = width(pic%)
  width 4,h%  : height 4,w%
  2d_target_is 4
  for l%=0 to h%-1
    for c%=0 to w%-1
      2d_pen_color color_pixel_red(pic%,c%,l%),color_pixel_green(pic%,c%,l%),color_pixel_blue(pic%,c%,l%)
      2d_point l%,w%-c%-1
    next c%
    caption 69,"Wait please... "+str$(int(l%*100/h%))+" %"
    display
  next l%
  width pic%,h% : height pic%,w%
  color pic%,0,0,0
  2d_image_copy 43,0,0,h%-1,w%-1
  2d_target_is pic%
  2d_image_paste 43,0,0
  caption 69,""
end_sub

sub RotatePictureRight(pic%)
  dim_local w%, h%, l%, c%
  caption 69,"Wait please.."
  h% = height(pic%) : w% = width(pic%)
  width 4,h%  : height 4,w%
  2d_target_is 4
  for l%=0 to h%-1
    for c%=0 to w%-1
      2d_pen_color color_pixel_red(pic%,c%,l%),color_pixel_green(pic%,c%,l%),color_pixel_blue(pic%,c%,l%)
      2d_point h%-l%-1,c%
    next c%
    caption 69,"Wait please... "+str$(int(l%*100/h%))+" %"
    display
  next l%
  width pic%,h% : height pic%,w%
  color pic%,0,0,0
  2d_image_copy 43,0,0,h%-1,w%-1
  2d_target_is pic%
  2d_image_paste 43,0,0
  caption 69,""
end_sub

sub RotateTunesLeft()
  dim_local t%, t$, n$, p%, nt%, lc%, tr%, rc%, br%, lcx%, trx%, rcx%, brx%
  if count(42)>0
    caption 69,"Tune transposition..."
    display
    for t%=1 to count(42)
      t$ = item_read$(42,t%)
      p% = instr(t$,",")
      nt% = val(left$(t$,p%-1))
      t$ = mid$(t$,p%+1,100)
      p% = instr(t$,",")
      lcx% = val(left$(t$,p%-1))
      t$ = mid$(t$,p%+1,100)
      p% = instr(t$,",")
      trx% = val(left$(t$,p%-1))
      t$ = mid$(t$,p%+1,100)
      p% = instr(t$,",")
      rcx% = val(left$(t$,p%-1))
      t$ = mid$(t$,p%+1,100)
      p% = instr(t$,",")
      brx% = val(left$(t$,p%-1))
      n$ = mid$(t$,p%+1,100)

      lc% = trx%
      tr% = rcx%
      rc% = brx%
      br% = lcx%
     
      item_delete 42,t%
      item_insert 42,t%,str$(nt%)+","+str$(lc%)+","+str$(tr%)+","+str$(rc%)+","+str$(br%)+","+n$
    next t%
    caption 69,""
  end_if
  ' ajuster les coordonnées du rectangle actuel
' message str$(lc%)+","+str$(tr%)+"/"+str$(rc%)+","+str$(br%)+" => "+str$(leftcol%)+","+str$(toprow%)+"/"+str$(rightcol%)+","+str$(bottomrow%)
  lc% = leftcol%
  tr% = toprow%
  rc% = rightcol%
  br% = bottomrow%
  leftcol% = tr%
  toprow% = rc%
  rightcol% = br%
  bottomrow% = lc%
  ' ajuster les variables donnant les dimensions actuelles
  img_w% = width(1)
  img_h% = height(1)
  w% = img_w%
  h% = img_h%
end_sub

sub RotateTunesRight()
  dim_local t%, t$, n$, p%, nt%, lc%, tr%, rc%, br%, lcx%, trx%, rcx%, brx%
  if count(42)>0
    caption 69,"Tune transposition..."
    display
    for t%=1 to count(42)
      t$ = item_read$(42,t%)
      p% = instr(t$,",")
      nt% = val(left$(t$,p%-1))
      t$ = mid$(t$,p%+1,100)
      p% = instr(t$,",")
      lcx% = val(left$(t$,p%-1))
      t$ = mid$(t$,p%+1,100)
      p% = instr(t$,",")
      trx% = val(left$(t$,p%-1))
      t$ = mid$(t$,p%+1,100)
      p% = instr(t$,",")
      rcx% = val(left$(t$,p%-1))
      t$ = mid$(t$,p%+1,100)
      p% = instr(t$,",")
      brx% = val(left$(t$,p%-1))
      n$ = mid$(t$,p%+1,100)

      lc% = w%-brx%-1
      tr% = lcx%
      rc% = w%-trx%-1
      br% = rcx%

      item_delete 42,t%
      item_insert 42,t%,str$(nt%)+","+str$(lc%)+","+str$(tr%)+","+str$(rc%)+","+str$(br%)+","+n$
    next t%
    caption 69,""
  end_if
  ' ajuster les coordonnées du rectangle actuel
  lc% = leftcol%
  tr% = toprow%
  rc% = rightcol%
  br% = bottomrow%
  leftcol% = w%-br%-1
  toprow% = lc%
  rightcol% = w%-tr%-1
  bottomrow% = rc%
  ' ajuster les variables donnant les dimensions actuelles
  img_w% = width(1)
  img_h% = height(1)
  w% = img_w%
  h% = img_h%
end_sub
 
sub GetAngle(f$)
  dim_local p1%, p2%
  angle% = 0
  p1% = instr(f$,"(")
  if p1%>0
    p2% = instr(f$,")")
    if p2%>p1%
      angle%=val(mid$(f$,p1%+1,p2%-p1%-1))
    end_if
  end_if
  caption 5,"Angle: "+str$(angle%)+"°"
end_sub

Sur le WebDav, dossier Sources\KGF\, il y a un fichier Android_4_orientations.zip qui contient mon sprite Android en position normale et tourné à 90°, 180° et 270°, y compris les tunes. Vous pouvez d'ailleurs charger n'importe quelle orientation par le bouton "Load image", comme celle de 270° par exemple en sélectionnant le fichier Android(270).bmp, et le programme reconnaîtra automatiquement l'angle de rotation.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Jicehel

avatar

Nombre de messages : 5858
Age : 45
Localisation : 77500
Date d'inscription : 19/04/2011

MessageSujet: Re: Construire un masque pour les sprites   Lun 15 Juin 2015 - 8:17

Très bien. Peut-être ajouter les 2 miroirs aussi (horizontal et vertical ?)
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

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

MessageSujet: Re: Construire un masque pour les sprites   Lun 15 Juin 2015 - 11:29

D'accord. Je m'y mets...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Jicehel

avatar

Nombre de messages : 5858
Age : 45
Localisation : 77500
Date d'inscription : 19/04/2011

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

Merci Klaus.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

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

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

Et voilà: miroir horizontal et vertical. En plus, affichage du nom et du chemin du sprite de base dans le titre:
Code:
' build_sprite_mask.bas

label build, load, save, loadm, savem, savet, rect, tune, close100
label enlargeup, moveup, moveleft, enlargeleft, moveright, reduceright, movedown, reducedown
label right90, left90, flipleft, flipdown

dim s$, f$, fm$, ft$, fl$, w%, h%, x%, y%, toprow%, bottomrow%, leftcol%, rightcol%, ntune%
dim img_w%, img_h%, angle%

hide 0
form 100 : caption 100,"Taille du sprite" : on_close 100,close100
alpha 101 : parent 101,100 : top 101,20 : left 101,20 : caption 101,"Largeur:"
spin 102 : parent 102,100 : top 102,20 : left 102,100 : width 102,60
  min 102,10 : max 102,200 : position 102,200
alpha 103 : parent 103,100 : top 103,50 : left 103,20 : caption 103,"Hauteur:"
spin 104 : parent 104,100 : top 104,50 : left 104,100 : width 104,60
  min 104,10 : max 104,200 : position 104,200
button 105 : parent 105,100 : top 105,80 : left 105,100 : caption 105,"Valider"
  on_click 105,close100

width 0,1000 : height 0,600

picture 1 : top 1,10 : left 1, 10 : width 1,200 : height 1,200
picture 2 : top 2,10 : left 2,350 : width 2,200 : height 2,200
picture 3 : top 3,10 : left 3,560 : width 3,200 : height 3,200
picture 4 : top 4,300 : left 4,750 : width 4,200 : height 4,200 : ' hide 4
alpha 5 : top 5,280 : left 5,60

image 41
dlist 42
image 43

button 10 : top 10,90 : left 10,240 : caption 10,"Build mask" : on_click 10,build
button 11 : top 11,220 : left 11,50 : caption 11,"Load image" : on_click 11,load
button 16 : top 16,250 : left 16,50 : caption 16,"Save image" : on_click 16,save
button 12 : top 12,220 : left 12,390 : caption 12,"Load mask" : on_click 12,loadm
button 13 : top 13,250 : left 13,390 : caption 13,"Save mask" : on_click 13,savem
button 15 : top 15,250 : left 15,600 : caption 15,"Save tune" : on_click 15,savet



button 52 : top 52,310 : left 52,390 : caption 52,"Move ^" :    on_click 52,moveup    : hide 52
button 51 : top 51,340 : left 51,390 : caption 51,"Enlarge ^" : on_click 51,enlargeup : hide 51
button 50 : top 50,370 : left 50,370 : caption 50,"Rectangle" : on_click 50,rect      : hide 50 : width 50,60
button 59 : top 59,370 : left 59,430 : caption 59,"Tune"      : on_click 59,tune      : hide 59 : width 59,60
button 54 : top 54,370 : left 54,290 : caption 54,"Enlarge <" : on_click 54,enlargeleft : hide 54
button 53 : top 53,370 : left 53,210 : caption 53,"Move <" :    on_click 53,moveleft    : hide 53
button 55 : top 55,370 : left 55,500 : caption 55,"Reduce >" : on_click 55,reduceright : hide 55
button 56 : top 56,370 : left 56,580 : caption 56,"Move >" :    on_click 56,moveright    : hide 56
button 57 : top 57,430 : left 57,390 : caption 57,"Move v" :    on_click 57,movedown    : hide 57
button 58 : top 58,400 : left 58,390 : caption 58,"Reduce v" : on_click 58,reducedown : hide 58

button 61 : top 61,60 : left 61,770 : width 61,90 : caption 61,"Rotate right 90°" : on_click 61,right90 : hide 61
button 62 : top 62,60 : left 62,870 : width 62,90 : caption 62,"Rotate left 90°" : on_click 62,left90 : hide 62
button 63 : top 63,90 : left 63,770 : width 63,90 : caption 63,"Flip horizontally" : on_click 63,flipleft : hide 63
button 64 : top 64,90 : left 64,870 : width 64,90 : caption 64,"Flip vertically" : on_click 64,flipdown : hide 64
alpha 69 : top 69,120 : left 69,810

open_dialog 20 : filter 20,"*.bmp|*.bmp"
save_dialog 21 : filter 21,"*.bmp|*.bmp"
alpha 31 : top 31,120 : left 31,230
alpha 32 : top 32,220 : left 32,600 : caption 32,"Tunes: 0"
alpha 33 : top 33,430 : left 33,500 : caption 33,"Tune name:" : hide 33
edit  34 : top 34,430 : left 34,570 : width 34,150 : hide 34

w% = width(1)
h% = height(1)

end

close100:
  img_w% = val(text$(102))
  img_h% = val(text$(104))
  width 1,img_w% : height 1,img_h%
  width 2,img_w% : height 2,img_h%
  width 3,img_w% : height 3,img_h%
  width 4,img_w% : height 4,img_h%
  w% = width(1)
  h% = height(1)
  hide 100
  show 0
  return

build:
  caption 31,"Wait please..."
  display
  2d_target_is 2
  for y%=0 to h%-1
    for x%=0 to w%-1
      if (color_pixel_red(1,x%,y%)=0) and (color_pixel_green(1,x%,y%)=0) and (color_pixel_blue(1,x%,y%)=0)
        2d_pen_color 0,0,0
      else
        2d_pen_color 255,255,255
      end_if
      2d_point x%,y%
    next x%
    caption 31,"Wait please... "+str$(int(y%*100/img_h%))+" %"
    display
  next y%
  2d_image_copy 41,0,0,img_w%-1,img_h%-1
  2d_target_is 3
  2d_image_paste 41,0,0
  2d_target_is 2
  show 50 : hide 51 : hide 52 : hide 53 : hide 54 : hide 55 : hide 56 : hide 57 : hide 58 : hide 59
  hide 33 : hide 34 : hide 61 : hide 62 : hide 63 : hide 64
  ntune% = 0
  caption 32,"Tunes: "+str$(ntune%)
  clear 42
  caption 31,""
  return
 
load:
  ' Le nom du fichier doit contenir l'angle de rotation de l'image, sous forme:
  '    xxx(nnn).bmp
  ' Si l'angle est 0 (pas de rotation), la portion "(nnn)" peut ne pas être indiquée.
  s$ = file_name$(20)
  if s$="_" then return
  if lower$(right$(s$,4))<>".bmp" then s$ = s$ + bmp
  if (instr(s$,"_mask.bmp")>0) or (instr(s$,"_tuned.bmp")>0)  or (instr(s$,"_list.txt")>0)
    message "Invalid image file name format"
    return
  end_if
  f$ = s$
  fm$ = left$(f$,len(f$)-4)+"_mask.bmp"
  ft$ = left$(fm$,len(fm$)-4)+"_tuned.bmp"
  fl$ = left$(fm$,len(fm$)-4)+"_tuned_list.txt"
  file_load 1,f$
  if file_exists(fm$)=1
    file_load 2,fm$
    2d_target_is 2
    2d_image_copy 41,0,0,img_w%-1,img_h%-1
    if file_exists(ft$)=1
      file_load 3,ft$
      if file_exists(fl$)=1
        file_load 42,fl$
      else
        clear 42
      end_if
    else
      color 3,255,255,255
      clear 42
    end_if
    show 50
  else
    color 2,255,255,255
    color 3,255,255,255
    clear 42
    hide 50
  end_if
  ntune% = count(42)
  GetAngle(f$)
  2d_target_is 2
  caption 32,"Tunes: "+str$(ntune%)
  caption 0,f$
  hide 51 : hide 52 : hide 53 : hide 54 : hide 55 : hide 56 : hide 57 : hide 58 : hide 59
  hide 33 : hide 34  : hide 61 : hide 62 : hide 63 : hide 64
  return
 
loadm:
  s$ = file_name$(20)
  if s$="_" then return
  if right$(s$,4)<>".bmp" then s$ = s$ + ".bmp"
  if right$(s$,9)<>"_mask.bmp"
    message "Invalid mask file name format"
    return
  end_if
  if file_exists(s$)=0
    message "Masl file not found"
    return
  end_if
  f$ = left$(s$,len(s$)-9) + ".bmp"
  fm$ = s$
  ft$ = left$(fm$,len(s$)-4)+"_tuned.bmp"
  fl$ = left$(fm$,len(s$)-4)+"_tuned_list.txt"
  file_load 2,fm$
  2d_target_is 2
  2d_image_copy 41,0,0,img_w%-1,img_h%-1
  if file_exists(ft$)=1
    file_load 3,ft$
    if file_exists(fl$)=1
      file_load 42,fl$
      ntune% = count(42)
    else
      clear 42
      ntune% = 0
    end_if
  else
    2d_target_is 3
    2d_image_paste 41,0,0
    ntune% = 0
    clear 42
  end_if
  caption 32,"Tunes: "+str$(ntune%)
  2d_target_is 2
  show 50 : hide 51 : hide 52 : hide 53 : hide 54 : hide 55 : hide 56 : hide 57 : hide 58 : hide 59
  hide 33 : hide 34 : hide 61 : hide 62 : hide 63 : hide 64
  return

save:
  if file_exists(f$)=1
    if message_confirmation_yes_no("File does already exist. Replace it ?")<>1 then return
  end_if
  file_save 1,f$
  2d_target_is 2
  2d_image_paste 41,0,0
  file_save 2,fm$
  file_save 3,ft$
  file_save 42,fl$
  s$ =      "image saved into: "+f$+chr$(13)+chr$(10)
  s$ = s$ + "mask saved into: "+fm$+chr$(13)+chr$(10)
  s$ = s$ + "tuned mask saved into: "+ft$+chr$(13)+chr$(10)
  s$ = s$ + "tuned list saved into: "+fl$
  message s$
  caption 0,f$
  return

savem:
  if file_exists(fm$)=1
    if message_confirmation_yes_no("File does already exist. Replace it ?")<>1 then return
  end_if
  file_save 2,fm$
  file_save 3,ft$
  file_save 42,fl$
  s$ =      "mask saved into: "+fm$+chr$(13)+chr$(10)
  s$ = s$ + "tuned mask saved into: "+ft$+chr$(13)+chr$(10)
  s$ = s$ + "tuned list saved into: "+fl$
  message s$
  return
 
savet:
  if file_exists(ft$)=1
    if message_confirmation_yes_no("File does already exist. Replace it ?")<>1 then return
  end_if
  file_save 3,ft$
  file_save 42,fl$
  s$ =      "tuned mask saved into: "+ft$+chr$(13)+chr$(10)
  s$ = s$ + "tuned list saved into: "+fl$
  message s$
  return

rect:
  2d_target_is 2
  2d_image_paste 41,0,0
  toprow%    = int(img_h%/4)
  bottomrow%  = int((img_h%*3)/4)
  leftcol%    = int(img_w%/4)
  rightcol%  = int((img_w%*3)/4)
  2d_pen_color 255,0,0
  2d_fill_off
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  show 51 : show 52 : show 53 : show 54 : show 55 : show 56 : show 57 : show 58 : show 59
  show 33 : show 34 : show 61 : show 62 : show 63 : show 64
  return

enlargeup:
  if toprow%=0 then return
  toprow% = toprow% - 1
  2d_image_paste 41,0,0
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  return
 
moveup:
  if toprow%=0 then return
  toprow% = toprow% - 1
  bottomrow% = bottomrow% - 1
  2d_image_paste 41,0,0
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  return

moveleft:
  if leftcol%=0 then return
  leftcol% = leftcol% - 1
  rightcol% = rightcol% - 1
  2d_image_paste 41,0,0
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  return

enlargeleft:
  if leftcol%=0 then return
  leftcol% = leftcol% - 1
  2d_image_paste 41,0,0
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  return

moveright:
  if rightcol%=(w%-1) then return
  rightcol% = rightcol% + 1
  leftcol% = leftcol% + 1
  2d_image_paste 41,0,0
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  return

reduceright:
  if rightcol%=leftcol% then return
  rightcol% = rightcol% - 1
  2d_image_paste 41,0,0
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  return

reducedown:
  if bottomrow%=toprow% then return
  bottomrow% = bottomrow% - 1
  2d_image_paste 41,0,0
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  return

movedown:
  if bottomrow%=(H%-1) then return
  bottomrow% = bottomrow% + 1
  toprow% = toprow% + 1
  2d_image_paste 41,0,0
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  return

tune:
  if ntune%>=63
    message "Too many tune sections"
    return
  end_if
  ntune% = ntune% + 1
  s$ = trim$(text$(34))
  if s$="" then s$ = "Tune "+str$(ntune%)
  item_add 42,str$(ntune%)+","+str$(leftcol%)+","+str$(toprow%)+","+str$(rightcol%)+","+str$(bottomrow%)+","+s$
  2d_target_is 3
  2d_fill_on
  2d_fill_color 255,255,ntune%*4
  2d_pen_color 255,255,ntune%*4
  2d_rectangle leftcol%,toprow%,rightcol%,bottomrow%
  2d_target_is 2
  2d_pen_color 255,0,0
  2d_fill_off
  caption 32,"Tunes: "+str$(ntune%)
  return

right90:
  RotatePictureRight(1)
  2d_target_is 2
  2d_image_paste 41,0,0
  RotatePictureRight(2)
  2d_image_copy 41,0,0,img_w%-1,img_h%-1
  RotatePictureRight(3)
  RotateTunesRight()
  AdjustAngle(0-90)
  2d_target_is 2
  return

left90:
  RotatePictureLeft(1)
  2d_target_is 2
  2d_image_paste 41,0,0
  RotatePictureLeft(2)
  2d_image_copy 41,0,0,img_w%-1,img_h%-1
  RotatePictureLeft(3)
  RotateTunesLeft()
  AdjustAngle(90)
  2d_target_is 2
  return

flipdown:
  FlipPictureDown(1)
  2d_target_is 2
  2d_image_paste 41,0,0
  FlipPictureDown(2)
  2d_image_copy 41,0,0,img_w%-1,img_h%-1
  FlipPictureDown(3)
  FlipTunesDown()
  2d_target_is 2
  return

flipleft:
  FlipPictureLeft(1)
  2d_target_is 2
  2d_image_paste 41,0,0
  FlipPictureLeft(2)
  2d_image_copy 41,0,0,img_w%-1,img_h%-1
  FlipPictureLeft(3)
  FlipTunesLeft()
  2d_target_is 2
  return

sub AdjustAngle(delta%)
' adapter les noms des fichiers:    f$, fm$, ft$, fl$
  dim_local s$, p1%, p2%, a$, oldangle%
  oldangle% = angle%
  angle% = angle% + delta%
  if angle%<0 then angle% = 270
  if angle%=360 then angle% = 0
  if angle%>0        : ' placer l'angle
    if oldangle%=0  : ' insérer l'angle
    ' nom.bmp ==> nom(xxx).bmp
    ' nom_mask.bmp ==> nom(xxx)_mask.bmp
    ' nom_mask_tuned.bmp ==> nom(xxx)_mask_tuned.bmp
    ' nom_mask_tuned_list.bmp ==> nom(xxx)_mask_tuned_list.bmp
      a$  = "("+str$(angle%)+")"
      p1% = instr(f$,".")
      f$  = left$(f$,p1%-1)+a$+mid$(f$,p1%,len(f$))
      p1% = instr(fm$,"_mask")
      fm$ = left$(fm$,p1%-1)+a$+mid$(fm$,p1%,len(fm$))
      p1% = instr(ft$,"_mask")
      ft$ = left$(ft$,p1%-1)+a$+mid$(ft$,p1%,len(ft$))
      p1% = instr(fl$,"_mask")
      fl$ = left$(fl$,p1%-1)+a$+mid$(fl$,p1%,len(fl$))
    else            : ' remplacer l'angle
      ' nom(xxx).bmp ==> nom(yyy).bmp
      ' nom(xxx)_mask.bmp ==> nom(yyy)_mask.bmp
      ' nom(xxx)_mask_tuned.bmp ==> nom(yyy)_mask_tuned.bmp
      ' nom(xxx)_mask_tuned_list.bmp ==> nom(yyy)_mask_tuned_list.bmp
      a$  = "("+str$(angle%)+")"
      p1% = instr(f$,"(")
      p2% = instr(f$,")")
      f$  = left$(f$,p1%-1)+a$+mid$(f$,p2%+1,len(f$))
      p1% = instr(fm$,"(")
      p2% = instr(fm$,")")
      fm$ = left$(fm$,p1%-1)+a$+mid$(fm$,p2%+1,len(fm$))
      p1% = instr(ft$,"(")
      p2% = instr(ft$,")")
      ft$ = left$(ft$,p1%-1)+a$+mid$(ft$,p2%+1,len(ft$))
      p1% = instr(fl$,"(")
      p2% = instr(fl$,")")
      fl$ = left$(fl$,p1%-1)+a$+mid$(fl$,p2%+1,len(fl$))
    end_if
  else          : ' retirer l'angle
    ' nom(xxx).bmp ==> nom.bmp
    ' nom(xxx)_mask.bmp ==> nom_mask.bmp
    ' nom(xxx)_mask_tuned.bmp ==> nom_mask_tuned.bmp
    ' nom(xxx)_mask_tuned_list.bmp ==> nom_mask_tuned_list.bmp
      p1% = instr(f$,"(")
      p2% = instr(f$,")")
      f$  = left$(f$,p1%-1)+mid$(f$,p2%+1,len(f$))
      p1% = instr(fm$,"(")
      p2% = instr(fm$,")")
      fm$ = left$(fm$,p1%-1)+mid$(fm$,p2%+1,len(fm$))
      p1% = instr(ft$,"(")
      p2% = instr(ft$,")")
      ft$ = left$(ft$,p1%-1)+mid$(ft$,p2%+1,len(ft$))
      p1% = instr(fl$,"(")
      p2% = instr(fl$,")")
      fl$ = left$(fl$,p1%-1)+mid$(fl$,p2%+1,len(fl$))
  end_if
  caption 5,"Angle: "+str$(angle%)+"°"
  caption 0,f$
  s$ = "Nouveaux noms de fichiers:"+chr$(13)+chr$(10)
  message s$+f$+chr$(13)+chr$(10)+fm$+chr$(13)+chr$(10)+ft$+chr$(13)+chr$(10)+fl$+chr$(13)+chr$(10)
end_sub

sub RotatePictureLeft(pic%)
  dim_local w%, h%, l%, c%
  caption 69,"Wait please.."
  h% = height(pic%) : w% = width(pic%)
  width 4,h%  : height 4,w%
  2d_target_is 4
  for l%=0 to h%-1
    for c%=0 to w%-1
      2d_pen_color color_pixel_red(pic%,c%,l%),color_pixel_green(pic%,c%,l%),color_pixel_blue(pic%,c%,l%)
      2d_point l%,w%-c%-1
    next c%
    caption 69,"Wait please... "+str$(int(l%*100/h%))+" %"
    display
  next l%
  width pic%,h% : height pic%,w%
  color pic%,0,0,0
  2d_image_copy 43,0,0,h%-1,w%-1
  2d_target_is pic%
  2d_image_paste 43,0,0
  caption 69,""
end_sub

sub FlipPictureLeft(pic%)
  dim_local w%, h%, l%, c%
  caption 69,"Wait please.."
  h% = height(pic%) : w% = width(pic%)
  width 4,h%  : height 4,w%
  2d_target_is 4
  for l%=0 to h%-1
    for c%=0 to w%-1
      2d_pen_color color_pixel_red(pic%,c%,l%),color_pixel_green(pic%,c%,l%),color_pixel_blue(pic%,c%,l%)
      2d_point w%-c%-1,l%
    next c%
    caption 69,"Wait please... "+str$(int(l%*100/h%))+" %"
    display
  next l%
  width pic%,h% : height pic%,w%
  color pic%,0,0,0
  2d_image_copy 43,0,0,h%-1,w%-1
  2d_target_is pic%
  2d_image_paste 43,0,0
  caption 69,""
end_sub

sub FlipPictureDown(pic%)
  dim_local w%, h%, l%, c%
  caption 69,"Wait please.."
  h% = height(pic%) : w% = width(pic%)
  width 4,h%  : height 4,w%
  2d_target_is 4
  for l%=0 to h%-1
    for c%=0 to w%-1
      2d_pen_color color_pixel_red(pic%,c%,l%),color_pixel_green(pic%,c%,l%),color_pixel_blue(pic%,c%,l%)
      2d_point c%,h%-l%-1
    next c%
    caption 69,"Wait please... "+str$(int(l%*100/h%))+" %"
    display
  next l%
  width pic%,h% : height pic%,w%
  color pic%,0,0,0
  2d_image_copy 43,0,0,h%-1,w%-1
  2d_target_is pic%
  2d_image_paste 43,0,0
  caption 69,""
end_sub

sub RotatePictureRight(pic%)
  dim_local w%, h%, l%, c%
  caption 69,"Wait please.."
  h% = height(pic%) : w% = width(pic%)
  width 4,h%  : height 4,w%
  2d_target_is 4
  for l%=0 to h%-1
    for c%=0 to w%-1
      2d_pen_color color_pixel_red(pic%,c%,l%),color_pixel_green(pic%,c%,l%),color_pixel_blue(pic%,c%,l%)
      2d_point h%-l%-1,c%
    next c%
    caption 69,"Wait please... "+str$(int(l%*100/h%))+" %"
    display
  next l%
  width pic%,h% : height pic%,w%
  color pic%,0,0,0
  2d_image_copy 43,0,0,h%-1,w%-1
  2d_target_is pic%
  2d_image_paste 43,0,0
  caption 69,""
end_sub

sub RotateTunesLeft()
  dim_local t%, t$, n$, p%, nt%, lc%, tr%, rc%, br%, lcx%, trx%, rcx%, brx%
  if count(42)>0
    caption 69,"Tune transposition..."
    display
    for t%=1 to count(42)
      t$ = item_read$(42,t%)
      p% = instr(t$,",")
      nt% = val(left$(t$,p%-1))
      t$ = mid$(t$,p%+1,100)
      p% = instr(t$,",")
      lcx% = val(left$(t$,p%-1))
      t$ = mid$(t$,p%+1,100)
      p% = instr(t$,",")
      trx% = val(left$(t$,p%-1))
      t$ = mid$(t$,p%+1,100)
      p% = instr(t$,",")
      rcx% = val(left$(t$,p%-1))
      t$ = mid$(t$,p%+1,100)
      p% = instr(t$,",")
      brx% = val(left$(t$,p%-1))
      n$ = mid$(t$,p%+1,100)

      lc% = trx%
      tr% = rcx%
      rc% = brx%
      br% = lcx%
     
      item_delete 42,t%
      item_insert 42,t%,str$(nt%)+","+str$(lc%)+","+str$(tr%)+","+str$(rc%)+","+str$(br%)+","+n$
    next t%
    caption 69,""
  end_if
  ' ajuster les coordonnées du rectangle actuel
' message str$(lc%)+","+str$(tr%)+"/"+str$(rc%)+","+str$(br%)+" => "+str$(leftcol%)+","+str$(toprow%)+"/"+str$(rightcol%)+","+str$(bottomrow%)
  lc% = leftcol%
  tr% = toprow%
  rc% = rightcol%
  br% = bottomrow%
  leftcol% = tr%
  toprow% = rc%
  rightcol% = br%
  bottomrow% = lc%
  ' ajuster les variables donnant les dimensions actuelles
  img_w% = width(1)
  img_h% = height(1)
  w% = img_w%
  h% = img_h%
end_sub

sub RotateTunesRight()
  dim_local t%, t$, n$, p%, nt%, lc%, tr%, rc%, br%, lcx%, trx%, rcx%, brx%
  if count(42)>0
    caption 69,"Tune transposition..."
    display
    for t%=1 to count(42)
      t$ = item_read$(42,t%)
      p% = instr(t$,",")
      nt% = val(left$(t$,p%-1))
      t$ = mid$(t$,p%+1,100)
      p% = instr(t$,",")
      lcx% = val(left$(t$,p%-1))
      t$ = mid$(t$,p%+1,100)
      p% = instr(t$,",")
      trx% = val(left$(t$,p%-1))
      t$ = mid$(t$,p%+1,100)
      p% = instr(t$,",")
      rcx% = val(left$(t$,p%-1))
      t$ = mid$(t$,p%+1,100)
      p% = instr(t$,",")
      brx% = val(left$(t$,p%-1))
      n$ = mid$(t$,p%+1,100)

      lc% = w%-brx%-1
      tr% = lcx%
      rc% = w%-trx%-1
      br% = rcx%

      item_delete 42,t%
      item_insert 42,t%,str$(nt%)+","+str$(lc%)+","+str$(tr%)+","+str$(rc%)+","+str$(br%)+","+n$
    next t%
    caption 69,""
  end_if
  ' ajuster les coordonnées du rectangle actuel
  lc% = leftcol%
  tr% = toprow%
  rc% = rightcol%
  br% = bottomrow%
  leftcol% = w%-br%-1
  toprow% = lc%
  rightcol% = w%-tr%-1
  bottomrow% = rc%
  ' ajuster les variables donnant les dimensions actuelles
  img_w% = width(1)
  img_h% = height(1)
  w% = img_w%
  h% = img_h%
end_sub

sub FlipTunesLeft()
  dim_local t%, t$, n$, p%, nt%, lc%, tr%, rc%, br%, lcx%, trx%, rcx%, brx%
  if count(42)>0
    caption 69,"Tune transposition..."
    display
    for t%=1 to count(42)
      t$ = item_read$(42,t%)
      p% = instr(t$,",")
      nt% = val(left$(t$,p%-1))
      t$ = mid$(t$,p%+1,100)
      p% = instr(t$,",")
      lcx% = val(left$(t$,p%-1))
      t$ = mid$(t$,p%+1,100)
      p% = instr(t$,",")
      trx% = val(left$(t$,p%-1))
      t$ = mid$(t$,p%+1,100)
      p% = instr(t$,",")
      rcx% = val(left$(t$,p%-1))
      t$ = mid$(t$,p%+1,100)
      p% = instr(t$,",")
      brx% = val(left$(t$,p%-1))
      n$ = mid$(t$,p%+1,100)

      lc% = w%-rcx%-1
      tr% = trx%
      rc% = w%-lcx%-1
      br% = brx%

      item_delete 42,t%
      item_insert 42,t%,str$(nt%)+","+str$(lc%)+","+str$(tr%)+","+str$(rc%)+","+str$(br%)+","+n$
    next t%
    caption 69,""
  end_if
  ' ajuster les coordonnées du rectangle actuel
' message str$(lc%)+","+str$(tr%)+"/"+str$(rc%)+","+str$(br%)+" => "+str$(leftcol%)+","+str$(toprow%)+"/"+str$(rightcol%)+","+str$(bottomrow%)
  lc% = w%-rightcol%-1
  tr% = toprow%
  rc% = w%-leftcol%-1
  br% = bottomrow%
  leftcol% = lc%
  toprow% = tr%
  rightcol% = rc%
  bottomrow% = br%
end_sub

sub FlipTunesDown()
  dim_local t%, t$, n$, p%, nt%, lc%, tr%, rc%, br%, lcx%, trx%, rcx%, brx%
  if count(42)>0
    caption 69,"Tune transposition..."
    display
    for t%=1 to count(42)
      t$ = item_read$(42,t%)
      p% = instr(t$,",")
      nt% = val(left$(t$,p%-1))
      t$ = mid$(t$,p%+1,100)
      p% = instr(t$,",")
      lcx% = val(left$(t$,p%-1))
      t$ = mid$(t$,p%+1,100)
      p% = instr(t$,",")
      trx% = val(left$(t$,p%-1))
      t$ = mid$(t$,p%+1,100)
      p% = instr(t$,",")
      rcx% = val(left$(t$,p%-1))
      t$ = mid$(t$,p%+1,100)
      p% = instr(t$,",")
      brx% = val(left$(t$,p%-1))
      n$ = mid$(t$,p%+1,100)

      lc% = lcx%
      tr% = h%-brx%-1
      rc% = rcx%
      br% = h%-trx%-1

      item_delete 42,t%
      item_insert 42,t%,str$(nt%)+","+str$(lc%)+","+str$(tr%)+","+str$(rc%)+","+str$(br%)+","+n$
    next t%
    caption 69,""
  end_if
  ' ajuster les coordonnées du rectangle actuel
' message str$(lc%)+","+str$(tr%)+"/"+str$(rc%)+","+str$(br%)+" => "+str$(leftcol%)+","+str$(toprow%)+"/"+str$(rightcol%)+","+str$(bottomrow%)
  lc% = leftcol%
  tr% = h%-bottomrow%-1
  rc% = rightcol%
  br% = h%-toprow%-1
  leftcol% = lc%
  toprow% = tr%
  rightcol% = rc%
  bottomrow% = br%
end_sub
 
sub GetAngle(f$)
  dim_local p1%, p2%
  angle% = 0
  p1% = instr(f$,"(")
  if p1%>0
    p2% = instr(f$,")")
    if p2%>p1%
      angle%=val(mid$(f$,p1%+1,p2%-p1%-1))
    end_if
  end_if
  caption 5,"Angle: "+str$(angle%)+"°"
end_sub
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
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 1 sur 4Aller à la page : 1, 2, 3, 4  Suivant
 Sujets similaires
-
» Construire un chargeur d'accus pour FR3b
» Les sprites
» DIY Gamer Kit, une Gameboy à construire soi-même pour Noël
» code pour inséré les anime (Fond transparent)
» Plugins Firefox pour sécuriser votre navigateur.

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