Nous sommes actuellement le 08 Sep 2010, 11:19



Publier un nouveau sujet Répondre au sujet  [ 4 messages ] 
Auteur Message
 Sujet du message: [C] Un clavier pour votre programme
MessagePublié: 08 Mars 2010, 14:31 
Hors-ligne
Rédacteur

Inscrit le: 06 Jan 2009, 19:45
Messages: 677
Bonjour!
Aujourd'hui je vais vous apprendre a faire un clavier en C, avec la libge.

Nous allons donc faire un petit programme tout simple qui demande le nom de l'utilisateur, et qui l'affiche.

Code:
/*Tuto clavier pour XtreamLua par Leo (TheGecko)*/
/*-------------------------------------------------------*/
/* Includes*/
#include <string.h>
#include <pspkernel.h>
#include <libge/libge.h>

PSP_MODULE_INFO("Clavier", PSP_MODULE_USER, 0, 1);
PSP_HEAP_SIZE_KB(2048);


//-------------------Prototypes des fonctions-------------------
void KeyBoard( char* chaineY, ge_Image * fond, char * Desc, ge_Font* Police);

Vous voyez qu'on a deja definit notre fonction keyboard, nous reviendrons dessus tout a l'heure.
Code:
//-------------------Main-------------------
int main(int args, char** argc)
{
   geInit();//Initialise la LibGE
   SceCtrlData pad;//Variable pour les touches
   SceCtrlData oldpad;//Seconde variable pour les touches, pour pouvoir faire des comparaisons
   sceCtrlReadBufferPositive(&oldpad, 1);//On remplie une fois le oldpad, pour pouvoir faire les premieres comparaisons
   ge_Image *fond = geCreateSurface(480, 272, RGB(255, 255, 355));//On charge l'image de fond
   char Desc[100] = "Entrez votre nom";//Description pour le clavier
   char nom[100];//Chaine qui va contenir notre nom
   
   ge_Font* Police = geLoadFont("./DejaVuSans.ttf");//On charge la police
   
//-------------------Boucle principale-------------------
   for(;;)//Boucle infinie
   {
      KeyBoard( &*nom, fond, Desc, Police);//On lance le clavier
      geBlitImage( 0, 0, fond, 0, 0, fond->width, fond->height, 1);//On affiche l'image de fond
      geFontPrintScreen(10, 10, Police, nom, RGB(0,0,0));//On affiche le nom
      geSwapBuffers();//On swap les buffers
      oldpad = pad;//On attribue la valeur de pad a oldpad
      do
      {
         sceCtrlReadBufferPositive(&pad, 1);
      }
      while(!(pad.Buttons & PSP_CTRL_CROSS));//Tant que l'on appuie pas sur croix
   }
}

Jusque ici ca coule de source, nous reviendrons sur l'appel du clavier plus tard
Code:
//------------------Fonctions-------------------
void KeyBoard( char * chaineY, ge_Image * fond, char * Desc, ge_Font* Police )
{
   SceCtrlData pad;//Variables pour les touches
   SceCtrlData oldpad;
   sceCtrlReadBufferPositive(&oldpad, 1);//On remplie une fois le oldpad, pour pouvoir faire les premieres comparaisons
   geFontSize(Police, 18);//On definit la taille de la police a 18 pxl
   strcpy(chaineY,"");//On vide la chaine
   //Code pour le clavier
   char clavier[6][13][2]=
   {
      {"~","!","@","#","$","%","^","&","*","(",")","_","+"},
      {"`","1","2","3","4","5","6","7","8","9","0","-","="},
      {"q","w","e","r","t","y","u","i","o","p","[","]","|"},
      {"a","s","d","f","g","h","j","k","l",";","'","{","}"},
      {"z","x","c","v","b","n","m",",",".","/","<",">","?"},
      {":"," "," "," "," "," "," "," "," "," "," "," "," "}//Vous pouvez remplir les blancs avec d'autres caracteres
   };

C'est ici que ca se corse, vous voyez que l'on crée un tableau a trois dimmensions, c'est a dire, ici : un tableau a places, qui contiennent chacune un tableau a 13 places, qui elles memes contiennent un tableau a deux place, ce qui va donc nous permettre de stocker 156 variables.
Je sais ce que vous vous dites: "Pourquoi 3 séries de tableau, moi je n'en vois que 2?" Eh bien non, car rappelez vous que les char* (les chaines de caracteres) sont des tableau de char, comme on veut pouvoir utiliser les fonction de la librairie string.h, on crée des tableaux de char a deux place (notre caractere, et le caractere nul qui est ajouté par le compilateur)

Bon et maintenant si on veut afficher notre caractere "g", qui se trouve dans le 5eme tableau du 4eme tableau, il faudra appeler afficher clavier[4][3].
:O Pourquoi [4][3]? Parcque les initialisations commencent a 0, "~" est donc dans clavier[0][0].
Code:
   int i, j;//variables pour les for
   ge_Image * ImgClavier = geLoadImage("image.jpg");//image de fond d'une touche
   ge_Image * ImgchaineY = geLoadImage("image2.jpg");//image de fond de la saisie
   int x=0;//coordonnées x du selecteur
   int y=0;//coordonnées y du selecteur

Ici rien de sorcier, mais je dois vous donner les deux images chargées:
a renommer image.jpg
Image
a renommer image2.jpg
Image
Code:
   while (1)
   {
      //----Calculs----
      sceCtrlReadBufferPositive(&pad, 1);
      //Deplacements du curseur
      if((pad.Buttons & PSP_CTRL_UP) && !(oldpad.Buttons & PSP_CTRL_UP) && (y > 0))
         {y--;}
      else if((pad.Buttons & PSP_CTRL_DOWN) && !(oldpad.Buttons & PSP_CTRL_DOWN) && (y < 5))
         {y++;}
      else if((pad.Buttons & PSP_CTRL_LEFT) && !(oldpad.Buttons & PSP_CTRL_LEFT) && (x > 0))
         {x--;}
      else if((pad.Buttons & PSP_CTRL_RIGHT) && !(oldpad.Buttons & PSP_CTRL_RIGHT) && (x < 12))
         {x++;}
      //Ajout d'un caractere si : croix
      if ((pad.Buttons & PSP_CTRL_CROSS) && !(oldpad.Buttons & PSP_CTRL_CROSS))
      {
         strcat(chaineY,clavier[y][x]);
      }
      //Ajout d'un espace si : Triangle
      if ((pad.Buttons & PSP_CTRL_TRIANGLE) && !(oldpad.Buttons & PSP_CTRL_TRIANGLE))
      {
         strcat(chaineY," ");//Espace
      }
      //Valider si : START
      else if ((pad.Buttons & PSP_CTRL_START) && !(oldpad.Buttons & PSP_CTRL_START))
      {
         break;
      }
      //Supression d'un caractere si : Carré
      else if ((pad.Buttons & PSP_CTRL_SQUARE) && !(oldpad.Buttons & PSP_CTRL_SQUARE))
      {
         chaineY[strlen(chaineY) - 1] = 0;
      }

Tout est commenté
strcat(chaine1, chaine2) concatene chaine2 a la suite de chaine1
Code:
//----Affichage----
      
      geBlitImage( 0, 0, fond, 0, 0, fond->width, fond->height, 1);//On affiche l'image de fond
      for ( i = 0; i < 6 ; i++)
      {
         for ( j = 0; j < 13; j++)
         {
            geBlitImage(j*30+20,i*30+20, ImgClavier, 0, 0, ImgClavier->width, ImgClavier->height, 1);
            geFontPrintScreen(j*30+26, i*30+25, Police, clavier[i][j], RGB(0,0,0));
         }
         
      }

Vous remarquerez ici que l'on fait une double boucle for, pour parcourir notre double tableau (on ne prends pas en compte les chaines (la troisieme serie de tableaux) ici, on les affiche integralement).
Code:
      geBlitImageNegative(x*30+20,y*30+20, ImgClavier, 0, 0, ImgClavier->width, ImgClavier->height);//On affiche la touche selectionnée en negatif
      geFontPrintScreen(x*30+26, y*30+25, Police, clavier[y][x], RGB(255,255,255));//On affiche les texte de la touche selectionné en blanc
      geFontPrintScreen(1, 1, Police, Desc, RGB(0,0,0));//On affiche la description
      geBlitImage(2, 200, ImgchaineY, 0, 0, ImgchaineY->width, ImgchaineY->height,1);//On affiche le fond de la saisie
      geFontPrintScreen(12, 205, Police, chaineY, RGB(0,0,0));//on affiche la saisie
      oldpad = pad;
      geSwapBuffers();
   }
   return;

notre fonction
Code:
void KeyBoard( char * chaineY, ge_Image * fond, char * Desc, ge_Font* Police )

prends donc comme parametres: l'adresse du pointeur vers la chaine a modifier, une image de fond a afficher, la police a utiliser

Le makefile:
Code:
TARGET = LibGE_sample
OBJS = main.o

CFLAGS = -O2 -G0 -Wall
CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti
ASFLAGS = $(CFLAGS)

LIBS = -lge -lm -lpsprtc -lfreetype

EXTRA_TARGETS = EBOOT.PBP
PSP_EBOOT_TITLE = Clavier

PSPSDK=$(shell psp-config --pspsdk-path)
include $(PSPSDK)/lib/build.mak


Le code complet: http://pastebin.com/0yiiPyJ2

L'archive complete: http://redline.media.officelive.com/Doc ... lavier.rar

_________________
Visitez mon blog de dessin, et n'hesitez pas a faire de la pub autour de vous: http://www.thegecko.fr


Haut
 Profil  
 
 Sujet du message: Re: [TUTO][C] Un clavier pour votre programme
MessagePublié: 08 Mars 2010, 16:37 
Hors-ligne
Modérateur
Avatar de l’utilisateur

Inscrit le: 17 Août 2009, 13:22
Messages: 1033
Localisation: St Laurent de Chamousset (69)
Merci à toi

_________________
-> Clique ici pour avoir accès à mon blog <-

Co-Admin d'Xtreamlua, Graphiste, Développeur C et LUA.

Merci de lire les règles en post-it et de faire ça si votre sujet est résolu


Haut
 Profil  
 
 Sujet du message: Re: [TUTO][C] Un clavier pour votre programme
MessagePublié: 14 Mars 2010, 22:55 
Hors-ligne
Rédacteur

Inscrit le: 06 Jan 2009, 19:45
Messages: 677
Je viens de voir que la librairie PSPDebug contient un clavier natif:
http://www.smartpsp.net/programmation-s ... bugkb.html
Pour ceux que ca intéresse :D

_________________
Visitez mon blog de dessin, et n'hesitez pas a faire de la pub autour de vous: http://www.thegecko.fr


Haut
 Profil  
 
 Sujet du message: Re: [C] Un clavier pour votre programme
MessagePublié: 14 Avr 2010, 14:46 
Hors-ligne
Rédacteur

Inscrit le: 06 Jan 2009, 19:45
Messages: 677
UP!
J'ai adapté le clavier en Lua, en le modifiant pour qu'il ne renvoie que des nombres:
viewtopic.php?f=95&p=55086#p55086

_________________
Visitez mon blog de dessin, et n'hesitez pas a faire de la pub autour de vous: http://www.thegecko.fr


Haut
 Profil  
 
Afficher les messages publiés depuis:  Trier par  
Publier un nouveau sujet Répondre au sujet  [ 4 messages ] 

Qui est en ligne ?

Utilisateur(s) parcourant actuellement ce forum : Aucun utilisateur inscrit et 0 invité(s)


Tu ne peux pas publier de nouveaux sujets dans ce forum
Tu ne peux pas répondre aux sujets dans ce forum
Tu ne peux pas éditer tes messages dans ce forum
Tu ne peux pas supprimer tes messages dans ce forum

Rechercher pour:
Aller vers:  
Theme designed by stylerbb.net & programy © 2008
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Traduction réalisée par Maël Soucaze © 2010 phpBB.fr
Heures au format UTC + 1 heure [ Heure d’été ]