Forum Liberty Basic France
• Index
Bonjour du soir, les programmeurs fous !
Je travaille un peu sur les sprites, et je m'aperçois que j'avais pas compris une chose fondamentale : il semblerait qu'un sprite reste affiché seulement si on le redessine continuellement, en plaçant judicieusement l'instruction "drawsprites" pour qu'elle soit exécutée souvent, ou en l'appelant à intervalles réguliers avec TIMER.
Vous confirmez, ou je suis à côté de la plaque ?
Je travaille un peu sur les sprites, et je m'aperçois que j'avais pas compris une chose fondamentale : il semblerait qu'un sprite reste affiché seulement si on le redessine continuellement, en plaçant judicieusement l'instruction "drawsprites" pour qu'elle soit exécutée souvent, ou en l'appelant à intervalles réguliers avec TIMER.
Vous confirmez, ou je suis à côté de la plaque ?
____________________
Just BASIC v2.0 :
utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc
Just BASIC v2.0 :
Hello Christophe,
Désolé, je n’ai pas encore tâté du spirite.
A+
Désolé, je n’ai pas encore tâté du spirite.
A+
____________________
Castel
Castel
Tout à fait, chaque fois que le sprite bouge-->drawsprites (en général dans une boucle).
Perso, je ne maîtrise pas bien le cyclesprite; spritecollide ça peut aller.
Je fais des tentatives de décomposition du mouvement à partir de vidéos et en testant en gifs animés; c'est pas évident.
Perso, je ne maîtrise pas bien le cyclesprite; spritecollide ça peut aller.
Je fais des tentatives de décomposition du mouvement à partir de vidéos et en testant en gifs animés; c'est pas évident.
____________________
Roro
Roro
Hello !
On avance dans le déchiffrage : si j'en crois le petit programme ci-dessous, le sprite reste affiché tant qu'on n'arrive pas sur l'instruction "wait", ce n'est pas une question d'appel permanent à "drawsprites" pour le maintenir à l'écran.
Question subsidiaire : je devrais obtenir un sprite carré avec un rond rouge à l'intérieur, et j'obtiens un sprite rectangulaire avec deux points rouges, et je n'arrive pas à voir quel est le problème. A quoi ressemble le sprite quand vous lancez le programme ?
Code VB :
On avance dans le déchiffrage : si j'en crois le petit programme ci-dessous, le sprite reste affiché tant qu'on n'arrive pas sur l'instruction "wait", ce n'est pas une question d'appel permanent à "drawsprites" pour le maintenir à l'écran.
Question subsidiaire : je devrais obtenir un sprite carré avec un rond rouge à l'intérieur, et j'obtiens un sprite rectangulaire avec deux points rouges, et je n'arrive pas à voir quel est le problème. A quoi ressemble le sprite quand vous lancez le programme ?
Code VB :
'on va crééer le sprite (ça évitera de devoir télécharger 'un bitmap sur le forum) WindowHeight = 200 WindowWidth = 200 graphicbox #x.s, 0, 0, 200, 200 open "capture sprite" for window_nf as #x print #x.s, "down" print #x.s, "fill yellow" 'graphicbox peinte en jaune print #x.s, "size 4" 'taille du crayon print #x.s, "color red" 'couleur du crayon en rouge print #x.s, "place 100 100" 'centre du cercle print #x.s, "circle 30" 'dessin du cercle avec le crayon print #x.s, "getbmp lebitmap 70 70 60 60" 'transforme en bitmap la zone commençant 'en x=70, y=70, de largeur 60 et de hauteur 60 pixels close #x 'puis on affiche et on fait se déplacer le sprite WindowHeight = 300 WindowWidth = 400 graphicbox #w.g, 0, 0, 400, 300 open "affiche sprite" for window_nf as #w 'on affecte le bitmap au sprite nommé lesprite print #w.g, "addsprite lesprite lebitmap"; 'on place le sprite à l'écran, et on le déplace for x = 1 to 100 print #w.g, "spritexy lesprite "; x; " "; x print #w.g, "drawsprites"; for a=1 to 5000:next 'temporisation pour avoir le temps de voir next x 'on demande au programme de faire autre chose en attendant : le sprite ne disparaît pas for a=1 to 5000:print a:next 'on remet le sprite en mouvement, tout se passe comme attendu for x = 100 to 200 print #w.g, "spritexy lesprite "; x; " "; x print #w.g, "drawsprites"; for a=1 to 5000:next next x wait 'le sprite disparait [fin] unloadbmp "lebitmap" close #w end
____________________
Just BASIC v2.0 :
utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc
Just BASIC v2.0 :
normal tu duplique le sprite par sysmétrie.
Ton get bmp met 70 70 30 60 ( soit la moitié du sprite dessiné) et tu aura lesprite en un seul exemplaire
Ton get bmp met 70 70 30 60 ( soit la moitié du sprite dessiné) et tu aura lesprite en un seul exemplaire

Oki, j'avais oublié qu'il y avait un masque aux mêmes dimensions, donc le bitmap d'un sprite est deux fois plus haut que le sprite affiché.
Et en plus j'avais confondu le rayon et le diamètre du cercle, ça pouvait pas marcher...
C'est mieux ainsi (je ne modifie pas le premier exemple, mais je place le programme modifié ci-dessous. J'ai encore un petit souci d'ajustement "au pixel près" mais le principe fonctionne. J'ai également réduit la temporisation pendant laquelle le sprite ne bouge pas. Voilà :
Code VB :
Merci du coup de main
(édité pour ajout de la ligne print #w, "trapclose [fin]"; pour quitter proprement le programme, et corriger le rayon que j'avais écrit "diamètre" (c'est pas tout à fait pareil))
Edité par Christophe Le 18/12/2019 à 16h57
Et en plus j'avais confondu le rayon et le diamètre du cercle, ça pouvait pas marcher...
C'est mieux ainsi (je ne modifie pas le premier exemple, mais je place le programme modifié ci-dessous. J'ai encore un petit souci d'ajustement "au pixel près" mais le principe fonctionne. J'ai également réduit la temporisation pendant laquelle le sprite ne bouge pas. Voilà :
Code VB :
'on va crééer le sprite (ça évitera de devoir télécharger 'un bitmap sur le forum) WindowHeight = 300 WindowWidth = 300 graphicbox #x.s, 0, 0, 300, 300 open "capture sprite" for window_nf as #x print #x.s, "down" print #x.s, "fill yellow" 'graphicbox peinte en jaune 'dessin du masque : le noir sera la partie visible du sprite, le reste est en blanc 'je pars sur un sprite carré, le bitmap correspondant sera rectangulaire ' puisque un sprite est constitué du sprite et de son masque 'fond blanc print #x.s, "size 1" 'taille du crayon print #x.s, "color white" 'couleur de ligne print #x.s, "backcolor white" 'couleur de remplissage print #x.s, "place 85 85" 'point haut gauche du carré print #x.s, "boxfilled 115 115" 'dessin du carré et remplissage en blanc 'masque print #x.s, "size 3" 'taille du crayon print #x.s, "color black" 'couleur du crayon en noir print #x.s, "place 100 100" 'centre du cercle print #x.s, "circle 13" 'dessin du cercle de rayon 13 pixels 'dessin du sprite, en dessous du masque 'fond noir print #x.s, "size 1" print #x.s, "backcolor black" print #x.s, "color black" print #x.s, "place 85 115" print #x.s, "boxfilled 115 146" 'partie visible du sprite print #x.s, "size 3" print #x.s, "color red" print #x.s, "place 100 129" print #x.s, "circle 13" print #x.s, "getbmp lebitmap 85 85 30 59" 'transforme en bitmap la zone commençant 'en x=70, y=70, de largeur 30 et de hauteur 60 pixels close #x 'puis on affiche et on fait se déplacer le sprite WindowHeight = 300 WindowWidth = 400 graphicbox #w.g, 0, 0, 400, 300 open "affiche sprite" for window_nf as #w print #w, "trapclose [fin]"; 'on affecte le bitmap au sprite nommé lesprite print #w.g, "addsprite lesprite lebitmap"; 'on place le sprite à l'écran, et on le déplace for x = 1 to 100 print #w.g, "spritexy lesprite "; x; " "; x print #w.g, "drawsprites"; for a=1 to 5000:next 'temporisation pour avoir le temps de voir next x 'on demande au programme de faire autre chose en attendant : le sprite ne disparaît pas for a=1 to 1000:print a:next 'on remet le sprite en mouvement, tout se passe comme attendu for x = 100 to 200 print #w.g, "spritexy lesprite "; x; " "; x print #w.g, "drawsprites"; for a=1 to 5000:next next x wait 'le sprite disparait [fin] unloadbmp "lebitmap" close #w end
Merci du coup de main
(édité pour ajout de la ligne print #w, "trapclose [fin]"; pour quitter proprement le programme, et corriger le rayon que j'avais écrit "diamètre" (c'est pas tout à fait pareil))
Edité par Christophe Le 18/12/2019 à 16h57
____________________
Just BASIC v2.0 :
utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc
Just BASIC v2.0 :
J'ai un peu modifié, ça sort bizarre.
Code VB :
Code VB :
nomainwin WindowWidth = 400: WindowHeight = 300 graphicbox #w.g, 5, 5, 385, 260 open "affiche sprite" for window_nf as #w #w, "trapclose [fin]" #w.g, "down;fill darkgreen;color yellow;backcolor yellow" #w.g, "place 100 100": #w.g, "boxfilled 150 150" #w.g, "color red;backcolor red" #w.g, "place 100 100": #w.g, "circlefilled 20" #w.g, "getbmp lebitmap 70 70 60 60" #w.g, "addsprite lesprite lebitmap"; for x = 1 to 200 scan #w.g, "spritexy lesprite "; x; " "; x #w.g, "drawsprites"; for a=1 to 3000: scan: next 'temporisation pour avoir le temps de voir next x wait 'le sprite ne disparait pas [fin] unloadbmp "lebitmap" close #w end
____________________
Roro
Roro
Bizarre, bizarre ? ça dépend de ce qu'on a fumé, mais c'est un joli sprite 
Je reprend le mien pour la suite des essais : lire un bouton quand la routine de déplacement du sprite est en cours, et pour cela il faut mettre le "scan" dans la routine. Voici le programme :
Code VB :
Il y a une variable "securite", ce n'est pas pour faire flipper, mais juste pour sortir automatiquement de la boucle si la méthode prévue (le clic sur un bouton) ne marchait pas, ce qui se produit si on ne met pas "scan" dans la boucle.
"scan" a bien un role dans l'affichage permanent du sprite, mais ce qui me chiffone est qu'il n'est pas prévu pour ça (je n'ai rien vu dans l'aide concernant cette utilisation, ou je suis passé à côté), et il ralentit l'exécution du programme. Pas moyen d'avoir un sprite qui reste à l'écran jusqu'à ce qu'on l'y retire volontairement ?
Jouer avec les sprites demande une certaine habitude

Je reprend le mien pour la suite des essais : lire un bouton quand la routine de déplacement du sprite est en cours, et pour cela il faut mettre le "scan" dans la routine. Voici le programme :
Code VB :
nomainwin 'on va crééer le sprite (ça évitera de devoir télécharger 'un bitmap sur le forum) WindowHeight = 300 WindowWidth = 300 graphicbox #x.s, 0, 0, 300, 300 open "capture sprite" for window_nf as #x print #x.s, "down" print #x.s, "fill yellow" 'graphicbox peinte en jaune 'dessin du masque : le noir sera la partie visible du sprite, le reste est en blanc 'je pars sur un sprite carré, le bitmap correspondant sera rectangulaire ' puisque un sprite est constitué du sprite et de son masque 'fond blanc print #x.s, "size 1" 'taille du crayon print #x.s, "color white" 'couleur de ligne print #x.s, "backcolor white" 'couleur de remplissage print #x.s, "place 85 85" 'point haut gauche du carré print #x.s, "boxfilled 115 115" 'dessin du carré et remplissage en blanc 'masque print #x.s, "size 3" 'taille du crayon print #x.s, "color black" 'couleur du crayon en noir print #x.s, "place 100 100" 'centre du cercle print #x.s, "circle 13" 'dessin du cercle de rayon 13 pixels 'dessin du sprite, en dessous du masque 'fond noir print #x.s, "size 1" print #x.s, "backcolor black" print #x.s, "color black" print #x.s, "place 85 115" print #x.s, "boxfilled 115 146" 'partie visible du sprite print #x.s, "size 3" print #x.s, "color red" print #x.s, "place 100 129" print #x.s, "circle 13" print #x.s, "getbmp lebitmap 85 85 30 60" 'transforme en bitmap la zone commençant 'en x=70, y=70, de largeur 30 et de hauteur 60 pixels close #x 'on va maintenant afficher puis faire se déplacer le sprite 'on prépare la fenêtre WindowHeight = 420 WindowWidth = 400 xbg=0:xbd=400 'x bord gauche et x bord droit du graphicbox ybh=0:ybb=350 'y bord haut et y bord bas graphicbox #w.g, xbg, ybh, xbd, ybb 'direction et coordonnées initiales du sprite if rnd(1)<0.5 then signx=-1 else signx=1 if rnd(1)<0.5 then signy=-1 else signy=1 xs=185 ys=185 pasx=1 pasy=1 'bouton pour arrêter la course folle du sprite button #w.btn, "Stop", [stopper], ul, WindowWidth/2-50, WindowHeight-60, 100, 20 'on ouvre la fenêtre open "affiche sprite" for window_nf as #w print #w, "trapclose [fin]"; 'on affecte le bitmap au sprite nommé lesprite print #w.g, "addsprite lesprite lebitmap"; ' et maintenant on le laisse courir ' jusqu'à ce que le bouton "stop" l'arrête arret=0 securite=0 while arret=0 'on place le sprite à l'écran, print #w.g, "spritexy lesprite ";xs;" ";ys print #w.g, "drawsprites"; 'si on met en commentaire l'instruction "scan", le sprite disparait lorsqu'on sort 'du while/wend, si on la décommente, le sprite reste affiché scan for a=1 to 500:next 'temporisation pour avoir le temps de voir 'on calcule les nouvelles coordonnées xs=xs+pasx*signx ys=ys+pasy*signy if xs+30>xbd then signx=signx*-1:xs=xs+pasx*signx 'franchit bord droit if xs<xbg then signx=signx*-1:xs=xs+pasx*signx 'franchit bord gauche if ys+30>ybb then signy=signy*-1:ys=ys+pasy*signy 'franchit bord bas if ys<ybh then signy=signy*-1:ys=ys+pasy*signy 'franchit bord haut securite=securite+1 if securite>10000 then arret=1 wend wait [fin] unloadbmp "lebitmap" close #w end [stopper] arret=1 wait
Il y a une variable "securite", ce n'est pas pour faire flipper, mais juste pour sortir automatiquement de la boucle si la méthode prévue (le clic sur un bouton) ne marchait pas, ce qui se produit si on ne met pas "scan" dans la boucle.
"scan" a bien un role dans l'affichage permanent du sprite, mais ce qui me chiffone est qu'il n'est pas prévu pour ça (je n'ai rien vu dans l'aide concernant cette utilisation, ou je suis passé à côté), et il ralentit l'exécution du programme. Pas moyen d'avoir un sprite qui reste à l'écran jusqu'à ce qu'on l'y retire volontairement ?
Jouer avec les sprites demande une certaine habitude
____________________
Just BASIC v2.0 :
utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc
Just BASIC v2.0 :
Hum hum...Il me semble que les sprites ne vivent que sur les "background" (qui demandent le "drawsprites"); le: "fill yellow" n'est pas pris en compte tant qu'il n'est pas désigné comme "background" (avec un "getbmp"). Là ça marche parce que le fond est blanc (pas de fond); en fait tout se passe comme si tu déplaçais un bmp (et non un sprite).
C'est le masque du sprite qui reconstitue le background après son passage.
Pour arrêter une boucle avec un bouton , il faut mettre un timer (1 seconde suffit) passer par le timer (ou pas ?), mettre un bouton "stop" qui met une variable à 1, et lire la variable dans la boucle "if 1 then wait" (ou then exit for)
Sinon, c'est avec le "scan" qui scanne les périphériques à chaque tour de prog
EDIT: Un truc fait à l'arrache--->: sprite.zip
C'est le masque du sprite qui reconstitue le background après son passage.
Pour arrêter une boucle avec un bouton , il faut mettre un timer (1 seconde suffit) passer par le timer (ou pas ?), mettre un bouton "stop" qui met une variable à 1, et lire la variable dans la boucle "if 1 then wait" (ou then exit for)
Sinon, c'est avec le "scan" qui scanne les périphériques à chaque tour de prog
EDIT: Un truc fait à l'arrache--->: sprite.zip
____________________
Roro
Roro
Ton anim est sympa et le décor va bien
J'ai repris ta circuiterie de pause
Le jaune du graphicbox était juste pour être certain que le bitmap du sprite était bien découpé au bon endroit (la présence de jaune dans le bitmap aurait attesté du contraire)
J'ai intégré le jaune en fond avec un "getbmp lefond 0 0 300 350" puis dans la bonne fenêtre, "background lefond". Est-tu sûr qu'il faut un fond pour faire évoluer un sprite ? Parce que, même si tu me dis que je baladais un bitmap, il avait bien le nom du sprite.
Retirer le "scan" m'a permis de voir que le sprite ET le fond disparaissent quand l'animation est terminée, donc quand on arrive sur "wait"
J'ai remplacé "scan" par ta temporisation, et ça marche. Même avec une tempo de 1 ms, le sprite est lent, mais je m'en préoccuperai lorsque j'aurais compris "à coup sûr" l'utilisation des sprites.
Nouvelle mouture, pour les curieux. J'ai ajouté un bouton "quitter" et un bouton "reprendre". J'aurais aimé pouvoir utiliser un seul bouton qui aurait fait la bascule "Stopper/Reprendre" mais je n'y suis pas parvenu et c'est pas le but, de toute manière.
J'ai également désactivé la sécurité puisqu'il ne devrait pas y avoir de bug, mais il suffit de la dé-commenter si on veut travailler sans filet sur le programme.
Voili
Code VB :
et un bonjour en guise de clin d'euil à Castel, à qui je n'ai pas encore répondu.

Le jaune du graphicbox était juste pour être certain que le bitmap du sprite était bien découpé au bon endroit (la présence de jaune dans le bitmap aurait attesté du contraire)
J'ai intégré le jaune en fond avec un "getbmp lefond 0 0 300 350" puis dans la bonne fenêtre, "background lefond". Est-tu sûr qu'il faut un fond pour faire évoluer un sprite ? Parce que, même si tu me dis que je baladais un bitmap, il avait bien le nom du sprite.
Retirer le "scan" m'a permis de voir que le sprite ET le fond disparaissent quand l'animation est terminée, donc quand on arrive sur "wait"
J'ai remplacé "scan" par ta temporisation, et ça marche. Même avec une tempo de 1 ms, le sprite est lent, mais je m'en préoccuperai lorsque j'aurais compris "à coup sûr" l'utilisation des sprites.
Nouvelle mouture, pour les curieux. J'ai ajouté un bouton "quitter" et un bouton "reprendre". J'aurais aimé pouvoir utiliser un seul bouton qui aurait fait la bascule "Stopper/Reprendre" mais je n'y suis pas parvenu et c'est pas le but, de toute manière.
J'ai également désactivé la sécurité puisqu'il ne devrait pas y avoir de bug, mais il suffit de la dé-commenter si on veut travailler sans filet sur le programme.
Voili
Code VB :
'nomainwin 'on va crééer le sprite (ça évitera de devoir télécharger 'un bitmap sur le forum) WindowHeight = 420 WindowWidth = 400 graphicbox #x.s, 0, 0, 300, 350 open "capture sprite" for window_nf as #x print #x.s, "down" print #x.s, "fill yellow" 'graphicbox peinte en jaune print #x.s, "getbmp lefond 0 0 300 300" 'dessin du masque : le noir sera la partie visible du sprite, le reste est en blanc 'je pars sur un sprite carré, le bitmap correspondant sera rectangulaire ' puisque un sprite est constitué du sprite et de son masque 'fond blanc print #x.s, "size 1" 'taille du crayon print #x.s, "color white" 'couleur de ligne print #x.s, "backcolor white" 'couleur de remplissage print #x.s, "place 85 85" 'point haut gauche du carré print #x.s, "boxfilled 115 115" 'dessin du carré et remplissage en blanc 'masque print #x.s, "size 3" 'taille du crayon print #x.s, "color black" 'couleur du crayon en noir print #x.s, "place 100 100" 'centre du cercle print #x.s, "circle 13" 'dessin du cercle de rayon 13 pixels 'dessin du sprite, en dessous du masque 'fond noir print #x.s, "size 1" print #x.s, "backcolor black" print #x.s, "color black" print #x.s, "place 85 115" print #x.s, "boxfilled 115 146" 'partie visible du sprite print #x.s, "size 3" print #x.s, "color red" print #x.s, "place 100 129" print #x.s, "circle 13" print #x.s, "getbmp lebitmap 85 85 30 60" 'transforme en bitmap la zone commençant 'en x=70, y=70, de largeur 30 et de hauteur 60 pixels close #x 'on va maintenant afficher puis faire se déplacer le sprite 'on prépare la fenêtre WindowHeight = 420 WindowWidth = 405 xbg=0:xbd=400 'x bord gauche et x bord droit du graphicbox ybh=0:ybb=350 'y bord haut et y bord bas graphicbox #w.g, xbg, ybh, xbd, ybb 'direction et coordonnées initiales du sprite if rnd(1)<0.5 then signx=-1 else signx=1 if rnd(1)<0.5 then signy=-1 else signy=1 xs=185 ys=185 pasx=1 pasy=1 'bouton pour arrêter la course folle du sprite button #w.btns, "Stopper", [stopper], ul, WindowWidth/2-160, WindowHeight-60, 100, 20 button #w.btnr, "Reprendre", [reprendre], ul, WindowWidth/2-50, WindowHeight-60, 100, 20 button #w.btnq, "Quitter", [fin], ul, WindowWidth/2+60, WindowHeight-60, 100, 20 'on ouvre la fenêtre open "affiche sprite" for window_nf as #w print #w, "trapclose [fin]"; 'on affiche le fond #w.g, "background lefond" 'on affecte le bitmap au sprite nommé lesprite print #w.g, "addsprite lesprite lebitmap"; ' et maintenant on le laisse courir ' jusqu'à ce que le bouton "stopper" l'arrête ' une fois le bouton "stopper" cliqué, on relance la course en cliquant sur "reprendre" [reprendre] '(on retourne ici quand on vient de cliquer sur le bouton "reprendre") print #w.btns, "!enable" 'on active le bouton "stopper" print #w.btnr, "!disable" 'et on inactive le bouton "reprendre" 'securite=0 arret=0 while arret=0 'on place le sprite à l'écran, print #w.g, "spritexy lesprite ";xs;" ";ys print #w.g, "drawsprites"; 'on calcule les nouvelles coordonnées xs=xs+pasx*signx ys=ys+pasy*signy if xs+30>xbd then signx=signx*-1:xs=xs+pasx*signx 'franchit bord droit if xs<xbg then signx=signx*-1:xs=xs+pasx*signx 'franchit bord gauche if ys+30>ybb then signy=signy*-1:ys=ys+pasy*signy 'franchit bord bas if ys<ybh then signy=signy*-1:ys=ys+pasy*signy 'franchit bord haut 'on temporise (et en meme temps on assure l'affichage permanent 'du sprite. Faudra que je comprenne pourquoi) gosub [pause] 'securite=securite+1 'if securite>10000 then arret=1 wend wait [pause] 'bloc à mettre où tu veux puisqu'indépendant timer 1, [temps] 'pause en millisecondes wait [temps] timer 0 return [fin] unloadbmp "lefond" unloadbmp "lebitmap" close #w end [stopper] arret=1 'la boucle d'affichage du sprite est arrêtée print #w.btns, "!disable" 'on inhibe "stopper" print #w.btnr, "!enable" 'et on réveille "reprendre" wait
et un bonjour en guise de clin d'euil à Castel, à qui je n'ai pas encore répondu.
____________________
Just BASIC v2.0 :
utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc
Just BASIC v2.0 :
La graphicbox est maintenant bien jaune, mais comme le fond est uni on ne sait pas si le masque fait son boulot, alors j'ai testé avec mon background et ton sprite est un rond avec un trou au milieu, c'est normal
Je n'ai pas fouillé le code
Pour faire un bouton genre "clic-clac" il faut faire:
Code VB :
A chaque clic le flag (variable drapeau) passe à 1 0 1 0 1
Je pense qu'il faut alors mettre le test dans le timer, parce que dans la boucle y a risque d'emmélage de pinceaux
EDIT: pas étonnant que ton sprite traine la patte avec pasx et pasy =1; avec 5 c'est plus dynamique.
Je ne vais pas te blâmer de trop commenter, mais les "print" de début d'instrucs sont superflus; et si on met des print d'envoi en mainwin (eux obligatoires) on ne les retrouve plus d'entre les autres pour les supprimer après débogage
Je n'ai pas fouillé le code
Pour faire un bouton genre "clic-clac" il faut faire:
Code VB :
[boutonclicclac] flag=flag+1 if flag=2 then flag=0
A chaque clic le flag (variable drapeau) passe à 1 0 1 0 1
Je pense qu'il faut alors mettre le test dans le timer, parce que dans la boucle y a risque d'emmélage de pinceaux
EDIT: pas étonnant que ton sprite traine la patte avec pasx et pasy =1; avec 5 c'est plus dynamique.
Je ne vais pas te blâmer de trop commenter, mais les "print" de début d'instrucs sont superflus; et si on met des print d'envoi en mainwin (eux obligatoires) on ne les retrouve plus d'entre les autres pour les supprimer après débogage
____________________
Roro
Roro
Suite du: 20/12/2019 à 01h23
Le tien compacté avec le bouton clic clac (j'ai dû ajouter une tempo au bouton le basculement était trop rapide)
Code VB :
Le tien compacté avec le bouton clic clac (j'ai dû ajouter une tempo au bouton le basculement était trop rapide)
Code VB :
nomainwin WindowHeight = 420: WindowWidth = 400 graphicbox #x.s, 0, 0, 300, 350 open "capture sprite" for window_nf as #x ' loadbmp "fond","fond.bmp" #x.s, "down" #x.s, "fill yellow" 'graphicbox peinte en jaune #x.s, "getbmp lefond 0 0 300 300" 'dessin du masque : le noir sera la partie visible du sprite, le reste est en blanc 'je pars sur un sprite carré, le bitmap correspondant sera rectangulaire ' puisque un sprite est constitué du sprite et de son masque 'fond blanc #x.s, "size 1": #x.s, "color white": #x.s, "backcolor white": #x.s, "place 85 85": #x.s, "boxfilled 115 115" 'masque #x.s, "size 3": #x.s, "color black": #x.s, "place 100 100" : #x.s, "circle 13" 'dessin du sprite, en dessous du masque fond noir #x.s, "size 1": #x.s, "backcolor black": #x.s, "color black": #x.s, "place 85 115": #x.s, "boxfilled 115 146" #x.s, "size 3": #x.s, "color red": #x.s, "place 100 129": #x.s, "circle 13" #x.s, "getbmp lebitmap 85 85 30 60" 'transforme en bitmap la zone close #x WindowHeight = 420: WindowWidth = 405 xbg=0:xbd=400: ybh=0:ybb=350 'x bord gauche et x bord droit 'y bord ... if rnd(1)<0.5 then signx=-1 else signx=1 'direction et coordonnées initiales du sprite if rnd(1)<0.5 then signy=-1 else signy=1 xs=185: ys=185: pasx=5: pasy=5 flag=1 button #w.btns, "Stopper", [stopper], ul, WindowWidth/2-160, WindowHeight-60, 100, 20 graphicbox #w.g, xbg, ybh, xbd, ybb open "affiche sprite" for window_nf as #w #w, "trapclose [fin]"; #w.g, "background lefond" #w.g, "addsprite lesprite lebitmap" [reprendre] '(on retourne ici quand on vient de cliquer sur le bouton "reprendre") ' arret=0 while flag=1 #w.g, "spritexy lesprite ";xs;" ";ys #w.g, "drawsprites"; xs=xs+pasx*signx: ys=ys+pasy*signy 'on calcule les nouvelles coordonnées if xs+30>xbd then signx=signx*-1:xs=xs+pasx*signx 'franchit bord droit if xs<xbg then signx=signx*-1:xs=xs+pasx*signx 'franchit bord gauche if ys+30>ybb then signy=signy*-1:ys=ys+pasy*signy 'franchit bord bas if ys<ybh then signy=signy*-1:ys=ys+pasy*signy 'franchit bord haut 'on temporise (et en meme temps on assure l'affichage permanent 'du sprite. Faudra que je comprenne pourquoi) gosub [pause] 'securite=securite+1 'if securite>10000 then arret=1 wend [stopper] flag=flag+1 gosub [pausebut] print flag if flag=3 then flag =1 #w.btns, word$("Stopper Reprendre", flag) if flag=1 then [reprendre] wait [pause] timer 1, [temps] 'pause en millisecondes wait [temps] timer 0 return [pausebut] 'tempo du bouton timer 100, [tempsbut] 'pause en millisecondes wait [tempsbut] timer 0 return [fin] unloadbmp "lefond" unloadbmp "lebitmap" close #w end
____________________
Roro
Roro
Le bouton clic clac est celui qui ouvre le canapé ? 
Bien vu pour la bascule, j'étais parti sur cette optique, mais ça ne fonctionnait pas, et je n'ai pas cherché plus loin.
Autrement, je vois que nos derniers progs font le job et que j'en sais un peu plus sur la manière d'apprivoiser ces petites bêtes. Possible aussi que je n'ai pas vu toute l'aide et qu'il était écrit quelque part qu'il fallait occuper l'ordi avec un timer ou un scan pour que les sprites restent à l'écran.
Pourtant, j'ai déjà eu recours aux sprites dans un programme qui n'avait ni timer ni scan, et ils restaient affichés, il faudrait que je l'analyse pour comprendre pourquoi, et si c'est vraiment le fait d'arriver sur le "wait", ou si c'est l'absence d'une instruction magique, qui les désaffiche, j'ai pas encore tout compris.
Pour les "print", je sais qu'ils sont superflus, mais je n'ai pas encore pris la décision (psychologique) de les retirer : je suis habitué aux "print" qui vont sur la mainwin et aux "print #" qui vont sur les objets, et un "print #gf" m'est plus familier qu'un "#gf" cabalistique en début de ligne. Je vais sans doutes revoir mon point de vue, parce que, quand-même, tous ces "print", ça représente aussi pas mal de frappes clavier...
Edité par Christophe Le 21/12/2019 à 09h55

Bien vu pour la bascule, j'étais parti sur cette optique, mais ça ne fonctionnait pas, et je n'ai pas cherché plus loin.
Autrement, je vois que nos derniers progs font le job et que j'en sais un peu plus sur la manière d'apprivoiser ces petites bêtes. Possible aussi que je n'ai pas vu toute l'aide et qu'il était écrit quelque part qu'il fallait occuper l'ordi avec un timer ou un scan pour que les sprites restent à l'écran.
Pourtant, j'ai déjà eu recours aux sprites dans un programme qui n'avait ni timer ni scan, et ils restaient affichés, il faudrait que je l'analyse pour comprendre pourquoi, et si c'est vraiment le fait d'arriver sur le "wait", ou si c'est l'absence d'une instruction magique, qui les désaffiche, j'ai pas encore tout compris.
Pour les "print", je sais qu'ils sont superflus, mais je n'ai pas encore pris la décision (psychologique) de les retirer : je suis habitué aux "print" qui vont sur la mainwin et aux "print #" qui vont sur les objets, et un "print #gf" m'est plus familier qu'un "#gf" cabalistique en début de ligne. Je vais sans doutes revoir mon point de vue, parce que, quand-même, tous ces "print", ça représente aussi pas mal de frappes clavier...
Edité par Christophe Le 21/12/2019 à 09h55
____________________
Just BASIC v2.0 :
utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc
Just BASIC v2.0 :
Moi non plus j ne comprends pas pourquoi
Code VB :
Affiche une fenêtre blanche et vide; ce n'est pas normal, y a un truc qui nous échappe.
ça n'arrive pas si on fait avec un bmp externe en suivant la procédure courante:
Code VB :
Code VB :
#w.g, "spritexy lesprite ";xs;" ";ys #w.g, "drawsprites" wait
Affiche une fenêtre blanche et vide; ce n'est pas normal, y a un truc qui nous échappe.
ça n'arrive pas si on fait avec un bmp externe en suivant la procédure courante:
Code VB :
loadbmp load fond background addsprite spritexy drawsprite
____________________
Roro
Roro
Suite du: 21/12/2019 à 10h34
J'ai trouvéééé! C'est d'avoir créé le sprite dans une fenêtre à part qui ne lui a pas plu.
Regarde ça:
Code VB :
J'ai trouvéééé! C'est d'avoir créé le sprite dans une fenêtre à part qui ne lui a pas plu.
Regarde ça:
Code VB :
nomainwin ' supression de: #x.s WindowHeight = 420: WindowWidth = 405 xbg=0:xbd=400: ybh=0:ybb=350 'x bord gauche et x bord droit 'y bord ... if rnd(1)<0.5 then signx=-1 else signx=1 'direction et coordonnées initiales du sprite if rnd(1)<0.5 then signy=-1 else signy=1 xs=185: ys=185: pasx=5: pasy=5 flag=1 button #w.btns, "Stopper", [stopper], ul, WindowWidth/2-160, WindowHeight-60, 100, 20 graphicbox #w.g, xbg, ybh, xbd, ybb open "affiche sprite" for window_nf as #w #w, "trapclose [fin]" #w.g, "down" #w.g, "fill yellow" 'graphicbox peinte en jaune #w.g, "getbmp lefond 0 0 300 300" #w.g, "size 1": #w.g, "color white": #w.g, "backcolor white": #w.g, "place 85 85": #w.g, "boxfilled 115 115" #w.g, "size 3": #w.g, "color black": #w.g, "place 100 100" : #w.g, "circle 13" 'masque #w.g, "size 1": #w.g, "backcolor black": #w.g, "color black": #w.g, "place 85 115": #w.g, "boxfilled 115 146" 'dsprite, #w.g, "size 3": #w.g, "color red": #w.g, "place 100 129": #w.g, "circle 13" #w.g, "getbmp lebitmap 85 85 30 60" 'transforme en bitmap la zone #w.g, "background lefond" #w.g, "addsprite lesprite lebitmap" [reprendre] '(on retourne ici quand on vient de cliquer sur le bouton "reprendre") ' ' ' 'while flag=1 #w.g, "spritexy lesprite ";xs;" ";ys #w.g, "drawsprites" wait ' ' ' ' test de visu sans la boucle xs=xs+pasx*signx: ys=ys+pasy*signy 'on calcule les nouvelles coordonnées if xs+30>xbd then signx=signx*-1:xs=xs+pasx*signx 'franchit bord droit if xs<xbg then signx=signx*-1:xs=xs+pasx*signx 'franchit bord gauche if ys+30>ybb then signy=signy*-1:ys=ys+pasy*signy 'franchit bord bas if ys<ybh then signy=signy*-1:ys=ys+pasy*signy 'franchit bord haut 'on temporise (et en meme temps on assure l'affichage permanent 'du sprite. Faudra que je comprenne pourquoi) gosub [pause] 'securite=securite+1 'if securite>10000 then arret=1 ' ' ' ' wend [stopper] flag=flag+1 gosub [pausebut] print flag if flag=3 then flag =1 #w.btns, word$("Stopper Reprendre", flag) if flag=1 then [reprendre] wait [pause] timer 1, [temps] 'pause en millisecondes wait [temps] timer 0 return [pausebut] timer 100, [tempsbut] 'pause en millisecondes wait [tempsbut] timer 0 return [fin] unloadbmp "lefond" unloadbmp "lebitmap" close #w end
____________________
Roro
Roro
Oui, ça me fait la même chose sur un petit bout d'essai préalable à cette discussion...
J'ai voulu utiliser un bitmap, et j'ai mis un filedialog pour le choisir, parce que le sprite ne s'affichait pas avec un loadbmp... J'ai dû me mélanger les pinceaux à un moment ou à un autre, parce que même sans le filedialog, le loadbmp est bien opérationnel. La nuit portera conseil.
Met en commentaire la ligne <#w.g, "down"> et le sprite n'est pas dessiné : je pensais que "down" ne concernait que le crayon dans le dessin des graphismes, il faut aussi le mettre pour afficher des sprites ?
Code VB :
J'ai voulu utiliser un bitmap, et j'ai mis un filedialog pour le choisir, parce que le sprite ne s'affichait pas avec un loadbmp... J'ai dû me mélanger les pinceaux à un moment ou à un autre, parce que même sans le filedialog, le loadbmp est bien opérationnel. La nuit portera conseil.
Met en commentaire la ligne <#w.g, "down"> et le sprite n'est pas dessiné : je pensais que "down" ne concernait que le crayon dans le dessin des graphismes, il faut aussi le mettre pour afficher des sprites ?
Code VB :
nomainwin filedialog "Choisir un bitmap", "*.bmp", sprite$ if sprite$="" then end else loadbmp "lebitmap", sprite$ WindowHeight = 420: WindowWidth = 405 graphicbox #w.g, 0, 0, 300, 300 open "affiche sprite" for window_nf as #w #w, "trapclose [fin]" #w.g, "down" #w.g, "addsprite lesprite lebitmap" #w.g, "spritexy lesprite 30 30" #w.g, "drawsprites" wait ' ' ' ' test de visu sans la boucle [fin] unloadbmp "lebitmap" close #w end
____________________
Just BASIC v2.0 :
utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc
Just BASIC v2.0 :
Le premier exemple de cette discussion fonctionne comme je l'attend quand on met un "down" dans la seconde fenêtre, celle où l'on bouge le sprite...
Dingue
Edité par Christophe Le 21/12/2019 à 21h04
Dingue

Edité par Christophe Le 21/12/2019 à 21h04
____________________
Just BASIC v2.0 :
utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc
Just BASIC v2.0 :
Oui le "down" est obligatoire quand on oeuvre en graphic ou en graphicbox.
C'était donc ça le problème.
Perso je trouve mieux de tout faire dans la même fenêtre, car créer dans une fenêtre qui est closed avant d'utiliser ce qui a été créé dedans me paraît bizarre.
C'était donc ça le problème.
Perso je trouve mieux de tout faire dans la même fenêtre, car créer dans une fenêtre qui est closed avant d'utiliser ce qui a été créé dedans me paraît bizarre.
____________________
Roro
Roro
d'autant plus qu'il est bien spécifié qu'il ne doit y avoir qu'une seule fenêtre ou un seul graphicbox qui utilise des sprites.
A priori, la condition reste vraie si on ferme une fenêtre à sprite et qu'on en ouvre une autre : il y en aura toujours qu'une d'ouverte à la fois. Mais la mécanique interne de JB/LB garderait-elle une trace de la première fenêtre ?...
L'avantage que je voyais à la première fenêtre était de créer toute la batterie de sprites et de fonds nécessaires sans avoir à charger/télécharger des bitmaps. J'avais aussi dans l'idée d'essayer des coordonnées de fenêtre en dehors de l'écran, pour éviter d'éventuels scintillements désagréables durant l'opération, et peut-être gagner un peu en temps d'éxécution.
Pour l'instant je laisse reposer, je trouve qu'on a bien avancé. Ce "down" nécessaire me semble un peu étonnant, car si c'était une condition de base de l'affichage de sprite, cela aurait sûrement indiqué dans dans l'aide.
à+
A priori, la condition reste vraie si on ferme une fenêtre à sprite et qu'on en ouvre une autre : il y en aura toujours qu'une d'ouverte à la fois. Mais la mécanique interne de JB/LB garderait-elle une trace de la première fenêtre ?...
L'avantage que je voyais à la première fenêtre était de créer toute la batterie de sprites et de fonds nécessaires sans avoir à charger/télécharger des bitmaps. J'avais aussi dans l'idée d'essayer des coordonnées de fenêtre en dehors de l'écran, pour éviter d'éventuels scintillements désagréables durant l'opération, et peut-être gagner un peu en temps d'éxécution.
Pour l'instant je laisse reposer, je trouve qu'on a bien avancé. Ce "down" nécessaire me semble un peu étonnant, car si c'était une condition de base de l'affichage de sprite, cela aurait sûrement indiqué dans dans l'aide.
à+
____________________
Just BASIC v2.0 :
utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc
Just BASIC v2.0 :
Citation:
ça ne nécessite pas de le faire dans une fenêtre à part
Tu aurais pu le faire dans l'écran sans craindre de scintillements.
Ouvrir et fermer une fenêtre ne fait pas gagner du temps
Citation:
Il y a quelques lacunes et "non dits" dans l'aide, par exemple il y a très peu de choses sur la contraction d'instructions dont certaines ont des syntaxes pas évidentes; du genre: Point virgule impromptu.
Citation:
Bon, il faudra attendre un peu pour un jeu de basket alors.
créer toute la batterie de sprites et de fonds nécessaires sans avoir à charger des bitmaps.
ça ne nécessite pas de le faire dans une fenêtre à part
Tu aurais pu le faire dans l'écran sans craindre de scintillements.
Ouvrir et fermer une fenêtre ne fait pas gagner du temps
Citation:
cela aurait sûrement été indiqué dans l'aide.
Il y a quelques lacunes et "non dits" dans l'aide, par exemple il y a très peu de choses sur la contraction d'instructions dont certaines ont des syntaxes pas évidentes; du genre: Point virgule impromptu.
Citation:
Pour l'instant je laisse reposer
Bon, il faudra attendre un peu pour un jeu de basket alors.
____________________
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