Forum Liberty Basic France
• Index
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 :
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.
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 occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc
Just BASIC v2.0 :
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.
"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
Roro
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 :
par (utiliser_segments_002.bas)
Code VB :
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 :
Les trois exemples :
/upload/utiliser_segments.zip
Edité par Christophe Le 27/12/2020 à 12h31

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 occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc
Just BASIC v2.0 :
Citation:
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.
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
Roro
• Index
1 Utilisateur en ligne : 0 Administrateur, 0 Modérateur, 0 Membre et 1 Visiteur
Utilisateur en ligne : Aucun membre connecté
Utilisateur en ligne : Aucun membre connecté
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie