Forum Liberty Basic France : Voir tous les messages du membre

Aucune arête : c'est du poisson carré surgelé :lol
Il serait plus constructif de s'intérresser à la SUB mep. C'est un sympa petit morceau à traiter... et le programme de Christophe serait terminé !
Ben si bien sûr qu'il y a besoin de placer, sinon comment veux-tu que la détection à la souris fonctionne !!

Roland:
Il est bien "charnu" ton code; Christophe va y passer un moment.

absolument pas : tu devrais ralentir sur des petites phrases comme ça qui n'aident sûrement pas Christophe à percevoir la facilité d'utilisation de JustBasic :(
oui, c'est parce que j'étais parti pour fabriquer de "vrai" sprites... (j'aurai pu aussi utiliser de vrai fichier BMP) mais l'utilisation que j'en fais ici est relativement peu orthodoxe dirons-nous, et donc ne le nécessite pas forcément tant qu'on n'utilise pas DRAWSPRITE.

J'ai mis la création de l'affichage de la fable dans une Sub routine pour pouvoir l'appeler dans la Sub routine de Chargement d'un nouveau fichier...

Je l'ai nommée "mep" comme "Mise En Place". C'est un bon petit casse tête que je laisse à votre sagacité je pense... :top

Voici le fichier fable qui sert de base : à mettre dans un simple fichier texte nommé : "Fable01.txt"
Code VB :
Le Corbeau et le Renard
Maître-Corbeau;Loup;Renard;Blaireau;Souriceau;Lion-sur un arbre-perché;en fleur;déraciné;penché;feuillu;magnifique-tenait en son bec un fromage.
Maître Renard, par l'odeur-alléchée;rouge vif;bleue;pourrie;puissante;sereine;assurée-lui tint à peu près ce langage.
Hé ! bonjour, Monsieur du-Corbeau;Courneau;Taureau;Blaireau;Bigorneau;Cours d'Eau-Que vous êtes joli ! que vous me semblez beau !


Grace à la commande WORD$(string$,n,"-") qu'il faut utiliser ligne par ligne excepté la première qui est le titre (tout ça dans une jolie boucle bien sûr), on peut définir les lrmat$(), et afficher les textes (la largeur du mot à trouver étant bien entendu la largeur de la LISTBOX que j'ai fixé à 130 un peu arbitrairement), et ainsi positionner les sprites "zone1 zone2 zone3 zone4 etc..." et les mot$() à trouver...
C'est vrai qu'avec une "amorce" ça fonctionne beaucoup mieux :lol

Code VB :
' http://libertybasic.fr/forum/topic-384+definir-des-combobox-quand-on-n-en-connait-pas-le-nombre.php
' http://libertybasic.fr/forum/topic-393-0-4259+detecter-si-la-souris-est-au-dessus-d-une-zone.php#m4259
    nomainwin
 
    WindowWidth = 1000
    WindowHeight = 600
    UpperLeftX = (DisplayWidth-WindowWidth) / 3
    UpperLeftY = (DisplayHeight-WindowHeight) / 2
 
    mois$ = "Jan Fév Mar Avr Mai Jun Jui Aou Sep Oct Nov Déc"
    today$ = date$("mm/dd/yyyy")
    j = date$(today$)
    jsem$ = word$("Mar Mer Jeu x Ven Sam x Dim Lun",int((j/7-int(j/7))*10)+1)
    date$ = jsem$+" "+mid$(today$,4,2)+" "+word$(mois$, val(today$))+"   "+left$(time$(),5)'right$(today$,4)

    GLOBAL textFont$, textColor$, bckColor$, Gwidth, Gheight, lbx, lby, nz, nm
 
    DIM info$(10,10), lrmat$(10), mt$(10), mots$(6), lf$(10)
    lbx = 0
    lby = -200
 
    textFont$  = "Comic_Sans_MS" ' "Times_New_Roman"
    textColor$ = "yellow"
    bckColor$  = "26 72 43"    ' dark green ...
    ListboxColor$ = "cyan"
 
    statictext #w.debug "message de debug", 10, WindowHeight-60, 300, 40
    graphicbox #w.gr, 0, 0, WindowWidth, WindowHeight-135
    graphicbox #w.grtxt, 0, WindowHeight-136, WindowWidth, 65
    listbox #w.lb, mots$(), [valider], lbx, lby, 130, 6*20
 
    BUTTON #w.t1, "Nouveau fichier", Charge, UL, WindowWidth-480, WindowHeight-60 , 140, 25
    BUTTON #w.t2, "recommencer", [rejoue], UL, WindowWidth-280, WindowHeight-60 , 100, 25
    BUTTON #w.exit, "QUITTER", Quit, UL, WindowWidth-120, WindowHeight-60 , 100, 25
    open "    Mots à trouver..."+space$(20)+date$ for window_nf as #w    ' graphics_nf_nsb
    #w "trapclose Quit"
    #w.gr "home; posxy CenterX CenterY"
    Gwidth = CenterX * 2
    Gheight = CenterY * 2
    #w "font ";textFont$;" 10 bold"
    #w.gr "font ";textFont$;" 14 bold"
    #w.gr "down"
    gosub [makeSprites]
    #w.grtxt "down; fill ";bckColor$ 
    #w.debug "!font Times_New_Roman 12 bold"
    #w.lb "singleclickselect"    'pour ne cliquer qu'une fois dans la listbox pour valider un mot...

    call mep
    #w.gr "when mouseMove XY"
 
WAIT
 
 
  sub mep  ' -------------------- en principe : lecture du fichier texte -------------------

'  bien sûr il faut traiter le fichier texte correctement, avec gestion des positions des mots, etc...
'  Là j'ai fais ça un peu à la louche !

    for m=1 to 10
      mt$(m) = "_____________"
    next
 
    lrmat$(1) = "Corbeau;Loup;Renard;Blaireau;Souriceau;Lion"
    lrmat$(2) = "perché;en fleur;déraciné;penché;feuillu;magnifique"
    lrmat$(3) = "alléchée;rouge vif;bleue;pourrie;puissante;sereine;assurée"
    lrmat$(4) = "Corbeau;Courneau;Blaireau;Bigorneau;Taureau;Cours d'Eau"
 
    #w.gr "backcolor ";bckColor$;"; fill ";bckColor$
    #w.gr "color ";textColor$
 
    #w.gr "place 100 40;|";upper$("Le Corbeau et le Renard")
    #w.gr "place 20 100;|Maître"
    #w.gr "place 100 100;|";mt$(1)
    #w.gr "spritexy zone1 100 80"
 
    #w.gr "place 275 100;|sur un arbre"
    #w.gr "place 400 100;|";mt$(2)
    #w.gr "spritexy zone2 400 80"
 
    #w.gr "place 580 100;|tenait en son bec un fromage."
    #w.gr "place 20 140;|Maître Renard, par l'odeur"
    #w.gr "place 290 140;|";mt$(3)
    #w.gr "spritexy zone3 300 120"
 
    #w.gr "place 460 140;|lui tint à peu près ce langage."
    #w.gr "place 20 180;|Hé ! bonjour, Monsieur du"
    #w.gr "place 280 180;|";mt$(4)
    #w.gr "spritexy zone4 280 160"
 
    #w.gr "place 460 180;|que vous êtes joli ! que vous me semblez beau !"
 
    nm = 4
    #w.gr "flush"
    #w.gr "color green"
  end sub
 
    sub XY handle$, mx, my    ' when mouseMove ...
       ' mx = MouseX
       ' my = MouseY

        #w.gr "spritexy Curs ";mx;" ";my
        #w.gr "spritecollides Curs list$"
        nz = val(right$(word$(list$,1),1))
        if nz>0 and nz<=nm then
           #w.gr "spritexy? ";word$(list$,1);" x y"
           lbx = x
           lby = y
           for m=1 to 6
             mots$(m) =word$(lrmat$(nz),m,";")   'charge la nouvelle liste de mots
           next
           for mel=1 to 30           ' mélange
             hz0 = int(rnd(1)*nm)+1
             tmp$ = mots$(hz0)
             hz = int(rnd(1)*nm)+1
             mots$(hz0) = mots$(hz)
             mots$(hz) = tmp$
           next
           #w.lb "reload"
           #w "refresh"
        else
           lbx = 0
           lby = -200
           #w "refresh"
        end if
    end sub
 
  [rejoue]
    #w.debug "Effacement des mots trouvés..."
    call message 15,20,""
    #w.gr "color yellow"
    for m=1 to nm
      mt$(m) = "_____________"
      #w.gr "spritexy? zone";str$(m);" x y"
      #w.gr "place ";x-5;" ";y+20;";|";mt$(m)
    next
    #w.gr "flush ;discard"
    #w.gr "color green"
  wait
 
  [valider]
    #w.gr "when mouseMove"
    #w.lb "selection? mot$"
    mt$(nz) = mot$
    #w.gr "spritexy? zone";str$(nz);" x y"
    #w.gr "place ";x-5;" ";y+20;";|    ";mt$(nz);"     "
    #w.gr "flush ;discard"
    lbx = 0
    lby = -200
    #w "refresh"
    mc = 0
    for m = 1 to nm
      if mt$(m) = word$(lrmat$(m),1,";") then mc = mc + 1
    next
    if mc = nm then
      call message 15,20,"Bravo !  tout les mots sont justes !"
    end if
    #w.gr "when mouseMove XY"
  wait
 
  [makeSprites]
     #w.gr "backcolor black; place 0 0 ;boxfilled 1 1"
     #w.gr "place 0 1 ; box 1 2"
     #w.gr "getbmp Curseur 0 0 1 2"
     #w.gr "addsprite Curs Curseur"   ' create sprite
     unloadbmp "Curseur"
     ' #w.gr "spritevisible Curs off"   ' hide curs

      'admettons qu'on prépare 10 sprites pour 10 mots a trouver maximum...
     #w.gr "place 0 10 ; boxfilled 130 30"
     #w.gr "place 0 30 ; box 130 50"
     #w.gr "getbmp zone 0 10 130 40"
     for nz = 1 to 10
       #w.gr "addsprite zone";nz;" zone"
     '  #w.gr "spritevisible zone";nz;" off"
     next
     unloadbmp "zone"
   return
 
    sub message posY,fonte,txt$
        #w.grtxt "font ";textFont$;" ";fonte
        #w.grtxt "fill ";bckColor$
        #w.grtxt "backcolor ";bckColor$;" ; color ";textColor$
        #w.grtxt "place 20 ";posY+26;" ;|";txt$
    end sub
 
    FUNCTION fileExists(path$, filename$)
        'DIM info$(10,10)   must be declared at the start of the prog.
        files DefaultDir$, filename$, info$()  ' path$ = 'DefaultDir$' generally.
        fileExists = val(info$(0, 0))  'not zero if true
    END FUNCTION
 
    SUB Charge handle$
        filedialog "Fichiers de données", "Fable*.txt", fileName$
        if fileName$ <> "" then
            #w.debug "Bientôt sans doute..."
            open fileName$ for input as #show
            while eof(#show) = 0
                ligne = ligne + 1
                line input #show, lf$(ligne)
            wend
            lf$(ligne+1) = ""
            close #show
            call mep
        end if
    end sub
 
    sub Quit handle$
        close #w
        END
    end sub
 
Disons qu'avec les sprites il n'y a aucun select case à faire puisqu'on obtient directement le n° du sprite (zone) concerné, et donc sa position à l'écran.
Comme je l'ai dis plus haut... (pardon je parlais des mots à trouver ;) )

cassiope01:
Avec ma méthode des sprites il suffit de les compter à la lecture du fichier texte pour savoir le nombre de sprites à créer... On met leur n° dans leur nom et on connaitra ainsi leur n° avec SPRITECOLLIDE Curs,list$...
Ce nombre sera d'ailleurs essentiel à connaître car il conditionnera la taille de plusieures variables tableaux : les listes de mots, les coordonnées x,y de ces listes qui sont aussi celles des zones pour la souris, etc...

Bonne journée

Gilles.


Evidemment c'est à refaire à chaque chargement d'un nouveau fichier texte...
Donc la devise de Christophe : "pourquoi faire simple quand on peux faire compliqué..." :lol

Je remet le bout de code dans ce post car je l'ai encore modifié... ;) (il faut cliquer 2 fois le mot choisi)

Code VB :
'détection de souris sur plusieurs zones d'une fenêtre
nomainwin
'définir la fenêtre
'   (dimensions modifiées par des coefficients allant de 0 à 1 inclus)

    'dimensions de la fenêtre
    WindowWidth = int(DisplayWidth * 0.6)
    WindowHeight = int(DisplayHeight * 0.6)
 
    'position de l'angle supérieur gauche de la fenêtre sur l'écran
    UpperLeftX = int(DisplayWidth * 0.2)
    UpperLeftY = int(DisplayHeight * 0.2)
 
 
'position des écritures « position pointeur »
    XLigneAffichage = int(WindowWidth * 0.05)
    YLigneAffichage = int(WindowHeight * 0.05)
 
'position et dimension des zones dans lesquelles on devra détecter la souris
'   on définit ici le point supérieur gauche et le point inférieur droit de la zone
'   axes de référence : bords droit et haut de la fenêtre

    Zone1XHautGauche = int(WindowWidth * 0.3)
    Zone1YHautGauche = int(WindowHeight * 0.3)
    Zone1XBasDroite = Zone1XHautGauche + int(WindowWidth * 0.5)
    Zone1YBasDroite = Zone1YHautGauche + int(WindowHeight * 0.5)
    couleur1$ = "darkgreen"
 
    Zone2XHautGauche = int(WindowWidth * 0.15)
    Zone2YHautGauche = int(WindowHeight * 0.11)
    Zone2XBasDroite = Zone2XHautGauche + int(WindowWidth * 0.2)
    Zone2YBasDroite = Zone2YHautGauche + int(WindowHeight * 0.15)
    couleur2$ = "red"
 
    Zone3XHautGauche = int(WindowWidth * 0.09)
    Zone3YHautGauche = int(WindowHeight * 0.36)
    Zone3XBasDroite = Zone3XHautGauche + int(WindowWidth * 0.09)
    Zone3YBasDroite = Zone3YHautGauche + int(WindowHeight * 0.08)
    couleur3$ = "blue"
 
'ouvrir la fenêtre en mode graphique (la lecture de la souris ne marche pas en mode window
'il semblerait d'ailleurs qu'il y ait un monde entre ces deux univers)
    dim mots$(10,3), array$(10)
 
    aa=-480 :bb=30
 
    graphicbox #fenetre1.gra, 20,20,WindowWidth-40,WindowHeight-60
    listbox #fenetre1.ext, array$(), [valider], aa, bb, 100, 108
    OPEN "souris sur zone ?" for window_nf as #fenetre1
    #fenetre1 "trapclose [quit]"
    #fenetre1, "font Comic Sans MS 10 bold"
    #fenetre1.gra, "font Comic Sans MS 12 bold"
 
'affichage du texte "bougez la souris !"
    #fenetre1.gra, "color black"
    #fenetre1.gra, "down"
    #fenetre1.gra, "place ";XLigneAffichage;" ";YLigneAffichage
    #fenetre1.gra, "\Bougez la souris !"
 
'dessin des zones
    'zone 1
    #fenetre1.gra, "place ";Zone1XHautGauche;" ";Zone1YHautGauche
    #fenetre1.gra, "backcolor " + couleur1$
    #fenetre1.gra, "boxfilled ";Zone1XBasDroite;" ";Zone1YBasDroite
 
    'zone 2
    #fenetre1.gra, "place ";Zone2XHautGauche;" ";Zone2YHautGauche
    #fenetre1.gra, "backcolor " + couleur2$
    #fenetre1.gra, "boxfilled ";Zone2XBasDroite;" ";Zone2YBasDroite
 
    'zone 3
    #fenetre1.gra, "place ";Zone3XHautGauche;" ";Zone3YHautGauche
    #fenetre1.gra, "backcolor " + couleur3$
    #fenetre1.gra, "boxfilled ";Zone3XBasDroite;" ";Zone3YBasDroite
    #fenetre1.gra, "backcolor white"
 
    #fenetre1.gra "flush : discard"
    #fenetre1.gra, "when mouseMove [souris_se_deplace]"
 
    mot$(1,1) = "Corbeau"
    mot$(2,1) = "Loup"
    mot$(3,1) = "Renard"
    mot$(4,1) = "Corbeau"
    mot$(5,1) = "Souriceau"
    mot$(6,1) = "Lion"
 
    mot$(1,2) = "perché"
    mot$(2,2) = "en fleur"
    mot$(3,2) = "déraciné"
    mot$(4,2) = "perché"
    mot$(5,2) = "feuillu"
    mot$(6,2) = "magnifique"
 
    mot$(1,3) = "alléchée"
    mot$(2,3) = "rouge vif"
    mot$(3,3) = "bleue"
    mot$(4,3) = "alléchée"
    mot$(5,3) = "puissante"
    mot$(6,3) = "sereine"
'attente…
wait
 
[valider]
    #fenetre1.ext "selection? mot$"
    #fenetre1.gra, "place ";XLigneAffichage;" ";YLigneAffichage
    #fenetre1.gra, "\Pos X = ";X;",  Pos Y = ";Y;"           Dernier mot choisi = "+mot$+"           "
    aa=-480 :bb=30
    #fenetre1 "refresh"
wait
 
'******** zone des sous-programmes ********

[quit]
    'fermeture sans confirmation et par le gadget de fermeture de la fenetre
    print "[quit]"
    close #fenetre1
end
 
 
[souris_se_deplace]
 
    X = MouseX : Y = MouseY
    aa=-480 :bb=30
 
    'le pointeur est-il dans la zone ?
    zone = 0
    if X > Zone1XHautGauche and X < Zone1XBasDroite and Y > Zone1YHautGauche and Y < Zone1YBasDroite then zone = 1
    if X > Zone2XHautGauche and X < Zone2XBasDroite and Y > Zone2YHautGauche and Y < Zone2YBasDroite then zone = 2
    if X > Zone3XHautGauche and X < Zone3XBasDroite and Y > Zone3YHautGauche and Y < Zone3YBasDroite then zone = 3
 
 
    select case zone
      case 0
        afficher$ = "La souris est hors-zone        "
        couleur$ = "black"
 
      case 1
        afficher$ = "La souris est dans la zone 1   "
        couleur$ = couleur1$ 
        aa=Zone1XHautGauche+22
        bb=Zone1YHautGauche+22
        for m=1 to 6
          array$(m) = mot$(m,1)
        next
 
      case 2
        afficher$ = "La souris est dans la zone 2   "
        couleur$ = couleur2$ 
        aa=Zone2XHautGauche+22
        bb=Zone2YHautGauche+22
        for m=1 to 6
          array$(m) = mot$(m,2)
        next
 
      case 3
        afficher$ = "La souris est dans la zone 3   "
        couleur$ = couleur3$ 
        aa=Zone3XHautGauche+22
        bb=Zone3YHautGauche+22
        for m=1 to 6
          array$(m) = mot$(m,3)
        next
 
    end select
    #fenetre1.ext "reload"
    #fenetre1 "refresh"
 
    'affichage de la position du pointeur et de l'information "en/hors zone"
    #fenetre1.gra, "color black"
    #fenetre1.gra, "place ";XLigneAffichage;" ";YLigneAffichage
    #fenetre1.gra, "\Pos X = ";X;",  Pos Y = ";Y;"       "
    #fenetre1.gra, "place ";XLigneAffichage;" ";YLigneAffichage + 20
    #fenetre1.gra, "color " + couleur$
    #fenetre1.gra, "\" + afficher$
 
wait
 
Je ne comprends pas ce que tu veux dire : ta détection variable fonctionne !!!
Essaye donc le bout de code que j'ai adapté plus haut...
Christophe:

Petit edit du lendemain : je dis "je", mais on pourrait bien dire "maintenant que nous savons détecter la présence de la souris", si on peut étudier à fond les combobox pour voir si elles sont utilisables ici, allons-y...


Non non, tu peux dire "je" puisque Roland et moi savions déjà le faire :lol

En y repensant je me demande si une LISTBOX ne serait-elle pas mieux appropriée ? mais bon, c'est presque pareil...

Je pense que la détection du passage de la souris ne devrait simplement QUE déterminer de nouvelles coordonnées au COMBOBOX ou à la LISTBOX:
- dès que de nouvelles coordonnées valident sont déterminées :
- on désactive la détection de la souris,
- on affiche la LISTBOX (après l'avoir mis à jour avec tous les paramètres liés à sa position dans la fable) tant que le joueur n'a pas sélectionné un mot dans la liste,
- puis on fait disparaitre la LISTBOX (en la positionnant en dehors de la fenêtre par exemple: voir mon dernier bout de code modifié... plus haut),
- on affiche le mot sélectionné,
- et on réactive la détection à la souris...


@Roland, je ne vois pas de différence de comportement entre la zone 3 et les autres ???
Roland:
Mais ça ne va pas être simple de faire un nombre de zones variable.

Avec ma méthode des sprites il suffit de les compter à la lecture du fichier texte pour savoir le nombre de sprites à créer... On met leur n° dans leur nom et on connaitra ainsi leur n° avec SPRITECOLLIDE Curs,list$...
Ce nombre sera d'ailleurs essentiel à connaître car il conditionnera la taille de plusieures variables tableaux : les listes de mots, les coordonnées x,y de ces listes qui sont aussi celles des zones pour la souris, etc...

Bonne journée

Gilles.

 |  |

1 Utilisateur en ligne : 0 Administrateur, 0 Modérateur, 0 Membre et 1 Visiteur
Utilisateur en ligne : Aucun membre connecté