7

lundi 30 novembre 2015

[PHP] Utiliser ncurse pour des petits projets php

Alors oui, le curse c'est pas vraiment aimé, puis on en croise de moins en moins. N’empêche que j'aime bien ça,  c'est classe et faire du curse en php c'est rigolo.


La lib Ncurse pour php est "standard" et le man Ncurse peut du coup être utilisé.

Pourquoi  faire ce petit article ?
Pour présenter la lib en php, faire une petite introduction du fonctionnement ...
Au final cette article est peut étre plus pour moi qu'autre chose.

! ATTENTION !
Les programmes écrit en C ont généralement deux fonctionnement True/False.
1) Ceux qui utilisent -1 en cas d'erreur et sinon 0 (plus répandus);
2) Ceux qui font l'inverse (plus classique);
Ncurse est le 1er cas, ne l'oubliez pas dans vos structures de testes.

Installation :
- Installer Ncurse
- Installe PECL
- $ svn checkout http://svn.php.net/repository/pecl/ncurses/ ncurses
- $ cd ncurses/tags/ncurses-1.0.2/trunk/

// J'ai un problème avec cette extension et PECL du coup ...
- $ pecl build

// Sois je copie a la main (crade)
- # cp <LienRetournéParPecl> /usr/lib/php/modules/

// Sois je compille puis install
- $ ./configure && make
- $ sudo make install OU # make install

Les pages a garder sous la main :
- Les couleurs prés définies
- Les Clés du clavier (les clés sont des int 8bit)
- Les actions de souris
- La liste des fonctions de Ncurse (a utiliser avec un ctrl+f)

La base :

Initialiser ncurse puis le détruire.
je vous donne le contenu de mes fonction, la source à la fin.
// Initialisation de la lib
ncurses_init();
// Désactivation de la souris
ncurses_curs_set(0);

// Vérifier si les couleurs sont supporté et les activer
if (ncurses_start_color() === -1) {
    exit('ERR : ncurses_newwin => Color not supported !');
}

// On enregistre la nouvelle window; // (0, 0, 0, 0) = Nombre de rangés, de colonnes, position x, y
$this->window = ncurses_newwin(0, 0, 0, 0);

// On check si la fenêtre est bien initialisé
if ($this->window !== -1) {
    ncurses_refresh();
    // Taille de la fenêtre,  STDSCR = default window, retourne height/width
    ncurses_getmaxyx(STDSCR, $this->size['height'], $this->size['width']);

    ncurses_noecho(); // Ne rien afficher d'exterieur
} else {
    exit('ERR : ncurses_newwin => FAIL !');
}

Histoire d'utiliser exit() proprement on utilise ici __destruct()
    private function __destruct() {
        $this->envSound();
        ncurses_end();
    }
Pour check les inputKey c'est simple, a savoir que les fonction de ncurses sont bloquantes donc pas vraiment intéressantes ... L'astuce est tout simplement d'ouvrir stdin en lecture, le définir comme non bloquant, puis de le lire ... Easy ! Il ne reste qu'a faire un switch pour gérer l'action de vos input.
    private function getStdin()
    {
            $stdin = fopen('php://stdin', 'r');
            stream_set_blocking($stdin, false);
            $this->usedKey = fread($stdin, 1);
    }

En gros voici la base, aprés il y a deux trois fonctions utile qu'il peut étre compliqué a comprendre ou trouver.

Ma fonction de "d'affichage" ce compose de :
- ncurses_wclear // Vide la fenetre
- ncurses_wrefresh // Rafraichir la fenetre
- ncurses_getmaxyx // Reprendre la taille de la fenêtre pour s'adapter a un resize
- ncurses_border // Retirer toutes bordures
pour ce qui concerne le petit coup de nettoyage avant affichage,
 - ncurses_wattron // Remplace les attributs de la fenêtre taille de police, couleur de fond ...
 - ncurses_wattroff // Retour a la normale
 - ncurses_wcolor_set // Changer les couleurs, dépends des couleurs déclaré avec ncurses_init_pair
voila ce qui concerne la partie mise en forme, puis un petit coup de rafraichissement
 - ncurses_wmove // Sortir le curseur du champ (dans ce cas précis)
 - ncurses_wrefresh // Rafraichir la fenetre

Pour gérer l'affichage de char on utilise juste
ncurses_wmove // Bouger le curseur où l'on veut afficher le char
ncurses_waddstr // Ajouter un char a l'emplacement du curseur
Il suffit de faire une boucle pour afficher une string

--- --- ---

Ba rien qu'avec cette mini base là il est possible de faire tout ce que l'on veut ou presque, que ce soit du jeux comme des logiciels. C'est vraiment super simple et pour les personnes qui ne font que du php ça fait le job !

La lib est pas vraiment pas lourde, elle ne bloque pas php (contrairement a php-gtk)
et est simple d'utilisation. En même temps cette lib a toujours était génial, php ou pas.

Voici la source de mon petit snake, bien sur il y a beaucoup d’améliorations possibles, je ne fais notamment que trés rarement du PHP OO, là ce fut un choix pour la porté des variables principalement, et la volonté de faire ça "propre" mais en un seul fichier.
C'est codé pas trop salement et en quelque heures sur deux jours.
http://inuit.iglou.eu/iglou.adrien/Snake/blob/master/snake

Prochaine fois petit tour sur PHP-GTK histoire de pas trop en chi*r si vous voulez débuter avec, je nais pas fini mon projet avec et ne le finirais jamais ...
C'est insupportable (pour moi) de ne pas gérer mes boucles et interactions à la main.



éa, les amis.

Aucun commentaire:

Enregistrer un commentaire