Forum Liberty Basic France

Débutant » Affichage permanent des sprites "drawsrites" continuel obligatoire ?
Le 16/12/2019 à 22h07

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 612
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 ?
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia6 + 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 16/12/2019 à 23h39

Libertynaute Actif

Groupe: Membre

Inscrit le: 10/10/2017
Messages: 100
Hello Christophe,
Désolé, je n’ai pas encore tâté du spirite.
A+
____________________
Castel

   
Le 17/12/2019 à 00h50

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2252
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.
____________________
Roro

   
Le 17/12/2019 à 11h44

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 612
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 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 courante avec GNU/Linux Mageia6 + 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 17/12/2019 à 12h18

Modérateur

Groupe: Modérateur

Inscrit le: 30/03/2011
Messages: 380
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 :)
____________________
Yo !

MSN Web    
Le 17/12/2019 à 13h23

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 612
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 :
 
 '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 courante avec GNU/Linux Mageia6 + 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 17/12/2019 à 18h22

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2252
J'ai un peu modifié, ça sort bizarre.
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

   
Le 18/12/2019 à 16h51

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 612
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 :
 
    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 courante avec GNU/Linux Mageia6 + 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 19/12/2019 à 10h06

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2252
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
____________________
Roro

   
Le 19/12/2019 à 19h39

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 612
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 :
 
    '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 courante avec GNU/Linux Mageia6 + 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 20/12/2019 à 01h23

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2252
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 :
 
[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

   
Le 20/12/2019 à 13h31

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2252
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 :
 
  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

   
Le 21/12/2019 à 09h54

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 612
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
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia6 + 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 21/12/2019 à 10h34

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2252
Moi non plus j ne comprends pas pourquoi
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

   
Le 21/12/2019 à 13h21

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2252
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 :
 
  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

   
Le 21/12/2019 à 20h44

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 612
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 :
 
  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 courante avec GNU/Linux Mageia6 + 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 21/12/2019 à 21h03

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 612
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
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia6 + 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 22/12/2019 à 11h32

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2252
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.
____________________
Roro

   
Le 22/12/2019 à 16h53

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 612
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.

à+
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia6 + 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 22/12/2019 à 17h26

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2252
Citation:
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

   
Débutant » Affichage permanent des sprites "drawsrites" continuel obligatoire ?  

 |  |

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