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() {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.
$this->envSound();
ncurses_end();
}
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 fenetrepour ce qui concerne le petit coup de nettoyage avant affichage,
- 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
- ncurses_wattron // Remplace les attributs de la fenêtre taille de police, couleur de fond ...voila ce qui concerne la partie mise en forme, puis un petit coup de rafraichissement
- ncurses_wattroff // Retour a la normale
- ncurses_wcolor_set // Changer les couleurs, dépends des couleurs déclaré avec ncurses_init_pair
- 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 charIl suffit de faire une boucle pour afficher une string
ncurses_waddstr // Ajouter un char a l'emplacement du curseur
--- --- ---
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:
Publier un commentaire