Aller au menu - Aller au contenu

Icône Notre premier programme

Avatar
Avatar
Mise à jour : 14/10/2009
Difficulté : Facile Facile
282 visites depuis 7 jours, classé 354/786
Maintenant, nous allons enfin commencer à programmer :) .
Sommaire du tutoriel :
Icône du chapitre
Chapitre précédent Sommaire Chapitre suivant

Le code par défaut

Dernières préparations



Il faut que vous créiez un fichier main.c (fichier C) ou main.cpp (fichier C++), selon le langage de programmation que vous avez choisi, dans le dossier "source". Si vous n'avez pas nommé le fichier main ou que vous ne l'avez pas mis dans le dossier source, alors il ne sera pas trouvé lors de la compilation.

Le code de base



Alors le voici, vous l'attendiez tous le code qu'il faut retenir par coeur :D .

Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#include <PA9.h>
 
int main (int argc, char **argv)
{
    PA_Init();
    
    while (1)
    {
        PA_WaitForVBL();
    }
    
    return 0;
}


:euh: Heu...

Pas de panique, je vais tout vous expliquer :D .

Explications


Code : C
1
#include <PA9.h>

Inclusion du header de PAlib, je suppose que vous l'aviez deviné. ;) .

Code : C
1
PA_Init();

Cette ligne est très importante ! Elle initialise PAlib (donc l'utilisation de ses fonctions), c'est pourquoi il ne faut surtout pas l'oublier :p .
Code : C
1
while (1)

Boucle blanche (ou plus communément appelée boucle infinie), c'est ici que nous mettrons nos instructions. Elle s'exécutera jusqu'à ce que l'on appuie sur le bouton power.

Code : C
1
PA_WaitForVBL();

En parlant de rafraîchissement ! Cette fonction permet de synchroniser le rafraîchissement de l'écran à 60 frames par secondes (abrégé fps) dans la boucle. Il y a 60 frames par secondes, donc on peut en déduire que les écrans de la Nintendo DS ont une fréquence de 60 Hz. N'oubliez surtout pas de la mettre sinon il se peut que votre programme soit rafraîchi beaucoup trop vite, et là c'est le plantage :-° .

Hello world !

On va y aller doucement pour les textes, sinon, on va vite se mélanger les pinceaux :lol: .

L'initialisation du texte



Il faut initialiser le texte avec la fonction PA_LoadDefaultText.
Code : C
1
void PA_LoadDefaultText ( u8 ecran, u8 background ) ;

Voici ce qu'il faut donner comme arguments à cette fonction :
  • ecran : c'est l'écran où vous voulez afficher du texte (généralement, on initialise les deux pour être tranquille) ;
    - 0 : écran tactile
    - 1 : écran du haut
  • background : C'est la surface sur laquelle vous voulez écrire votre texte (il y en a 4).
    - 0 : haute couche
    - 1 : la suivante (plus on descend, moins on est prioritaire et plus on on a de risques d'être recouvert :) )
    - 2 : la suivante
    - 3 : la dernière couche (celle qui a le plus de chance d'être recouverte)

Pour le background, cela marche de la même façon que les calques sous Photoshop.

Le texte !



Il existe la fonction u16 PA_OutputSimpleText(u8 ecran, u16 colonne, u16 ligne, const char *texte) mais elle n'est pas comparable à printf. En effet, cette fonction sert à créer un texte statique. Autrement dit, on ne peut pas afficher de variables ("%d", "%f", "%c", "%s", etc...). C'est pour cette raison que nous la laissons tomber pour privilégier la fonction :
Code : C
1
void PA_OutputText(u8 ecran, u16 x, u16 y, const char *texte, ...) ;

Cette fonction présente deux avantages : elle permet de créer un texte dynamique (grâce à l'affichage de variables modélisées par l'argument ...), et elle nous fait de la place sur le disque dur comparée à sa frangine :p .

Attention les formateurs de sortie %ld (pour les long ) et %c (pour les caractères) ne sont pas supportés ! Je suppose que beaucoup d'autres ne doivent pas l'être, mais pas de panique les principaux sont au rendez-vous. :) . Néanmoins, si cela vous perturbe, vous pouvez créer une chaîne de caractères, et via un sprintf écrire tout le texte que vous voulez, puis l'utiliser dans PA_OutputText.


Alors, analysons cette fonction :
  • u8 ecran : on choisit l'écran sur lequel écrire
    - 0 : écran tactile
    - 1 : écran du haut
  • u16 x :
    Pour le texte, on n'utilise pas les pixels, mais ce que l'on appelle des tiles ("tuiles" en français). Un tile correspond à un carré de 8*8 pixels. Et un écran NDS contient 24 lignes de 8 pixels et 32 colonnes de 8 pixels (256*192 pixels). A vous de trouver le meilleur endroit pour le rendu de votre texte.

    - valeur comprise entre 0 et 31 (puisque 256 / 8 = 32, n'oubliez pas de réfléchir en tiles !).
    Note : 31 n'est pas trop recommandé puisque votre texte est censé faire plus d'un caractère.. Et si vous dépassez, le texte sera remis à la ligne.
  • u16 y :
    - valeur comprise entre 0 et 23 (192 / 8 = 24)
    Ici si vous dépassez, votre texte ne sera pas affiché...
  • char *text : votre chaîne.
  • ... : toutes vos variables.

Ce qui donnerait :
Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <PA9.h>
 
int main(int argc, char **argv)
{
    const char *pseudo="PODS";
 
    PA_Init();
 
    PA_LoadDefaultText(1,0);//on initialise l'écran du haut à la première couche
    PA_LoadDefaultText(0,3);//on initialise l'écran tactile à une couche peu profonde (on peut se le permettre ici, on n'affichera qu'un texte)
 
    //Le texte ne changeant pas, pas besoin de le mettre dans la boucle
    PA_OutputText(1, 2,  2, "Hello World !");
    PA_OutputText(0,5,5,"Mon pseudo est %s.",pseudo);
 
    while(1)
    {
        PA_WaitForVBL();
        //Boucle infinie (inutile de l'utiliser puisqu'il n'y aura pas de changement)
    }
    return 0;
}


Avec No$GBA :
Image utilisateur

Si vous avez tout le texte d'un écran à mettre à jour, il existe cette fonction : void PA_ClearTextBg(ecran) :

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)
{
    int compteur=0;
 
    PA_Init();
 
    PA_LoadDefaultText(0,0);
 
    for(compteur = 0; compteur < 2147483647; compteur++)//On limite à la taille d'un int, c'est suicidaire mais en même temps ce n'est qu'un exemple
    {
        PA_OutputText(0,0,0,"%d",compteur);
        PA_WaitForVBL();
        PA_ClearTextBg(0);
        /* Il faudrait attendre plus longtemps pour éviter que le texte ne clignote, mais comme je l'ai dit ce n'est qu'un exemple ;) */
    }
    return 0;
}

Tadaaaa, nous y sommes arrivés :D !

Q.C.M.

Dans quel dossier dois-je mettre mes sources (.c, .h) ?
Qu'est-ce qu'un tile ?
Qu'affiche ce code (sachant que PAlib est normalement initialisée, et que le texte est initialisé sur l'écran tactile) ?

Code : C
1
PA_OutputText(0, 10, 8, "Salut toi ! Tu as %ld ans ?", 18);
Pourquoi le programme utilisant ce code n'affichera rien ?

Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#include <PA9.h>
 
int main(int argc, char **argv)
{
    PA_Init();
    PA_LoadDefaultText(1,0);
    
    long x = 10, y = 5;
 
    PA_OutputText(0,5,5,"les coordonnées sont x = %d, y = %d", x, y);
 
    while(1)
    {
        PA_WaitForVBL();
    }
 
    return 0;
}

Statistiques de réponses au QCM

Nous allons voir comment utiliser le stylet et les touches...
Chapitre précédent Sommaire Chapitre suivant

Partager

27 commentaires pour "Notre premier programme"
Note moyenne : 3.57 / 4 (65 votes)
Pseudo Commentaire
Hors ligne Ghost_anon # Posté le 09/03/2012 à 16:12:14
Avatar

Avis : Bon

Salut

bon, le dernier commentaire est assez vieux.
donc, je sais pas s'il sera lu prochainement.
après, avoir passer les 3/4 de ma journée pour configurer devKitPro, la PALib, et mon code Block (oui, je préfère développer sur code Block)

j'aurais une question, quand je veux créer un nouveau projet sur code block, que dois-je choisir?

car mon compilateur fonctionne, à partir du moment où j'ai mis les fichier: build.bat, clean.bat ,Makefile ( ça , ok, c'est comme rajouter les DLL dans le projet quand on développe en C)

et même utiliser l'émulateur pour le tester.

mais si je veux créer un nouveau projet et l'écrire par le biais de mon IDE favori (vu que ça fait + d'un mois que j'écris avec),
je choisis quoi? ARM project ... ???

en tout cas, cette console, je l'adore, alors, si je peux développer et tester avec mon IDE ça serait extra, et allier deux plaisirs en un :)

pour le moment, je vais dans deux dossiers différents (un pour écrire et l'autre pour compiler), je compile et ça marche sur ma Ds! donc, c'est pas un soucis, mais j'aimerai pouvoir le faire direct avec code block.

bien à vous
Hors ligne snake_48 # Posté le 09/03/2012 à 19:11:13
Il me manque un bit.
Avatar

Études : INSA Lyon

Pourquoi ne pas utiliser simplement un éditeur de texte comme Notepad++ , sachant que si tu as mis build.bat dans ton dossier c'est que tu as l'intention de t'en servir, donc que tu vas utiliser ce .bat pour compiler ?

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 Ghost_anon # Posté le 10/03/2012 à 08:12:36
Avatar

Avis : Bon

Salut Snake

merci déjà pour m'avoir répondu aussi vite!

Pour répondre à ta question, j'aime bien en fait cette IDE, dût à son indentation automatique , une fois les includes mis, les réf des variables ,fonctions, constantes, etc.. sont elles aussi automatiques, ça m'évite pas mal d'erreurs genre, accolades oubliées à la sortie d'un switch, minuscules et Majuscules , fin tu vois ,quoi!

et pour te dire, je connais pas notepad ++, mais je verrais, si ça change rien ,pourquoi pas! :)

je viens de trouver le no$zoomer ,ça, c'est bien utile :)

++ (sûrement :) )
Hors ligne snake_48 # Posté le 10/03/2012 à 08:53:57
Il me manque un bit.
Avatar

Études : INSA Lyon

Notepad++ est orienté programmeur. Il possède une très bonne coloration syntaxique pour de nombreux langages, si tu cliques sur une parenthèse, un crochet ou une accolade, il repère celle qui lui est conjuguée pour ne pas se perdre dans un flot de symboles (ça peut arriver). Juste, peut-être il ne gère pas l'auto-complétion (je ne sais pas, je ne l'utilise pas à 100% de ses capacités). Après, tu vas compiler avec build.bat, et ne pas utiliser de débugger d'IDE (va débugger un .nds avec C::B ^^ ), alors autant utiliser un éditeur plutôt que d'utiliser un IDE comme un simple éditeur...
Aussi, PAlib se fait vieille et obsolète, il y a pas mal de risques que ça compile mal selon le devkitARM, si tu veux quelque chose à jour et qui fonctionne, regarde plutôt du côté de la libnds.

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 Ghost_anon # Posté le 10/03/2012 à 10:40:44
Avatar

Avis : Bon

Ok, super, merci, Snake, pour ces infos, je suis dessus justement :p

il faut que je m'adapte, mais mais bon, pour débuter, c'est déjà bien

en plus, les tutos sont clairs et bien faits comme tous ceux du site , d'ailleurs.

Vive les Zeros :D

Voir tous les commentaires