Aller au menu - Aller au contenu

Icône Les événements

Avatar
Avatar
Mise à jour : 14/10/2009
Difficulté : Facile Facile
282 visites depuis 7 jours, classé 354/786
Essayez de créer un jeu sans gérer l'appui des touches et le stylet... Difficile, hein ? :D Nous allons donc nous attaquer à cette tâche qui, comme nous allons le voir, est trop très facile !
Sommaire du tutoriel :
Icône du chapitre
Chapitre précédent Sommaire Chapitre suivant

Configurer l'émulateur

On va d'abord configurer les touches de no$gba, de DeSmuMe et de iDeaS. Si vous avez un autre émulateur, il faudra vous débrouiller ! :p

Pour no$gba


Faites F11 ou Options->Controls Setup.
Regardez la colonne de droite. Cliquez dans l'espace blanc à droite de la commande (ex : Up) et appuyez sur la touche de clavier désirée pour appeler cette commande.

Image utilisateur
Configuration de snake_48 :-°

Pour DeSmuMe


Faites Config->Control Config.
Cliquez dans le menu déroulant à droite de la commande et appuyez sur la touche de clavier désirée pour appeler cette commande.

Pour iDeaS


Faites Ctrl+K ou Options->Key Config.
Appuyez sur le bouton correspondant à la commande et appuyez sur la touche du clavier désirée pour l'appeler.

Les touches

Les touches sont représentées par la structure nommée "Pad". Cette structure en renferme d'autres :
  • Newpress : nouvel appui (elle était dure, la traduction :p ) ;
  • Held : touche enfoncée ;
  • Released : touche relâchée.

Et chacune de ces structures-membres ont des membres correspondant aux touches :
  • Up
  • Down
  • Left
  • Right
  • A
  • B
  • X
  • Y
  • L
  • R
  • Start
  • Select
  • Anykey : n'importe quelle touche

Ces membres renvoient 0 ou 1 en fonction de la structure-membre qu'on appelle et, bien sûr, de l'action du joueur ;) . On peut ainsi avoir ceci :
Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
/*Mettre le début du code*/
while(1)
{
    if(Pad.Newpress.A==1) //Si l'utilisateur fait un NOUVEL appui sur A
    /* instruction */
 
    else if(Pad.Held.R==1) //Si l'utilisateur laisse son doigt appuyé sur la touche R
    /* instruction */
 
    else if(Pad.Released.X==1) //Si l'utilisateur relâche la touche X
    /* instruction */
 
    PA_WaitForVBL();
}
/*Mettre la fin du code*/

On peut remplacer :

Code : C
1
if(Pad.Newpress.A==1)

Par :
Code : C
1
if(Pad.Newpress.A)

Ainsi que :
Code : C
1
if(Pad.Newpress.Y==0)

Par :
Code : C
1
if(!Pad.Newpress.Y)

Mais je pense que l'utilisation des booléens est déjà acquise pour la plupart ;) .

Le stylet !

Vous vous demandiez tous "Comment gère-t-on le stylet ?", eh bien ouvrez grand vos yeux ! Image utilisateur
Le stylet est appelé par la structure "Stylus".
Celle-ci contient cinq membres : X et Y (vous avez sûrement deviné que ceci renvoie les coordonnées du stylet), Newpress, Held et Released :
Code : C
1
2
3
4
5
6
7
8
/*Mettre le début du code*/
PA_LoadDefaultText(0,0);
while(1)
{
    PA_OutputText(0,0,0,"( %d ; %d )    ", Stylus.X, Stylus.Y);
    PA_WaitForVBL();
}
/*Mettre la fin du code*/


Avouez tout de même qu'on ne pouvait pas faire plus simple :D !

Si vous affichez ce code et que le stylet n'a pas touché l'écran vous vous retrouverez avec de fausses valeurs ! C'est pour cela que la suite est importante ;) .

Le DS Motion Pak

Le DS Motion quoi ? o_O

Vous avez très bien lu, le DS Motion Pak (non il ne manque pas un "c" :p ).
Qu'est-ce que c'est ? Il s'agit d'un accéléromètre (un appareil qui mesure les mouvements de l'objet sur lequel il est fixé) pour votre Nintendo DS. Il se met dans le SLOT 2 (port GBA) et ressemble à ceci (cliquez pour agrandir) :

Image utilisateur

Il existe une version qui se met dans le SLOT 1 (port NDS),que je n'utiliserai pas dans ce tutoriel, appelé DS Motion Card (pour ceux qui mettent leurs homebrews sur un linker GBA) :

Image utilisateur

Bien sûr, ce n'est pas gratuit >_< . En effet, il faut compter 30 à 40 € pour l'un ou l'autre.
Mais je ne regrette pas l'achat. On peut contrôler des éléments, et tout ça sans bouton (donc ça nous libère des possibilités pour créer un jeu certes moins compatible, mais plus poussé). De plus, ça met une ambiance à la Wii ^^ . Un conseil, évitez de vous faire filmer quand vous jouez à un jeu nécessitant le Motion :-° ...

Maintenant que les présentations sont faites, je vais vous annoncer une bonne nouvelle : PALib implémente totalement le Motion !

Tout d'abord, il faut initialiser le système Motion avec void PA_MotionInit(void); .
Ensuite, il faut savoir si le DS Motion Pak est inséré. Pour ça il existe la fonction u8 PA_CheckDSMotion(); . Cette fonction retourne 0 si le DS Motion Pak n'est pas inséré ou 1 s'il l'est.

Et comment faire pour récupérer les données de l'accéléromètre ?

Il existe une variable Motion de type motion_struct.
Voici ses attributs :
  • X : la rotation dans les X. Cette valeur varie entre -128 (droite) et 128 (gauche).
  • Y : la rotation dans les Y. Cette valeur varie environ entre -134 (console verticale, vous ne voyez pas les écrans) et 114 (console verticale, écrans vers vous).
  • Z.
  • Vx.
  • Vy.
  • Vz.
  • AccelX.
  • AccelY.
  • AccelZ.
  • Zrot.
  • Vzrot.
  • Angle.
  • Force.


Sachez que dans tous les codes utilisant Motion, seuls les membres X et Y sont utilisés. Vous pouvez cependant tester les membres avec PA_OutputText en tournant et en déplaçant votre Nintendo DS dans tous les sens :D !

Attendre un événement

Vous avez sûrement vu les fausses valeurs indiquées pour les coordonnées du stylet lorsque l'on n'a pas encore touché l'écran.
On va utiliser PA_WaitFor(evenement) prenant pour argument l'événement à attendre.
Sachez que la macro fait déjà un appel à PA_WaitForVBL(); donc si vous en faites encore un après, vous ralentirez considérablement (de 2 fois) votre application.

Voici un petit exemple :
Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#include <PA9.h>
 
int main(int argc, char ** argv)
{
    PA_Init();
        
    PA_LoadDefaultText(1,0);
 
    while(1)
    {
        PA_WaitFor(Stylus.Held); //Si on appuie ou si on reste appuyé
        PA_OutputText(1,0,0,"( %d ; %d )", Stylus.X, Stylus.Y);
        PA_ClearTextBg(1);
    }
    return 0;
}

On se retrouve quand même avec de fausses valeurs ! o_O Comment faut-il faire ?

Bonne question ^^ , en fait il est toujours bon de mettre 3 ou 4 rafraîchissements (PA_WaitForVBL(); ) avant le la boucle principale, pour "dérouiller" en quelque sorte la NDS :
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);

    PA_WaitForVBL();PA_WaitForVBL();PA_WaitForVBL();

    while(1)
    {
        PA_WaitFor(Stylus.Held);
        PA_ClearTextBg(1);
        PA_OutputText(1,0,0,"( %d ; %d )", Stylus.X, Stylus.Y);
    }
    return 0;
}

Mais vous pouvez aussi initialiser le stylet comme ceci par exemple :
Code : C
1
2
Stylus.X=0;
Stylus.Y=0;

Exercice

Pour vous faire pratiquer avant le TP, je vous propose un petit exercice :) .

Présentation


  • Votre programme doit récupérer les dernières coordonnées du stylet (utilisez simplement des conditions).
  • Il doit les afficher si l'on appuie sur la touche B.
  • Si l'utilisateur n'a pas encore utilisé le stylet, on affiche :
    Code : Console
    Utilise le stylet !

    sinon :
    Code : Console
    x : 10, y : 211

    par exemple.


À vous de jouer ! ;)

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
#include <PA9.h>
 
int main(int argc, char ** argv)
{
    PA_Init();
        
    PA_InitText(1,0);
 
    while(1)
    {
        if(Pad.Held.B)
        {
            PA_OutputText(1,0,0,"Utilise le stylet !");
            if(Stylus.Held)
            {
                PA_ClearTextBg(1); //On efface l'écran
                PA_OutputText(1,0,0,"x : %d, y: %d",Stylus.X,Stylus.Y);
            }
        }
        PA_WaitForVBL();
        PA_ClearTextBg(1); //On efface l'écran
    }
    return 0;
}

Q.C.M.

Quelle est la variable qui exprime l'ensemble des touches de la Nintendo DS ?
Quel est le sous-membre qui vaut 1 lorsque l'on maintient le stylet appuyé sur l'écran tactile ?

Statistiques de réponses au QCM

C'était pas si dur, et un jeu est composé de beaucoup d'événements !
Chapitre précédent Sommaire Chapitre suivant

Partager

11 commentaires pour "Les événements"
Note moyenne : 3.57 / 4 (65 votes)
Pseudo Commentaire
Hors ligne Guybrush51 # Posté le 26/03/2010 à 17:06:06

Les fonctions motion de la Palib marchent-elles avec la cartouche "Montion Pack" (slot 2) vendue avec le jeu "Tony Hawk's Motion" ?
Si non, quelqu'un connaîtrait-il un moyen de l'utiliser pour le développement de Homebrew sur DS (avec la Palib ou non) ?
Merci d'avance !
Hors ligne snake_48 # Posté le 26/03/2010 à 17:36:34
Il me manque un bit.
Avatar

Études : INSA Lyon

Le meilleur moyen c'est d'essayer, hein. Mais je ne pense pas que ce soit incompatible, à vérifier...

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 aiatar # Posté le 30/11/2010 à 17:38:32

Bonjour,

Je voudrai savoir s'il est possible de gerer les evenement du stylet sans le motion Pak.
Hors ligne snake_48 # Posté le 30/11/2010 à 17:39:48
Il me manque un bit.
Avatar

Études : INSA Lyon

Oui bien sûr, les deux sont indépendants.

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 à 15:57:22
Avatar

Avis : Bon

Bon, mon code était un peu différent mais ça a le mérite de fonctionner. :p

je préfère le signaler mais regarder bien votre DOC (pour ma part, elle est en français) car :

Code : C
1
PA_LoadDefaultText


cette fonction n'existe pas suivant la version que vous avez.

à l'initialisation, je l'ai remplacé par:



Code : C
1
PA_InitText(1,0);


ça fait la même chose avec les mêmes arguments.

sinon, quoi, à la compilation, il vous dira : warning : implicit declaration
et ensuite, vous aurez une erreur de : undefinited arguments:

voilà, si ça peut aider certains . :)

++

Voir tous les commentaires