/*************************************************************
Utilisation du clavier : buffer = comme en console avec getch
*************************************************************/

#include <allegro.h>

// Fonction générant une couleur aléatoire
int couleur_alea()
{
    return makecol(rand()%256,rand()%256,rand()%256);
}

int main(int argc, char *argv[])
{
    int touche;
    char carac;
    int scancode;
    int fin;

    srand(time(NULL));

    allegro_init();

    //pour disposer du clavier
    install_keyboard();

    set_color_depth(desktop_color_depth());
    if (set_gfx_mode(GFX_AUTODETECT_WINDOWED,800,600,0,0)!=0)
    {
        allegro_message("prb gfx mode");
        allegro_exit();
        exit(EXIT_FAILURE);
    }

    // Spécifique pour clavier via BUFFER ...
    // void set_keyboard_rate(int delay, int repeat);
    // permet de modifier la répétition automatique des touches clavier :
    //     après "delay" temps en milliseconde
    //     chaque répétition a lieu tous les "repeat" millisecondes
    // passer 0,0 interdit la répétition de touche pour le buffer clavier

    // set_keyboard_rate(1000,200);

    fin=0;
    while (!fin)
    {

        // keypressed() : équivalent allegro du kbhit()
        if (keypressed())
        {
            // récupérer la touche avec readkey() : équivalent allegro du getch()
            touche=readkey();

            // a partir de l'info de touche on obtient le caractère en castant en char
            carac=(char)touche;

            // tester si la touche appuyée correspond à espace
            if (carac==' ')
                textprintf_ex(screen,font,360,300,makecol(255,255,0),makecol(0,0,0),"  ESPACE  ");
            else
                textprintf_ex(screen,font,360,300,makecol(0,255,255),makecol(0,0,0),"PAS ESPACE");

            // a partir de l'info de touche on obtient le scancode sur le 2ème octet
            // permet d'obtenir les touches non caractères (directions, effacer ...)
            scancode=touche>>8;

            // Si touche EFFACER alors effacer écran
            if (scancode==KEY_BACKSPACE)
                clear_bitmap(screen);

            // on peut aiguiller selon le scancode avec un switch
            // ( ce qui est impossible avec l'utilisation directe key[KEY_...] )
            switch (scancode)
            {
            case KEY_UP :
                circlefill(screen, 300+rand()%200,   0+rand()%200, 20, couleur_alea());
                break;

            case KEY_DOWN :
                circlefill(screen, 300+rand()%200, 400+rand()%200, 20, couleur_alea());
                break;

            case KEY_LEFT :
                circlefill(screen,   0+rand()%200, 200+rand()%200, 20, couleur_alea());
                break;

            case KEY_RIGHT :
                circlefill(screen, 600+rand()%200, 200+rand()%200, 20, couleur_alea());
                break;

            case KEY_ESC :
                fin=1;
                break;
            }
        }
    }

    return 0;
}
END_OF_MAIN();