Gestione del cursore in una finestra console e matrix effect

di il
50 risposte

50 Risposte - Pagina 3

  • Re: Gestione del cursore in una finestra console e matrix effect

    @ale99 una cosa: ho letto il tuo programma, è stato molto utile, ho imparato ad esempio come fare a gestire la probabilità, io mi ero inventato un modo assurdo invece era molto più facile ahah
    Comunque il fatto che le varie lettere cambino in modo più o meno veloce è voluto o no? Perchè se si leggendo il programma non capisco in che punto del codice l'hai messo...
  • Re: Gestione del cursore in una finestra console e matrix effect

    Scusate ho fatto un errore da principiante,ovvero il classico buffer overflow:
    for (i = SZ_H; i > 0 ; i--)
    va editata in
    for (i = SZ_H - 1; i > 0 ; i--)
    con mio rammarico vede che usate ancora la system per colorare il testo.
    Allora la funzione con_setcolor usa l'api di windows per colorare il testo,il colore è definito in una variabile a 8bit ovvero un nibble(4bit==16 valori) identifica lo sfondo e il secondo il colore del testo.
    Si avrà cosi che
    
    con_setcolor( (0x1 << 4 ) | 0x4);
    //oppure
    con_setcolor( 0x14);
    
    sarà sfondo verde su testo rosso
    
    con_setcolor( (0x3 << 4 ) | 0x05);
    //oppure
    con_setcolor( 0x35);
    
    sarà sfondo acqua su testo porpora.

    Ecco la tabella colori
    7 => default
    0 => black
    1 => blue
    2 => green
    3 => aqua
    4 => red
    5 => purple
    6 => yellow
    7 => light gray
    8 => gray
    9 => light blue
    A => light green
    B => light aqua
    C => light red
    D => light purple
    E => light yellow
    F => white
    ora non avete piu scuse per continuare ad usare funzioni deprecate quale sia la system.

    StaticKing l'ultimo codice da te postato non è funzionante perchè usi vettori senza inizializzarli.
    ale99 che è una fucilata di caratteri ???? ehhehehe

    provo a far qualcosina....
  • Re: Gestione del cursore in una finestra console e matrix effect

    void colorset(unsigned short color)
    {
        HANDLE hconsole  = GetStdHandle(STD_OUTPUT_HANDLE);
        SetConsoleTextAttribute(hconsole,color);
    }
    e dove vedi la system() ?

    Comunque il fatto che le varie lettere cambino in modo più o meno veloce è voluto o no? Perchè se si leggendo il programma non capisco in che punto del codice l'hai messo...
    e' questo
    void changeSymbol()
    {
        for(i=0; i<X; i++)
            for(j=0; j<Y; j++)
                if(matrice[i][j].c!=symbol[0] && matrice[i][j].pos!=0)
                    if(rand() % 5 == 0)
                        matrice[i][j].c=newSymbol();
    
        return;
    }
    
    ale99 che è una fucilata di caratteri ???? ehhehehe
    Wtf? Cosa intendi?? Ma hai fatto a schermo intero o adattato X e Y alla tua finestra?

    Se vanno troppo veloci, ci sono troppe/troppo poche linee, cambia caratteri troppo velocemente/letamente, ecc.. basta inserire una Sleep() o variare "i rand()"
  • Re: Gestione del cursore in una finestra console e matrix effect

    
    #define SCR_W 80
    #define SCR_H 24
    #define STATO_WRITE 0
    #define STATO_LOOP 1
    #define STATO_ERASE 2
    #define PROB 1
    
    typedef struct _TXTMX
    {
        int stato;
        int icol;
        char b[SCR_H];
        int i;
        int sz;
        int r;
        struct _TXTMX* next;
    }TXTMX;
    
    TXTMX* txt_new()
    {
        static char ch[] = "abcdefghijklmnopqrstuvwxyz";
    
        TXTMX* txt = malloc(sizeof(TXTMX));
    
        txt->sz = mth_randomrange(4,SCR_H - 2);
        txt->next = NULL;
        txt->r = mth_random(SCR_H - txt->sz);
        txt->i = 0;
        txt->icol = mth_random(SCR_W - 1);
        txt->stato = STATO_WRITE;
        int i;
        for (i = 0 ; i < txt->sz ; i++)
            txt->b[i] = ch[mth_random((sizeof ch) - 1)];
        txt->b[txt->sz] = '\0';
        return txt;
    }
    
    void txt_remove(TXTMX** h,TXTMX* r)
    {
        TXTMX* tmp;
    
        if (*h == r)
        {
            tmp = r->next;
            free(r);
            *h = tmp;
            return;
        }
    
        for (tmp = *h; tmp->next && tmp->next != r; tmp = tmp->next);
    
        if (tmp->next)
        {
            TXTMX* tx = tmp->next;
            tmp->next = tx->next;
            free(tx);
        }
    }
    
    void txt_add(TXTMX** h,TXTMX* n)
    {
        if (!*h)
        {
            *h = n;
            return;
        }
    
        n->next = *h;
        *h = n;
    }
    
    void txt_draw(TXTMX** head)
    {
    
        TXTMX* h = *head;
    
        for ( ; h; h = h->next)
        {
            con_gotorc(h->r + h->i,h->icol);
            if (h->stato == STATO_WRITE || h->stato == STATO_LOOP)
            {
                if ( h->b[h->i] == '\0' )
                {
                    h->stato = (mth_random(1)) ? STATO_LOOP : STATO_ERASE;
                    h->i = 0;
                    continue;
                }
                con_setcolor(CON_COLOR_BK_WHYTE,CON_COLOR_GREEN);
                putchar(h->b[h->i]);
                if ( h->i )
                {
                    con_setcolor(CON_COLOR_BK_BLACK,CON_COLOR_GREEN);
                    con_gotorc(h->r + h->i - 1,h->icol);
                    putchar(h->b[h->i -1]);
                }
                h->i++;
                fflush(stdout);
            }
            else if ( h->stato == STATO_ERASE)
            {
                if (h->b[h->i] == '\0')
                {
                    txt_remove(head,h);
                    h = *head;//sarebbe meglio continuare in altro modo
    
                    if (h == NULL) return;
                    continue;
                }
                con_setcolor(CON_COLOR_BK_BLACK,CON_COLOR_GREEN);
                putchar(' ');
                h->i++;
                fflush(stdout);
            }
        }
    
    }
    
    int main()
    {
        mth_initrandom();
        con_cls();
        TXTMX* head = NULL;
    
        while(1234)
        {
            if (!mth_random(PROB))
            {
                txt_add(&head, txt_new() );
            }
    
            if (head) txt_draw(&head);
    
            thr_sleep(150);
        }
    
        return 0;
    }
    
    per voi sarà:
    
    #define SCR_W 80
    #define SCR_H 24
    #define STATO_WRITE 0
    #define STATO_LOOP 1
    #define STATO_ERASE 2
    #define PROB 1
    
    typedef struct _TXTMX
    {
        int stato;
        int icol;
        char b[SCR_H];
        int i;
        int sz;
        int r;
        struct _TXTMX* next;
    }TXTMX;
    
    void con_gotoxy (short x,short y)
    {
        HANDLE hconsole  = GetStdHandle(STD_OUTPUT_HANDLE);
        COORD coord = {x, y};
        SetConsoleCursorPosition (hconsole,coord );
    }
    
    void con_cls()
    {
        HANDLE hconsole  = GetStdHandle(STD_OUTPUT_HANDLE);
        CONSOLE_SCREEN_BUFFER_INFO csbi;
        const COORD startCoords = {0,0};
        DWORD dummy;
        GetConsoleScreenBufferInfo(hconsole,&csbi);
        FillConsoleOutputAttribute(hconsole,0,csbi.dwSize.X * csbi.dwSize.Y,startCoords,&dummy);
        FillConsoleOutputCharacter(hconsole,' ',csbi.dwSize.X * csbi.dwSize.Y,startCoords,&dummy);
        con_gotoxy(0,0);
    }
    
    void con_colorset(unsigned short color)
    {
        SetConsoleTextAttribute(hconsole,color);
    }
    
    void mth_initrandom()
    {
        srand((unsigned)time(NULL));
    }
    
    int mth_random(int n)
    {
        return rand() % (n+1);
    }
    
    int mth_randomrange(int min,int max)
    {
        return min + (rand() % (max-min+1));
    }
    
    TXTMX* txt_new()
    {
        static char ch[] = "abcdefghijklmnopqrstuvwxyz";
    
        TXTMX* txt = malloc(sizeof(TXTMX));
    
        txt->sz = mth_randomrange(4,SCR_H - 2);
        txt->next = NULL;
        txt->r = mth_random(SCR_H - txt->sz);
        txt->i = 0;
        txt->icol = mth_random(SCR_W - 1);
        txt->stato = STATO_WRITE;
        int i;
        for (i = 0 ; i < txt->sz ; i++)
            txt->b[i] = ch[mth_random((sizeof ch) - 1)];
        txt->b[txt->sz] = '\0';
        return txt;
    }
    
    void txt_remove(TXTMX** h,TXTMX* r)
    {
        TXTMX* tmp;
    
        if (*h == r)
        {
            tmp = r->next;
            free(r);
            *h = tmp;
            return;
        }
    
        for (tmp = *h; tmp->next && tmp->next != r; tmp = tmp->next);
    
        if (tmp->next)
        {
            TXTMX* tx = tmp->next;
            tmp->next = tx->next;
            free(tx);
        }
    }
    
    void txt_add(TXTMX** h,TXTMX* n)
    {
        if (!*h)
        {
            *h = n;
            return;
        }
    
        n->next = *h;
        *h = n;
    }
    
    void txt_draw(TXTMX** head)
    {
    
        TXTMX* h = *head;
    
        for ( ; h; h = h->next)
        {
            con_gotorc(h->r + h->i,h->icol);
            if (h->stato == STATO_WRITE || h->stato == STATO_LOOP)
            {
                if ( h->b[h->i] == '\0' )
                {
                    h->stato = (mth_random(1)) ? STATO_LOOP : STATO_ERASE;
                    h->i = 0;
                    continue;
                }
                con_setcolor(0xF2);
                putchar(h->b[h->i]);
                if ( h->i )
                {
                    con_setcolor(0x02);
                    con_gotorc(h->r + h->i - 1,h->icol);
                    putchar(h->b[h->i -1]);
                }
                h->i++;
                fflush(stdout);
            }
            else if ( h->stato == STATO_ERASE)
            {
                if (h->b[h->i] == '\0')
                {
                    txt_remove(head,h);
                    h = *head;//sarebbe meglio continuare in altro modo
    
                    if (h == NULL) return;
                    continue;
                }
                con_setcolor(0x02);
                putchar(' ');
                h->i++;
                fflush(stdout);
            }
        }
    
    }
    
    int main()
    {
    
        con_cls();
        mth_initrandom();
        
        TXTMX* head = NULL;
    
        while(1234)
        {
            if (!mth_random(PROB))
            {
                txt_add(&head, txt_new() );
            }
    
            if (head) txt_draw(&head);
    
            Sleep(150);
        }
    
        return 0;
    }
    
    non so se ho riportato bene il codice nella seconda versione fatemi sapere.

    eccovi uno screen shoot.
    Allegati:
    10039_03f0512553ea592f32120ce26714a320.png
    10039_03f0512553ea592f32120ce26714a320.png
  • Re: Gestione del cursore in una finestra console e matrix effect

    @ale99: correggimi se sbaglio: tu con quella riga di comando dici che ogni carattere che non sia nero ha il 20% di probabilità di variare quindi chiaramente alcuni varieranno altri no, dando un effetto simile a quello che dicevo io... ok non è proprio come dovrebbe essere secondo me, ma ci sta...

    @vbextreme: il system l'ho usato io,illumina un povero principiante, perchè non andrebbe bene?
    Una cosa per provare ad eseguire il tuo programma come devo fare? Perchè ho provato a copiare e incollare la seconda che hai messo e mi dà un pò di errori, dove sbaglio?
  • Re: Gestione del cursore in una finestra console e matrix effect

    Allora quando chiami la system lanci un eseguibile .exe che fa l'operazione e poi ritorni al programma.
    Insomma non è il massimo per un programmatore.

    Per il codice l'ho detto che non sapevo come andava sotto windows,comunque se oltre a dire cosa non va mi dici anche gli errori che riporta te lo correggo al volo.

    ho omesso tutti gli header ma sono i classici
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <time.h>
    #include <windows.h>
    dopo aver messo questi header compila e dimmi gli errori.
  • Re: Gestione del cursore in una finestra console e matrix effect

    Ok con tutte le librerie che hai messo mi da solo questo:
    47|error: 'hconsole' undeclared (first use in this function)|
    E' quella per il colore, al massimo la levo e provo coi caratteri bianchi...
  • Re: Gestione del cursore in una finestra console e matrix effect

    @ StaticKing
    per quell'errore scrivi
    HANDLE hconsole  = GetStdHandle(STD_OUTPUT_HANDLE);
    Per i colori usa la funzione che aveva postato nella pag precedente

    Si, quella funzione fa proprio quello. Tu a cosa avevi pensato?



    @vbextreme
    solo questi due errori nella seconda versione

    in TXTMX* txt_new()
    TXTMX* txt = (TXTMX*) malloc(sizeof(TXTMX));
    in void txt_draw(TXTMX** head)
    con_gotorc(h->r + h->i,h->icol);   ////>not defined
  • Re: Gestione del cursore in una finestra console e matrix effect

    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <time.h>
    #include <windows.h>
    
    #define SCR_W 80
    #define SCR_H 24
    #define STATO_WRITE 0
    #define STATO_LOOP 1
    #define STATO_ERASE 2
    #define PROB 1
    
    typedef struct _TXTMX
    {
        int stato;
        int icol;
        char b[SCR_H];
        int i;
        int sz;
        int r;
        struct _TXTMX* next;
    }TXTMX;
    
    void con_gotoxy (short y,short x)
    {
        HANDLE hconsole  = GetStdHandle(STD_OUTPUT_HANDLE);
        COORD coord = {x, y};
        SetConsoleCursorPosition (hconsole,coord );
    }
    
    void con_cls()
    {
        HANDLE hconsole  = GetStdHandle(STD_OUTPUT_HANDLE);
        CONSOLE_SCREEN_BUFFER_INFO csbi;
        const COORD startCoords = {0,0};
        DWORD dummy;
        GetConsoleScreenBufferInfo(hconsole,&csbi);
        FillConsoleOutputAttribute(hconsole,0,csbi.dwSize.X * csbi.dwSize.Y,startCoords,&dummy);
        FillConsoleOutputCharacter(hconsole,' ',csbi.dwSize.X * csbi.dwSize.Y,startCoords,&dummy);
        con_gotoxy(0,0);
    }
    
    void con_setcolor(unsigned short color)
    {
        HANDLE hconsole  = GetStdHandle(STD_OUTPUT_HANDLE);
        SetConsoleTextAttribute(hconsole,color);
    }
    
    void mth_initrandom()
    {
        srand((unsigned)time(NULL));
    }
    
    int mth_random(int n)
    {
        return rand() % (n+1);
    }
    
    int mth_randomrange(int min,int max)
    {
        return min + (rand() % (max-min+1));
    }
    
    TXTMX* txt_new()
    {
        static char ch[] = "abcdefghijklmnopqrstuvwxyz";
    
        TXTMX* txt = malloc(sizeof(TXTMX));
    
        txt->sz = mth_randomrange(4,SCR_H - 2);
        txt->next = NULL;
        txt->r = mth_random(SCR_H - txt->sz);
        txt->i = 0;
        txt->icol = mth_random(SCR_W - 1);
        txt->stato = STATO_WRITE;
        int i;
        for (i = 0 ; i < txt->sz ; i++)
            txt->b[i] = ch[mth_random((sizeof ch) - 1)];
        txt->b[txt->sz] = '\0';
        return txt;
    }
    
    void txt_remove(TXTMX** h,TXTMX* r)
    {
        TXTMX* tmp;
    
        if (*h == r)
        {
            tmp = r->next;
            free(r);
            *h = tmp;
            return;
        }
    
        for (tmp = *h; tmp->next && tmp->next != r; tmp = tmp->next);
    
        if (tmp->next)
        {
            TXTMX* tx = tmp->next;
            tmp->next = tx->next;
            free(tx);
        }
    }
    
    void txt_add(TXTMX** h,TXTMX* n)
    {
        if (!*h)
        {
            *h = n;
            return;
        }
    
        n->next = *h;
        *h = n;
    }
    
    void txt_draw(TXTMX** head)
    {
    
        TXTMX* h = *head;
    
        for ( ; h; h = h->next)
        {
            con_gotoxy(h->r + h->i,h->icol);
            if (h->stato == STATO_WRITE || h->stato == STATO_LOOP)
            {
                if ( h->b[h->i] == '\0' )
                {
                    h->stato = (mth_random(1)) ? STATO_LOOP : STATO_ERASE;
                    h->i = 0;
                    continue;
                }
                con_setcolor(0xF2);
                putchar(h->b[h->i]);
                if ( h->i )
                {
                    con_setcolor(0x02);
                    con_gotoxy(h->r + h->i - 1,h->icol);
                    putchar(h->b[h->i -1]);
                }
                h->i++;
                fflush(stdout);
            }
            else if ( h->stato == STATO_ERASE)
            {
                if (h->b[h->i] == '\0')
                {
                    txt_remove(head,h);
                    h = *head;//sarebbe meglio continuare in altro modo
    
                    if (h == NULL) return;
                    continue;
                }
                con_setcolor(0x02);
                putchar(' ');
                h->i++;
                fflush(stdout);
            }
        }
    
    }
    
    int main()
    {
    
        con_cls();
        mth_initrandom();
       
        TXTMX* head = NULL;
    
        while(1234)
        {
            if (!mth_random(PROB))
            {
                txt_add(&head, txt_new() );
            }
    
            if (head) txt_draw(&head);
    
            Sleep(150);
        }
    
        return 0;
    }
    
    forse cosi va... ho anche invertito i nomi dei parametri in gotoxy perchè nella versione gotorc sono invertiti infatti gotoRowCol
    L'altro errore è dovuto al fatto che ho prelevato il codice dalla libreria e mi son dimenticato di modificarlo per questo caso specifico,comunque ho corretto.
    Fatemi sapere cosa ne pensate.
  • Re: Gestione del cursore in una finestra console e matrix effect

    Copiando la funzione handle hconsole mi dà l'errore, nella riga dove l'ho copiata:
    |24|error: initializer element is not constant|
    @ale99: se guardi attentamente l'animazione originale, ogni simbolo cambia con una frequenza diversa in base al punto dello schermo, ma che rimane circa fissa per ogni punto, l'ho scritto anche in precedenza.

    Esempio: supponiamo di essere in M[10][10], il simbolo che è lì deve cambiare con una frequenza decisa casualmente ma che si mantiene fissa a meno di una percentuale random per tutta la durata del simbolo: es 5 cambiamenti al secondo +-1 cambiamento al secondo.
    Il carattere in un altro punto dello schermo supponiamo M[4][5]: 0.5 cambiamenti/s (cambia ogni 2 secondi) +- 0.2 cambiamenti al secondo.

    Questo sarebbe il top secondo me e credo che l'originale sia stato realizzato con un algoritmo che fa una cosa simile...
  • Re: Gestione del cursore in una finestra console e matrix effect

    No cancella tutto e ricopia tutto il codice che ho postato. aspetta ho trovato un errore di digitazione
    lo correggo:...corretto.
  • Re: Gestione del cursore in una finestra console e matrix effect

    Ora funziona . Le colonne scendono come si deve, bello anche il riquadrino bianco che scende, che lo rende più simile all'originale... però i caratteri non cambiano...
  • Re: Gestione del cursore in una finestra console e matrix effect

    A ok in che modo devono cambiare i caratteri?

    prova anche questo codice,cosi se va dopo non abbiamo piu problemi tra i vari s.o.
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #ifdef __gnu_linux__
        #include <unistd.h>
    
        #include "../deveasyconsole/easyconsole.h"
        #include "../deveasymath/easymath.h"
        #include "../deveasythread/easythread.h"
    #else
        #include <time.h>
        #include <windows.h>
    
        #define thr_sleep(MS) Sleep(MS)
        #define CON_COLOR_BK_WHYTE 0xF
        #define CON_COLOR_BK_BLACK 0x0
        #define CON_COLOR_GREEN 0x2
    
        void con_gotorc (short r,short c)
        {
            HANDLE hconsole  = GetStdHandle(STD_OUTPUT_HANDLE);
            COORD coord = {c, r};
            SetConsoleCursorPosition (hconsole,coord );
        }
    
        void con_cls()
        {
            HANDLE hconsole  = GetStdHandle(STD_OUTPUT_HANDLE);
            CONSOLE_SCREEN_BUFFER_INFO csbi;
            const COORD startCoords = {0,0};
            DWORD dummy;
            GetConsoleScreenBufferInfo(hconsole,&csbi);
            FillConsoleOutputAttribute(hconsole,0,csbi.dwSize.X * csbi.dwSize.Y,startCoords,&dummy);
            FillConsoleOutputCharacter(hconsole,' ',csbi.dwSize.X * csbi.dwSize.Y,startCoords,&dummy);
            con_gotorc(0,0);
        }
    
        void con_setcolor(unsigned char bk, unsigned char c)
        {
            HANDLE hconsole  = GetStdHandle(STD_OUTPUT_HANDLE);
            SetConsoleTextAttribute(hconsole,(bk << 4) | c);
        }
    
        void mth_initrandom()
        {
            srand((unsigned)time(NULL));
        }
    
        int mth_random(int n)
        {
            return rand() % (n+1);
        }
    
        int mth_randomrange(int min,int max)
        {
            return min + (rand() % (max-min+1));
        }
    
    #endif
    
    #define SCR_W 80
    #define SCR_H 24
    #define STATO_WRITE 0
    #define STATO_LOOP 1
    #define STATO_ERASE 2
    #define PROB  1
    #define PROBL 2
    
    typedef struct _TXTMX
    {
        int stato;
        int icol;
        char b[SCR_H];
        int i;
        int sz;
        int r;
        struct _TXTMX* next;
    }TXTMX;
    
    TXTMX* txt_new()
    {
        static char ch[] = "abcdefghijklmnopqrstuvwxyz";
    
        TXTMX* txt = malloc(sizeof(TXTMX));
    
        txt->sz = mth_randomrange(4,SCR_H - 2);
        txt->next = NULL;
        txt->r = mth_random(SCR_H - txt->sz);
        txt->i = 0;
        while ((txt->icol = mth_random(SCR_W - 1)) % 2);
        txt->stato = STATO_WRITE;
        int i;
        for (i = 0 ; i < txt->sz ; i++)
            txt->b[i] = ch[mth_random((sizeof ch) - 1)];
        txt->b[txt->sz] = '\0';
        return txt;
    }
    
    void txt_remove(TXTMX** h,TXTMX* r)
    {
        TXTMX* tmp;
    
        if (*h == r)
        {
            tmp = r->next;
            free(r);
            *h = tmp;
            return;
        }
    
        for (tmp = *h; tmp->next && tmp->next != r; tmp = tmp->next);
    
        if (tmp->next)
        {
            TXTMX* tx = tmp->next;
            tmp->next = tx->next;
            free(tx);
        }
    }
    
    void txt_add(TXTMX** h,TXTMX* n)
    {
        if (!*h)
        {
            *h = n;
            return;
        }
    
        n->next = *h;
        *h = n;
    }
    
    void txt_draw(TXTMX** head)
    {
    
        TXTMX* h = *head;
    
        for ( ; h; h = h->next)
        {
            con_gotorc(h->r + h->i,h->icol);
            if (h->stato == STATO_WRITE || h->stato == STATO_LOOP)
            {
                if ( h->b[h->i] == '\0' )
                {
                    h->stato = (mth_random(PROBL)) ? STATO_LOOP : STATO_ERASE;
                    h->i = 0;
                    continue;
                }
                con_setcolor(CON_COLOR_BK_WHYTE,CON_COLOR_GREEN);
                putchar(h->b[h->i]);
                fflush(stdout);
                if ( h->i )
                {
                    con_setcolor(CON_COLOR_BK_BLACK,CON_COLOR_GREEN);
                    con_gotorc(h->r + h->i - 1,h->icol);
                    putchar(h->b[h->i -1]);
                    fflush(stdout);
                }
                h->i++;
    
            }
            else if ( h->stato == STATO_ERASE)
            {
                if (h->b[h->i] == '\0')
                {
                    txt_remove(head,h);
                    h = *head;//sarebbe meglio continuare in altro modo
    
                    if (h == NULL) return;
                    continue;
                }
                con_setcolor(CON_COLOR_BK_BLACK,CON_COLOR_GREEN);
                putchar(' ');
                h->i++;
                fflush(stdout);
            }
        }
    
    }
    
    int main()
    {
        mth_initrandom();
        con_cls();
        TXTMX* head = NULL;
    
        while(1234)
        {
            if (!mth_random(PROB))
            {
                txt_add(&head, txt_new() );
            }
    
            if (head) txt_draw(&head);
    
            thr_sleep(150);
        }
    
        return 0;
    }
    
    dato che non mi piaceva le righe attaccate le ho separate,sembra piu pulito,appena capisco come devo cambiare i caratteri lo implemento
  • Re: Gestione del cursore in una finestra console e matrix effect

    Si, a me funziona anche l'ultima che hai messo . Per come dovrebbero cambiare i caratteri se leggi alcuni post prima l' l'ho scritto, poi se guardi attentamente il video che ho linkato soprattutto nella parte finale dove " si ingrandisce l'inquadratura", si capisce...
  • Re: Gestione del cursore in una finestra console e matrix effect

    StaticKing ha scritto:


    Copiando la funzione handle hconsole mi dà l'errore, nella riga dove l'ho copiata:
    |24|error: initializer element is not constant|
    @ale99: se guardi attentamente l'animazione originale, ogni simbolo cambia con una frequenza diversa in base al punto dello schermo, ma che rimane circa fissa per ogni punto, l'ho scritto anche in precedenza.

    Esempio: supponiamo di essere in M[10][10], il simbolo che è lì deve cambiare con una frequenza decisa casualmente ma che si mantiene fissa a meno di una percentuale random per tutta la durata del simbolo: es 5 cambiamenti al secondo +-1 cambiamento al secondo.
    Il carattere in un altro punto dello schermo supponiamo M[4][5]: 0.5 cambiamenti/s (cambia ogni 2 secondi) +- 0.2 cambiamenti al secondo.

    Questo sarebbe il top secondo me e credo che l'originale sia stato realizzato con un algoritmo che fa una cosa simile...
    Basta che nella struttura agginugi il campo "freq" che cossirponde al numero di cicli rima di un cambio. Poi nella spawnCell () assegni ogni volta questo campo in modo casuale, nella continueLine () la stessa cosa.
    Nel main c'è una variabile contatore incrementata sempre di 1.
    Nella funzione che cambia la lettera metti "if (variabile_contatore % matricexy.freq == 0) matricexy.c= newChar ();"
Devi accedere o registrarti per scrivere nel forum
50 risposte