Aller au menu - Aller au contenu

Icône Des fonctionnalités utiles

Avatar
Avatar
Mise à jour : 14/10/2009
Difficulté : Facile Facile
282 visites depuis 7 jours, classé 354/786
Tous les jeux officiels (de DS) auxquels vous avez joués se mettent en pause lorsque vous refermez votre DS, récupèrent le nom de votre utilisateur, etc.
Nous allons apprendre à récupérer toutes ces données.
Sommaire du tutoriel :
Icône du chapitre
Chapitre précédent Sommaire Chapitre suivant

Les fonctions et les structures !

Vérifier si l'écran supérieur est rabattu



PAlib a créé une fonction pour ce cas, c'est void PA_CheckLid() . Cette fonction renvoie 1 si c'est fermé, et la Nintendo DS se met automatiquement en pause...
Code : C
1
2
3
4
5
6
7
/*Mettre le code de début*/
while(1)
{
    PA_CheckLid();
    PA_WaitForVBL();
}
/*Mettre le code de fin*/

Si vous voulez simplement savoir si la Nintendo DS est fermée (sans pause), vous pouvez utiliser la macro PA_LidClosed() .
Si vous voulez savoir si la Nintendo DS est fermée, avec pause et en jouant un son (que vous choisissez), vous pouvez utiliser la macro PA_CloseLidSound(canal,son) , et si vous voulez mettre un son quand elle est fermée et un quand elle se réouvre, il faut utiliser la macro PA_CloseLidSound2(canal,son_ferme,son_ouvert) .

Récupérer le temps



La structure "PA_RTC" continent des membres exprimant la date :
  • Seconds : les secondes ;
  • Minutes : les minutes ;
  • Hour : les heures ;
    Si le nombre retourné est négatif, précisez que c'est le matin ou alors ajoutez douze heures.
  • Day : le jour ;
  • Month : le mois ;
  • Year : l'année, renvoie 0 pour 2000, 1 pour 2001, etc.

On peut écrire :

Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#include <PA9.h>
 
int main(int argc, char ** argv)
{
        PA_Init();
        PA_InitVBL();
 
        PA_InitText(0,0);
        
        while (1)
        {               
                PA_OutputText(0, 2, 10, "%02d/%02d/%02d", PA_RTC.Day, PA_RTC.Month, PA_RTC.Year); // Date
                PA_OutputText(0, 2, 12, "%02d:%02d  %02d secondes", PA_RTC.Hour, PA_RTC.Minutes, PA_RTC.Seconds); // Time
                PA_WaitForVBL();
        }
        return 0;
}


Récupérer les données de l'utilisateur


La structure "PA_UserInfo" a pour membres :
  • Name : le nom de l'utilisateur ;
  • BdayDay : le jour de l'anniversaire ;
  • BdayMonth : le mois de l'anniversaire ;
  • Language : la langue de la DS, utile pour faire de bons jeux :
    - 0 : japonais ;
    - 1 : anglais ;
    - 2 : français ;
    - 3 : allemand ;
    - 4 : italien ;
    - 5 : espagnol.
  • Message : le message de l'utilisateur ;
  • AlarmHour : l'heure de l'alarme programmée ;
  • AlarmMinute : la minute de l'alarme programmée ;
  • Color : la couleur préférée de l'utilisateur.



Faire vibrer votre Nintendo DS



Pour ceux qui auraient un Rumble Pak (un composant qui permet des vibrations), vous pouvez l'utiliser dans vos homebrews, et simplement :soleil: ! Ce que nous allons voir ne dépend pas de PALib, mais de la libnds.
Il faut vérifier si le Rumble Pak est inséré avec bool isRumbleInserted(void); . Cette fonction renvoie vrai lorsque le Rumble Pak est inséré, et faux dans le cas contraire.
A présent, on peut faire vibrer notre Rumble Pak avec void setRumble(bool position); . Si position est vraie, votre Nintendo DS se met à vibrer. A l'inverse, si position est fausse, votre Nintendo DS s'arrête de vibrer.

N'oubliez pas qu'à chaque appel à la vibration, il doit y avoir un arrêt, sinon votre Nintendo DS ne fera que vibrer !



Jouer avec la luminosité de l'écran



Une seule fonction permet de régler la luminosité d'un écran, applaudissons void PA_SetBrightness(u8 ecran, s8 brillance); :p ! La valeur de brillance doit varier entre -31 et 31. Si sa valeur est négative, l'écran penchera vers le noir (-31 est le noir complet). A l'inverse, si sa valeur est plus grande que 0 l'écran penchera vers le blanc(31 est le blanc total). Mettez brillance à 0 et vous aurez un éclairage normal. Cette fonction est souvent utilisée dans les transitions, les splashes et les menus.

Exercice

Présentation


Maintenant, on va faire un jeu qui annonce à l'utilisateur dans combien de jours son anniversaire viendra ou alors depuis combien de jour il est passé.
Il faut que la DS affiche :
Code : Console
Votre anniversaire est dans [1] [2].


Ou :
Code : Console
Votre anniversaire est passé de [1] [2].


Ou encore :
Code : Console
Joyeux anniversaire !


[1] est le nombre de jours et [2] est "jour" au singulier ou au pluriel, à vous d'étudier les cas ;) . Pour mettre jour au singulier ou au pluriel, il est conseillé de déclarer d'abord la variable contenant le mot, puis d'utiliser la fonction sprintf (pensez à inclure string.h !).


Aide


Il faudra d'abord créer une variable de type double qui va transformer la date actuelle (mois et jour) en nombre de jours. Vous devez donc trouvez un système pour convertir des mois en jours (d'où le double).
Ensuite, il faudra appliquer ce même système pour la date d'anniversaire.
Puis, on créera une fonction pour arrondir des doubles.
On mettra dans une variable de type int le résultat arrondi (d'où la fonction) de la différence entre la date d'anniversaire et la date actuelle.
Si cette différence est plus grande que 1 ou plus petite que -1, il faudra mettre "jour" au pluriel, sinon on le met au singulier.
Si la différence est négative, on affiche :
Code : Console
Votre anniversaire est passé de [1] [2].


La différence étant négative, il faut la mettre en positif avant de la montrer à l'utilisateur.


Si la différence est positive, on affiche :
Code : Console
Votre anniversaire est dans [1] [2].


Si la différence est égale à zéro, on affiche :
Code : Console
Joyeux anniversaire !


Correction


Secret (cliquez pour afficher)
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
#include <PA9.h>
#include <string.h>
 
int arrondir(double);
 
int main(int argc, char ** argv)
{
    PA_Init();
    PA_InitVBL();
        
    PA_InitText(1,0);
 
    double date_actuelle=((double)PA_RTC.Month/12.*365.)+(double)PA_RTC.Day;
    double date_anniv=((double)PA_UserInfo.BdayMonth/12.*365.)+(double)PA_UserInfo.BdayDay;
    int difference=arrondir(date_anniv-date_actuelle);
    char jour[6]="";
    if(difference<-1||difference>1)
        sprintf(jour,"jours");
    else
        sprintf(jour,"jour");
    if(difference<0)
        PA_OutputText(1,0,0,"Votre anniversaire est passé de %d %s.",-difference,jour);
    else if(difference>0)
        PA_OutputText(1,0,0,"Votre anniversaire est dans %d %s.",difference,jour);
    else
        PA_OutputText(1,0,0,"Joyeux anniversaire !");
        
    while (1)
    {
        PA_WaitForVBL();
    }
    return 0;
}
 
int arrondir(double nombre)
{
    if(nombre-(int)nombre>=.5)
        nombre+=.5;
    return (int)nombre;
}


Explications pour la fonction arrondir :
La variable nombre est un double. Si l'on fait (int)nombre, on obtiendra sa troncature à l'unité. Autrement dit, vous aurez la partie entière de nombre. La règle de l'arrondi est :
Citation
Si la décimale qui suit la décimale de la limite de l'arrondi est plus grand que 4, la décimale de la limite de l'arrondi est augmentée de 1.
En gros, si vous avez 4,45 ; son arrondi au dixième sera 4,5 ; et son arrondi à l'unité sera 4.

Donc si la différence entre nombre et sa troncature à l'unité (on obtient sa partie décimale) est supérieure ou égale à 0,5 alors on augmente nombre de 0,5 pour que (int)nombre prenne la valeur entière +1 de nombre.
On aurait aussi très bien pu faire :
Code : C
1
2
3
4
5
6
7
int arrondir(double nombre)
{
    if(nombre-(int)nombre>=.5)
        return (int)nombre+ 1;
    else
        return (int)nombre;
}


Il ne faut pas oublier le prototype de la fonction "arrondir".
Explications du main :
Tout d'abord, on initialise PAlib et le texte sur l'écran supérieur (ça aurait pu être l'écran tactile aussi).
Pour mettre un mois en jour, il faut utiliser la proportionnalité. Il y a douze mois et trois cent soixante-cinq jours (au diable les années bissextiles :p ). Il faut donc diviser le numéro du mois par douze et multiplier le résultat par trois cent soixante-cinq. A ce résultat, il faut bien sûr ajouter le numéro du jour.
Bon, voilà c'était quand même assez facile :) .
Chapitre précédent Sommaire Chapitre suivant

Partager

4 commentaires pour "Des fonctionnalités utiles"
Note moyenne : 3.57 / 4 (65 votes)
Pseudo Commentaire
Hors ligne hugotore # Posté le 27/03/2009 à 22:14:44

Intéressant, intéressant.
Un peu la flemme de coder, mais c'est sympa. On attend avec impatience la suite !
Bon courage ;)
Hors ligne snake_48 # Posté le 27/03/2009 à 22:17:05
Il me manque un bit.
Avatar

Études : INSA Lyon

Merci, on a fait 5 chapitres sur 7 de la prochaine partie, mais on va d'abord s'occuper des failles trouvées par Mollusk :) .

Programmez sur votre Wii ! | Programmez sur votre Nintendo DS ! | Charger des fichiers .OBJ | Introduction au scripting avec Python
Création d'un moteur physique (en cours)
Code Lyoko Strategy Game Coder
Langages connus : AS3, Batch, C, C++, HTML, Java, Javascript, PHP, Python.
Programme sur : PC, Nintendo DS, Wii.
o----}=========>
 
Hors ligne Nadrieril # Posté le 03/03/2010 à 21:43:07
Un clavier azerty en vaut 2...
Avatar

On pourrait trouver une fonction "arrondir" plus simple (même si elle l'est déjà):
Code : C
1
2
3
4
int arrondir(double nombre)
{
    return (int)(nombre+.5)
}


Par exemple, si on a 2.45, on aura (int)2.95, donc 2.
En revanche, si on a 2.55, on aura (int)3.05, donc 3.
Hors ligne snake_48 # Posté le 04/03/2010 à 13:53:21
Il me manque un bit.
Avatar

Études : INSA Lyon

Bien sûr (il manque le point-virgule ;) ), tu peux le faire comme tu veux ^^ .

Programmez sur votre Wii ! | Programmez sur votre Nintendo DS ! | Charger des fichiers .OBJ | Introduction au scripting avec Python
Création d'un moteur physique (en cours)
Code Lyoko Strategy Game Coder
Langages connus : AS3, Batch, C, C++, HTML, Java, Javascript, PHP, Python.
Programme sur : PC, Nintendo DS, Wii.
o----}=========>
 

Voir tous les commentaires