Forum Liberty Basic France

Général » Affichage de hall de gare Une ptite chose en passant
Le 01/03/2021 à 22h48

Modérateur

Groupe: Modérateur

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

Pour changer un peu de récentes petites prises de tête philosophico-forumesques distinguées, je vous invite à voyager :

Code VB :
 
'Affichage hall de gare

'durée mini entre affichages de deux caractères successifs
ecart=100   'milliseconde

'jeu de caractères
alphabet$=" ABCDEFGHIJKLMNOPQRSTUVWXYZ+-.*/0123456789"
 
'grille des départs
p$(0)="TRAIN    HEURE   DESTINATION               DEPART"
p$(1)="TGV6128  19H50 - MARSEILLE SAINT CHARLES - VOIE A"
p$(2)="TER512   20H04 - MIRAMAS SALON DE PROV.  - VOIE E"
p$(3)="TER2232  20H35 - LYON PART DIEU          - VOIE D"
p$(4)="ARBALETE 20H55 - TOULOUSE MATABIAU       - VOIE B"
p$(5)="AF0717   21H52 - LONDRES HEATROW         - GATE 2"
 
'affiche le tableau des départs
print p$(0)
for destination=1 to 5
 
    phrase$=p$(destination)
    lng=len(phrase$)
    dim phr$(lng)
    dim phrf$(lng)
    dim ok(lng)
 
    gosub [affiche_ligne]
    print
next
end
 
[affiche_ligne]
 
    for a=1 to lng
        phr$(a)=mid$(phrase$,a,1)
    next
 
    fini=0
    a=1
    while fini=0
        if a>len(alphabet$) then fini=1
 
        al$=mid$(alphabet$,a,1)
 
        for b=1 to lng
            if ok(b)=0 then
                if al$=phr$(b) then
                    phrf$(b)=phr$(b)
                    ok(b)=1
                else
                    phrf$(b)=al$
                end if
            end if
        next
 
        aff$=""
        for b=1 to lng
            aff$=aff$+phrf$(b)
        next
 
        'temporisation
        tac=0
        t=time$("ms")
        while tac=0
            if t+ecart<time$("ms") then tac=1
        wend
 
        'affichage de la phrase
        locate 0,destination+1:print aff$
        a=a+1
 
    wend
    return
 
 

Il ne manque que le bruit des palettes qui tombent... (c'est peut-être un peu plus difficile à faire si on veut le synchroniser avec chaque caractère)

Je vous laisse deviner le fonctionnement du truc. Tu constatera, Roland, que je n'ai pas utilisé mes datas ;)
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia7+ Wine (Pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 02/03/2021 à 10h08

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2489
Tu n'a pas donné ton avis sur mon "Quizz crypt".
Je boude. :(
____________________
Roro

   
Le 02/03/2021 à 20h00

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 741
Pas beau de bouder ;) Tiens, voiçi quelques caramels :

(Photo Evan Amos - License Creative Common BY-SA 3.0)

Cette aprèm' j'ai voulu faire une version avec une horloge en boucle principale, qui interroge la grille horaire pour savoir quels trains afficher. C'est pas très compliqué dans le principe mais la mainwin ne permet pas la capture des évènements clavier ou souris qui permettraient de fermer le programme. La solution est d'en faire une version graphique, mais je ne viens qu'une fois tous les trois mois et j'ai déjà autre chose au four, donc je laisse en l'état. Si certains veulent s'emparer de l'idée, ils peuvent.

Comme je suis fâché avec le timer, j'ai créé un équivalent. Il n'est pas forcément très précis, mais il fait le job pour des petites durées :
Code VB :
 
'temporisation
ecart=200 'millisecondes
tac=0
t=time$("ms")
while tac=0
    if t+ecart<time$("ms") then tac=1
wend
 

Pour des durées plus longues, on pourrait avoir envie de sortir du programme avant la fin de la temporisation, mais ça devrait pas être trop difficile à programmer.

Roland, je regarde comment tu as goupillé ton quizz.
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia7+ Wine (Pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 28/03/2021 à 21h23

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 741
Voilà la version graphique, il n'y a plus qu'à construire le réseau ferroviaire qui va autour ;)

Mais ce sera pour une autre fois, car le projet ne s'est pas laissé faire, le bougre, et j'ai eu du mal à le mettre au point : la difficulté principale a été le défilement des caractères de toute une ligne, au rythme d'un afficheur par caractère, les afficheurs étant à la fois synchronisés pour le rythme de défilement, et indépendants pour la gestion du symbole à afficher. Un sacré micmac.

Je me suis inspiré de souvenirs de voyage, et les afficheurs à palettes sont simulés par l'affichage répétitif d'une chaine de caractères toujours au même endroit, jusqu'à ce que la ligne affiche tous les symboles attendus. Le Bon Internet dans sa généreuse bonté m'a fourni cette vidéo montrant les vrais afficheurs en action.

Je n'ai pas testé le cas de deux trains partant à la même heure, ni le cas des trains qui partent après minuit quand il n'est pas encore minuit, et à mon avis ça devrait poser problème dans les deux cas. Il n'y a pas le bruitage non plus.

J'ai découvert l'utilité de l'instruction "scan" pour continuer de détecter les clics souris et frappes clavier durant une boucle longue, qui autrement nécessiterait d'être achevée pour qu'on puisse fermer le programme.

Le dessin des horloges est fait avec la tortue plutôt qu'avec les habituelles coordonnées cartésiennes.

On pourrait facilement remplacer les quelques destinations de test par un fichier couvrant la vie d'une gare durant 24 heures. A voir pour plus tard si j'ai envie de perfectionner ce petit interlude.

Le programme :
en zip : annonce gare 3.bas
en listing :
(il y a un départ toutes les minutes dès le lancement du programme à cause d'une variable "essai" qui vaut 1. La mettre à zéro pour respecter les horaires fixés dans train$()
Code VB :
 
'Affichage hall de gare

'pour mise au point ou démo :
'essai=1 ajuste automatiquement le départ des train au lancement du programme
'et selon un intervalle constant
'essai=0 respecte les horaires spécifiés dans le tableau "trains()"
essai=1
intervalle=1    'minutes d'intervalles entre deux trains, actif si essai=1

'initialisation
nomainwin
ecart=100   'en milliseconde, durée nécessaire pour changer de symbole sur un afficheur
ntrain=-1   'numéro du premier train à afficher, -1 à l'initialisation
alphabet$=" ABCDEFGHIJKLMNOPQRSTUVWXYZ+-.*/0123456789"  'jeu de caractères des afficheurs
lenalpha=len(alphabet$)
 
'table des trains
nbtrains=7 : dim train$(nbtrains)
entete$=  "TRAIN    DEPART  DESTINATION              VOIE"
train$(0)="TGV6128  21H45 - MARSEILLE SAINT CHARLES -  A"
train$(1)="TER512   21H57 - MIRAMAS SALON DE PROV.  -  E"
train$(2)="TER2232  22H10 - LYON PART DIEU          -  D"
train$(3)="ARBALETE 22H24 - TOULOUSE MATABIAU       -  B"
train$(4)="AF0717   22H42 - LONDRES HEATROW         -  2"
train$(5)="TER627   22H50 - DIJON VILLE             -  A"
train$(6)="TGV4555  23H05 - LYON PERRACHE           -  D"
 
'horaire selon lancement du programme (1) ou horaires présent dans train$() (0)
if essai=1 then
 
    gosub [donne_heure]
    h$=left$(time$(),5) 'on ne garde qu'heures et minutes
    heure$=right$("00"+str$(heure),2)
    minute$=right$("00"+str$(minute),2)
 
    'et on remplace l'horaire présent dans train$()
    for a=0 to nbtrains-1
        minute=minute+intervalle
        if minute>59 then minute=0:heure=heure+1
        if heure>23 then heure=0
        heure$=right$("00"+str$(heure),2)
        minute$=right$("00"+str$(minute),2)
        a$=train$(a)
        train$(a)=left$(a$,9)+heure$+"H"+minute$+right$(a$,31)
    next
end if
 
'tableau des départs
nblignes=5      'nombre de lignes du tableau
capaligne=45    'nombre d'afficheurs disponibles dans une ligne
dim tableau$(nblignes,capaligne)    'tableau des départs
dim debut(capaligne)                'numéro du caractère présentement affiché
dim fin(capaligne)                  'numéro du caractère qui va le remplacer

 
'Tableau d'affichage heure+trains au départ
WindowWidth=800
WindowHeight=190
statictext #w.st,"",145,20,560,20
graphicbox #w.h1, 10,40,111,111
graphicbox #w.gb, 135,40,520,111
graphicbox #w.h2, 670,40,111,111
open "Tableau des Départs" for window as #w
 
    #w, "trapclose [quitter]"
 
    #w.st, "!font liberation_mono 12"   'fonte à chasse fixe nécessaire
    #w.st, entete$
 
    #w.gb, "down"
    #w.h1, "down"
    #w.h2, "down"
 
    gosub [dessin_horloges_et_afficheur]
    gosub [donne_heure]
    gosub [affiche_heure]
    gosub [verifie_departs_et_affiche_tableau_des_departs]
 
    'initialisation tableau des départs
    for a=0 to capaligne-1
        tableau$(0,a)=" "
    next
 
    'actualisation de l'heure en continu, minute par minute
    'si l'heure a changé, on voit s'il faut réafficher les départs
    [top]
        ancienh$=h$ : gosub [donne_heure]
        if h$<>ancienh$ then
            gosub [affiche_heure]
            gosub [verifie_departs_et_affiche_tableau_des_departs]
        end if
        scan    'évite que la boucle [top] tourne indéfiniment
        goto [top]
 
    wait
 
'****************** sous-programmes **************

[donne_heure]
    h$=left$(time$(),5) 'ne garder qu'heures et minutes
    heure=val(left$(h$,2))
    minute=val(right$(h$,2))
    minuthorloge=heure*60+minute
    return
 
[dessin_horloges_et_afficheur]
    'bloc afficheur
    #w.gb, "fill darkgray;color yellow;backcolor darkgray"
    #w.gb, "font liberation_mono 12"
 
    'horloge 1
    'dessin des graduations des minutes
    #w.h1, "fill darkgray;color green;size 1"
    mn=360/60
    for a=1 to 60
        #w.h1, "home;turn ";mn;";go 48"
    next
    #w.h1, "home;backcolor darkgray;color darkgray;circlefilled 42"
 
    'dessin des graduations des heures
    #w.h1, "color yellow;size 2"
    hr=360/12
    for a=1 to 12
        #w.h1, "home;turn ";hr;";go 47"
    next
    #w.h1, "home;backcolor darkgray;color darkgray;circlefilled 37"
 
    'horloge 2
    'dessin des graduations des minutes
    #w.h2, "fill darkgray;color green;size 1"
    mn=360/60
    for a=1 to 60
        #w.h2, "home;turn ";mn;";go 48"
    next
    #w.h2, "home;backcolor darkgray;color darkgray;circlefilled 42"
 
    'dessin des graduations des heures
    #w.h2, "color yellow;size 2"
    hr=360/12
    for a=1 to 12
        #w.h2, "home;turn ";hr;";go 47"
    next
    #w.h2, "home;backcolor darkgray;color darkgray;circlefilled 37"
 
    return
 
[affiche_heure]
   'on efface l'heure précédente
    #w.h1, "home;backcolor darkgray;color darkgray;circlefilled 37"
    #w.h2, "home;backcolor darkgray;color darkgray;circlefilled 37"
 
    'on affiche la nouvelle heure :
    'heures
    degres=heure*hr+minute*0.5
    #w.h1, "color yellow;home;turn ";degres;";go 28;turn ";degres*-1
    #w.h2, "color yellow;home;turn ";degres;";go 28;turn ";degres*-1
 
    'minutes
    degres=minute*mn
    retour0=degres*-1
    #w.h1, "color yellow;home;turn ";degres;";go 34;turn ";degres*-1
    #w.h2, "color yellow;home;turn ";degres;";go 34;turn ";degres*-1
 
    return
 
[verifie_departs_et_affiche_tableau_des_departs]
    'recherche du premier train à afficher en fonction de l'heure
    'l'heure actuelle est en minutes, et se trouve dans "minuthorloge"

    'en cette minute, quel est le premier train à afficher ?
    bcl=0   'index de boucle pour faire le tour de la liste des trains
    exntrain=ntrain
    fin=0
    while fin=0
 
        'heure de départ du train, convertie en minutes
        ht=val(mid$(train$(bcl),10,2))
        mt=val(mid$(train$(bcl),13,2))
        minutedepart=ht*60+mt
 
        'trouver le train le plus proche du départ
        if minutedepart>minuthorloge then ntrain=bcl : fin=1
 
        'si on a étudié tous les trains
        if bcl=nbtrains then fin=1 else bcl=bcl+1
 
    wend
 
    if ntrain<>exntrain then
        for tabligne=0 to nblignes-1
            'afficher les destinations au tableau
            'future ligne de caractères à afficher
            if ntrain+tabligne>=nbtrains then
                lf$=space$(capaligne)
            else
                lf$=train$(ntrain+tabligne)
            end if
            gosub [afficheligne]
        next
    else
        'pour effacer la dernière ligne affichée sur le tableau
        if bcl=nbtrains then
            bcl=0   'pour ne pas revenir plusieurs fois
            tabligne=0 'ligne à effacer
            lf$=space$(capaligne)
            gosub [afficheligne]
        end if
    end if
 
    return
 
[afficheligne]
    'recherche des bornes de l'animation pour chaque afficheur
    for b=1 to capaligne
        scan
        index=b-1
        'attribution du symbole à l'afficheur
        actuel$=tableau$(tabligne,index)
        futur$=mid$(lf$,b,1)
 
        'limites pour chaque symbole de la ligne
        for a=1 to lenalpha
            a$=mid$(alphabet$,a,1)
            if a$=actuel$ then debut(index)=a':print "caractère ";a;", début=";debut(index)
            if a$=futur$ then fin(index)=a':print "caractère ";a;", fin=";fin(index)
        next
 
        'nombre de pas
        if fin(index)<debut(index) then fin(index)=fin(index)+lenalpha
        nbpas=fin(index)-debut(index)
        if nbpasmax<nbpas then nbpasmax=nbpas
        print "nbpas=";nbpas;" nbpasmax=";nbpasmax
    next
 
    'affichage de l'animation
    for pas=0 to nbpasmax
        aff$=""
        for b=0 to capaligne-1
            scan
            pa=debut(b)+pas
            if pa<=fin(b) then
                if pa>lenalpha then pasactuel=pa-lenalpha else pasactuel=pa
                    'pa peut faire deux tours d'alphabet$
                    tableau$(tabligne,b)=mid$(alphabet$,pasactuel,1)
                end if
        next
 
        'temporisation
        tac=0
        t=time$("ms")
        while tac=0
            if t+ecart<time$("ms") then tac=1
        wend
 
        'construction de la ligne
        aff$=""
        for c=0 to capaligne-1
            aff$=aff$+tableau$(tabligne,c)
        next
 
        'affichage de la ligne
        #w.gb, "place 10 ";(tabligne+1)*20
        #w.gb, "\";aff$
 
    next
    return
 
[quitter]
    close #w
    end
 
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia7+ Wine (Pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 29/03/2021 à 01h48

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2489
Et alors ? on n'aligne plus les colonnes ? Y a du laisser aller. :)
____________________
Roro

   
Le 29/03/2021 à 09h52

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 741
Normalement elles devraient... Tu as changé le nom de la fonte ?
Je n'ai rien changé.
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia7+ Wine (Pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Général » Affichage de hall de gare Une ptite chose en passant  

 |  |

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