Forum Liberty Basic France

Débutant » Utiliser les segments Tentative d'y voir un peu plus clair ;)
Le 27/12/2020 à 00h29

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 741
Hello !

J'ouvre cette discussion pour mieux comprendre ce qu'on peut faire avec des segments. Dans le programme qui suit, je n'ai utilisé que "flush" et "redraw".

un clic gauche dans la matrice pour y faire apparaitre un carré jaune, un clic droit pour un carré noir.

Si "clic" est à 1, ça voudra dire qu'on a ajouté un carré noir ou jaune dans la matrice.

Si on clique sur "brouille" et que "clic" est à 1, alors on sauvegarde l'état graphique actuel en faisant un "flush", et on barbouille un peu n'importe quoi par dessus. Quand on clique sur "nettoie" on réaffiche l'état graphique sauvegardé avec le "flush" en faisant un "redraw" : la matrice est réaffichée.
Code VB :
'flush et redraw

'définir les couleurs
fond$="darkgray"
allume$="yellow"
eteint$="black"
 
'définir matrice
ncl=10  'nombre de cases dans la ligne
nch=10  '       "        "    la colonne
cot=25  'taille de la case à l'écran, en pixels
pas=cot+1'pour laisser un pixel entre chaque case
xmat=50 'angle supérieur gauche de la matrice
ymat=50
zdxmin=xmat 'zone occupée par le dessin de la matrice
zdxmax=xmat+ncl*pas
zdymin=ymat
zdymax=ymat+nch*pas
 
'définir la fenetre
fenl=800
fenh=600
WindowWidth  = fenl
WindowHeight = fenh
UpperLeftX   = (DisplayWidth-WindowWidth)/2
UpperLeftY   = (DisplayHeight-WindowHeight)/2
 
gblarg=780-20
gbhaut=fenh-200
graphicbox #w.g, 10,10,gblarg,gbhaut
button #w.cb, "brouille", [brouille], UL, fenl-450,fenh-100,100,25
button #w.cn, "nettoie", [nettoie], UL, fenl-300,fenh-100,100,25
button #w.cq, "Quitter", [quit], UL, fenl-150,fenh-100,100,25
 
'ouvrir la fenetre
open "Utiliser des segments ?" for graphics_nf_nsb as #w
 
    'dessine fond
    #w.g, "down"
    #w.g, "color ";fond$
    #w.g, "backcolor ";fond$
    #w.g, "place 0 0 ; boxfilled ";gblarg;" ";gbhaut
 
    'dessine matrice
    for col=0 to ncl-1
        for lig=0 to nch-1
            xm=xmat+col*pas
            ym=ymat+lig*pas
            #w.g, "color ";eteint$
            #w.g, "backcolor ";eteint$
            #w.g, "place ";xm;" ";ym
            #w.g, "boxfilled ";xm+cot;" ";ym+cot
         next
    next
 
    'gère les évènement utilisateur
    #w, "trapclose [quit]"
    #w.g, "when leftButtonDown [clic_gauche]"
    #w.g, "when rightButtonDown [clic_droit]"
 
    'attend...
    wait
 
[quit]
    close #w
    end
 
[clic_gauche]
clic=1
    xg=MouseX
    yg=MouseY
    if xg>zdxmin and xg<zdxmax and yg>zdymin and yg<zdymax then
        mcx=int((xg-xmat)/pas) 'numéro de case sur x
        mcy=int((yg-ymat)/pas) 'numéro de case sur y

        xs=xmat+mcx*pas
        ys=ymat+mcy*pas
 
        #w.g, "color ";allume$
        #w.g, "backcolor ";allume$
        #w.g, "place ";xs;" ";ys
        #w.g, "boxfilled ";xs+cot;" ";ys+cot
    end if
    wait
 
[clic_droit]
clic=1
    xd=MouseX
    yd=MouseY
    if xg>zdxmin and xg<zdxmax and yg>zdymin and yg<zdymax then
        mcx=int((xd-xmat)/pas) 'numéro de case sur x
        mcy=int((yd-ymat)/pas) 'numéro de case sur y

        'on redessine la case vide
        xs=xmat+mcx*pas
        ys=ymat+mcy*pas
        #w.g, "color ";eteint$
        #w.g, "backcolor ";eteint$
        #w.g, "place ";xs;" ";ys
        #w.g, "boxfilled ";xs+cot;" ";ys+cot
    end if
    wait
 
[brouille]
    'on sauvegarde l'actuel état graphique
    if clic=1 then
        #w.g, "flush sauvegraphe"
        clic=0
    end if
 
    'on barbouille par dessus
    for f=1 to 30   'nombre d'objets dessinés
        'coordonnées
        x1=int(rnd(1)*gblarg)
        y1=int(rnd(1)*gbhaut)
        x2=int(rnd(1)*gblarg)
        y2=int(rnd(1)*gbhaut)
 
        'couleur
        r=int(rnd(1)*255)
        v=int(rnd(1)*255)
        b=int(rnd(1)*255)
        #w.g, "color ";r;" ";v;" ";b
        #w.g, "backcolor ";r;" ";v;" ";b
 
        'forme dessinée
        forme=int(rnd(1)*3)
        select case forme
            case 0
                'rectangle
                #w.g, "place ";x1;" ";y1
                #w.g, "boxfilled ";x2;" ";y2
 
            case 1
                'ellipse
                #w.g, "place ";x1;" ";y1
                #w.g, "ellipsefilled ";x2;" ";y2
 
            case 2
                'triangle
                #w.g, "size 10"
                #w.g, "place ";x1;" ";y1
                d=x2-x1
                for a=1 to 3
                    #w.g, "turn ";120;" ; go ";d
                next
                #w.g, "size 1"
 
            case 3
        end select
    next
    wait
 
[nettoie]
    clic=0
    #w.g, "redraw sauvegraphe"
    wait
 

Seul problème pour l'instant : quand on fait un "flush", la partie sauvegardée est seulement ce qui a été dessiné depuis le "flush" précédent : le but est de réafficher la matrice dans l'état où elle était avant le barbouillage, puis d'y ajouter des carrés jaunes ou noirs, et de sauvegarder l'ensemble au flush suivant.
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia7+ Wine (Pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 27/12/2020 à 01h35

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2484
D'après moi, les segments ne servent qu'à mettre un graphisme particulier en mémoire pour pouvoir le rappeler à l'écran.
"Delsegment" supprime de la mémoire mais pas de l'écran.
Pour faire un zip, tu met le code et ses dépendances (bmp, dossiers de bmp, fichiers divers...) dans un dossier et tu compresse le dossier, rien de plus.
____________________
Roro

   
Le 27/12/2020 à 12h26

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 741
Je m'attendais à ce que tu tiques sur le non-zip ;) : il est plus simple de faire défiler la fenêtre sur le forum que de se lancer dans la procédure de téléchargement/dézippage, et des fois, on veut juste "voir". J'admets bien volontiers que le listing étant un peu long, le zip était effectivement une bonne option.

En bas de ce post on trouvera un zip reprenant le listing, ainsi que deux autres version décrites ci-dessous.

Dans la première version, on a appris qu'on peut utiliser "flush" sans créer explicitement de segments, et que "flush" prend en compte les opérations de dessin (et pas les dessins eux-mêmes), depuis le dernier "flush" utilisé.

Donc dans le précédent programme (utiliser_segments_001.bas), si je voulais sauvegarder la matrice avec les derniers carrés créés, il fallait compléter
Code VB :
 
[brouille]
    'on sauvegarde l'actuel état graphique
    if clic=1 then
        #w.g, "flush sauvegraphe"
        clic=0
    end if
 


par (utiliser_segments_002.bas)
Code VB :
 
[brouille]
    'on sauvegarde l'actuel état graphique
    if clic=1 then
        #w.g, "getbmp fond ";xmat;" ";ymat;" ";ncl*pas;" ";nch*pas
        #w.g, "drawbmp fond ";xmat;" ";ymat
        unloadbmp "fond"
        #w.g, "flush sauvegraphe"
        clic=0
    end if
 

Et là, le dessin de la matrice est bien pris en compte, puisqu'en opération de dessin on a ajouté un bitmap nommé "fond" reprenant l'image de la matrice. Décharger aussitôt le bitmap après l'avoir dessiné permet de constater que le dessin à l'écran est un trace laissée par le bitmap, et n'est pas le bitmap, puisqu'il est supprimé par unloadbmp avant qu'on fasse le "flush".

Après plusieurs manips "brouille-nettoie" et clics dans la matrice, seule la matrice revient, le fond garde les excentricités graphiques. Si on voulait aussi réafficher le fond d'origine du graphicbox, on aurait utilisé (utiliser_segments_003.bas) :
Code VB :
 
        #w.g, "getbmp fond 0 0 ";gblarg;" ";gbhaut
        #w.g, "drawbmp fond 0 0"
 


Les trois exemples :
/upload/utiliser_segments.zip



Edité par Christophe Le 27/12/2020 à 12h31
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia7+ Wine (Pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 27/12/2020 à 12h48

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2484
Citation:
Je m'attendais à ce que tu tiques sur le non-zip

Erreur votre honneur, oh tang pour moi; cette phrase était destinée à Castel.

Cet inattendu: "flush sauvegraphe" (d'où sors-tu cette instruction ?) correspondrait en fait à un "segment général".

EDIT: Hey, je viens de tester: "flush sauvesaucissonpurporc"; ça marche aussi.
____________________
Roro

   
Débutant » Utiliser les segments Tentative d'y voir un peu plus clair ;)  

 |  |

1 Utilisateur en ligne : 0 Administrateur, 0 Modérateur, 0 Membre et 1 Visiteur
Utilisateur en ligne : Aucun membre connecté
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie