Aller au menu - Aller au contenu

Icône Les menus et les sauvegardes

Avatar
Avatar
Mise à jour : 14/10/2009
Difficulté : Facile Facile
282 visites depuis 7 jours, classé 354/786
Vous vous demandiez comment faire un menu avec PALib ? Une seule solution (enfin, c'est la plus propre) : créer plusieurs boucles ! Nous ne ferons que de la théorie puisqu'il n'y a pas qu'une façon de faire des menus :) .
Sommaire du tutoriel :
Icône du chapitre
Chapitre précédent Sommaire Chapitre suivant

Créer un menu

Nous allons y aller en douceur ^^ pour commencer : nous allons créer un des menus les plus basiques qui soient.

Qu'est-ce qu'un menu ?


Un menu est constitué d'un arrière-plan, et d'éléments (boutons, texte, images, etc...) permettant d'accéder à diverses partie du jeu (nouveau jeu, options, etc...).

Comment créer un menu ?


Tout simplement en ajoutant une boucle :
Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#include <PA9.h>

int main(int argc,char **argv)
{
    PA_Init();
    PA_InitVBL();

    while(1) // Boucle du menu
    {
        PA_WaitForVBL();
    }

    while(1) // Boucle du jeu
    {
        PA_WaitForVBL();
    }

    return 0;
}


Bien sûr, vu que le menu appelle le jeu et que le jeu appelera le menu (si on a une fonctionnalité pour quitter le jeu), on peut créer deux fonctions : menu et jeu :
Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <PA9.h>

typedef enum Choix Choix; // Cette énumération permet de connaître le choix du joueur
enum Choix
{
    AUCUN,JOUER
};

void menu(void);
void jeu(void);

int main(int argc,char **argv)
{
    PA_Init();
    PA_InitVBL();

    menu();

    return 0;
}

void menu(void)
{
    Choix choix=AUCUN;
    while(choix==AUCUN)
    {
        PA_WaitForVBL();
    }
    
    switch(choix)
    {
        case JOUER:
            jeu();
            break;
        default:
            break;
    }
}

void jeu(void)
{
    int quitter=0;
    while(1)
    {
        if(quitter)
            break;
        PA_WaitForVBL();
    }
    menu();
}


Un bon menu, selon moi, est un menu qui comporte un arrière-plan pour les deux écrans, avec le nom du jeu sur l'écran supérieur, et les éléments du menu sur l'écran tactile.
Ce menu doit avoir deux méthodes de choix : un par le stylet et un par les touches multi-directionnelles pour déplacer un curseur avec A ou Start pour valider.
Ca c'est un bon menu basique ^^ .
A vous de réfléchir à des systèmes plus élaborés pour faire des systèmes plus originaux ;) .

Créer une sauvegarde

Tout d'abord, il faut que vous sachiez qu'on ne peut pas utiliser de chemins relatifs (à partir du dossier courant). Donc tous les noms de fichiers dans lesquels vous voudrez écrire ou lire devront être écrits en partant de la racine...



Les bases



Il faut commencer par inclure le header de FAT et stdio:
Code : C
1
2
#include <stdio.h>
#include <fat.h>

Puis on initialise FAT avec bool fatInitDefault (void); (ne vous arrêtez pas à bool , cette fonction marche très bien en C ;) ).
Le reste est ce que vous avez déjà appris en C. En effet, pour créer une variable contenant un fichier on fait :
Code : C
1
FILE *fichier=NULL;

Pour initialiser une variable il suffit de faire :
Code : C
1
fichier=fopen("fichier.ext","mode");

mode peut être "w", "wb", "r", "rb", "a", etc...
Pour fermer un fichier il faut écrire :
Code : C
1
fclose(fichier);

Pour écrire dans un fichier, on utilisera size_t fwrite(const void * contenu, size_t compte, size_t taille_du_contenu, FILE * fichier); contenu est le texte à écrire dans le fichier, compte est le nombre d'éléments (nous laisserons toujours 1), taille_du_contenu est la taille du contenu, et où fichier est le fichier.
Par exemple :
Code : C
1
2
FILE *fichier=fopen("test.txt","w");
fwrite("hello !",1,8,fichier);

Pour lire un fichier, c'est quasiment pareil :) ! On crée une chaîne de caractères vide, et on fait un appel à fread qui prend les mêmes arguments que sa cousine fwrite. Par exemple :
Code : C
1
2
3
4
char contenu[256];
FILE *fichier=fopen("test.txt","r");
fread(contenu,1,256,fichier);
/* Et voilà, la variable "contenu" contient le contenu du fichier test.txt ;) */



Lister les fichiers et les répertoires d'un dossier



On va inclure fat.h, bien sûr, mais aussi sys/dir.h pour lister le dossier courant.
On va écrire dans un fichier .txt le contenu du dossier.
Pour cela, on va devoir :
  • Créer une variable de type stat (pas de typedef donc il faudra mettre struct ). Cette variable va nous permettre de savoir si l'élément est un dossier ou un fichier.
  • Créer un tableau de char qui contiendra le nom de l'élément en cours, ainsi qu'un autre tableau qui contiendra le texte à mettre dans le fichier .txt.
  • Créer un pointeur de type DIR_ITER, cette variable représente le dossier que l'on va examiner (ici, le courant).
  • Créer un pointeur de type FILE, c'est le fichier .txt de sortie.
  • Initialiser PALib puis fat.
  • Puis ouvrir le dossier avec diropen.
  • Parcourir le dossier avec dirnext.
  • Enfin, écrire le contenu du dossier dans notre fichier .txt.

Voici à quoi ressemble notre code :
Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <PA9.h>
#include <fat.h>
#include <sys/dir.h>

int main(int argc, char ** argv)
{
    struct stat st;
    char buf[512]="",filename[256]="";
    DIR_ITER* dir = NULL;
    FILE *fichier=NULL;
    
    PA_Init();
    PA_InitVBL();
    
    PA_InitText(0,0);
    
    fatInitDefault();
    
    dir=diropen("/"); // Lit le dossier courant

    if (dir==NULL) // Le dossier n'a pas pu être lu
        PA_OutputText(0,0,0,"Une erreur est survenue, réessayez.");
    else 
    {
        PA_OutputText(0,0,0,"Lecture du dossier en cours...");
        fichier=fopen("liste.txt","w");
        while (dirnext(dir,filename,&st) == 0) 
        {
            // Si (st.st_mode&S_IFDIR) alors c'est un dossier, sinon c'est un fichier
            sprintf(buf,"%s : %s\n",(st.st_mode&S_IFDIR?"Dossier":"Fichier"),filename);
            fwrite(buf,1,sizeof(buf),fichier); // On écrit dans le fichier .txt
        }
        fclose(fichier);
        PA_OutputText(0,0,1,"Lecture du dossier termniée !");
    }
    
    while (1)
        PA_WaitForVBL();
    
    return 0;
}
A partir de maintenant, vous pouvez ajouter des menus sympas à vos jeux ;) ...
Chapitre précédent Sommaire Chapitre suivant

Partager

1 commentaire pour "Les menus et les sauvegardes"
Note moyenne : 3.57 / 4 (65 votes)
Pseudo Commentaire
Hors ligne Zéroumanie # Posté le 14/10/2009 à 18:23:15
Memento mori
Avatar

Super je l'atttendais depuis longtemps . Super sympa les gars. ^^

Code : C++
1
2
3
4
int C_to_Cpp(int C)
{
return C++;
}

o_O
 

Voir tous les commentaires