Dolphin et les homebrews

Dans un article précédent j’avais mentionné que l’émulateur Dolphin avait un problème avec l’infrarouge de la Wii Remote. Eh bien ce problème a été réglé. En effet, il est désormais possible de contrôler le pointeur d’une Wii Remote à l’aide de la souris de votre ordinateur. C’est un avancement formidable pour ceux qui testent leur homebrew avec ce logiciel.

C’est un programmeur du nom de godisgovernment qui a finalement fixé le problème à la révision 6177. Cette modification ne fait donc pas partie de la version 2.0, qui est la dernière version officielle à être distribuée. Les dernières versions de Dolphin sous Subversion sont quand même disponibles en téléchargement à partir de ce site Web.

Étant donné que ce n’est pas mon habitude de terminer un article sans code, je vous laisse avec un programme qui vous permettra de faire vous-même le test sous Dolphin. La bibliothèque GRRLIB sera utilisée pour la partie graphique. Comme pour tous les homebrews sur la Wii, c’est wiiuse qui servira pour la communication avec la Wii Remote.

#include <grrlib.h>
#include <stdlib.h>
#include <wiiuse/wpad.h>

#include "player1_point_png.h"

#define HOTSPOTX 48 // Cursor hot spot for x coordinate
#define HOTSPOTY 48 // Cursor hot spot for y coordinate

int main(int argc, char **argv) {
    // Initialise the Graphics & Video subsystem
    GRRLIB_Init();

    GRRLIB_texImg *Cursor0 = GRRLIB_LoadTexture(player1_point_png);
    GRRLIB_SetHandle(Cursor0, HOTSPOTX, HOTSPOTY);// Not needed, by default center is selected

    // Initialise the Wiimotes
    WPAD_Init();
    WPAD_SetDataFormat(WPAD_CHAN_ALL, WPAD_FMT_BTNS_ACC_IR);
    WPAD_SetVRes(WPAD_CHAN_ALL, rmode->fbWidth, rmode->efbHeight);

    // Loop forever
    while(1) {
        WPAD_ScanPads();  // Scan the Wiimotes
        WPADData *WPadData0 = WPAD_Data(WPAD_CHAN_0);

        // If [HOME] was pressed on the first Wiimote, break out of the loop
        if (WPadData0->btns_d & WPAD_BUTTON_HOME)  break;

        // ---------------------------------------------------------------------
        if(WPadData0->ir.valid) {
            GRRLIB_DrawImg(WPadData0->ir.x - HOTSPOTX,
                WPadData0->ir.y - HOTSPOTY, Cursor0,
                WPadData0->ir.angle, 1, 1, 0xFFFFFFFF);
        }
        // ---------------------------------------------------------------------

        GRRLIB_Render();  // Render the frame buffer to the TV
    }

    GRRLIB_Exit(); // Be a good boy, clear the memory allocated by GRRLIB

    GRRLIB_FreeTexture(Cursor0);

    exit(0);
}

À la ligne 14 on charge l’image dans une texture. L’image utilisée pour le pointeur est celle-ci:

Player 1 Wii pointer

Il s’agit d’une image qui fait partie d’un ensemble de curseurs pour la Wii conçus par drmr. Toutes les images sont de 96×96 pixels et le point sensible, habituellement le bout du doigt, est situé au centre. L’auteur a renoncé à ses droits sur les images pour les mettre dans le domaine public. Vous pouvez donc les utiliser dans vos applications sans problème de copyright.

À la ligne 19 on spécifie le format des données qui seront prises sur la Wii Remote. BTNS_ACC_IR veut dire boutons + accéléromètre + infrarouge. Par la suite, la fonction WPAD_SetVRes sert à définir la résolution d’écran virtuel pour la localisation de l’infrarouge. Pour ces opérations on utilise le paramètre WPAD_CHAN_ALL pour que tous les contrôleurs soient affectés. Pour que la fonction affecte une télécommande en particulier on doit utiliser WPAD_CHAN_0, WPAD_CHAN_1, WPAD_CHAN_2 ou WPAD_CHAN_3.

À la ligne 25 on va chercher les données de la première Wii Remote avec la fonction WPAD_Data. Les lignes 31 à 35 servent à faire afficher le curseur avec le bon angle à la position vers laquelle la télécommande pointe. Et ce, seulement si les coordonnés sont valides. Donc, si vous mettez votre main devant la Wii Remote, le pointeur disparaîtra de l’écran de votre téléviseur.

J’aurais pu ajouter bien des choses dans le code, mais j’ai décidé de le garder simple.

Bonne programmation…

3 commentaires à propos de “Dolphin et les homebrews”

  1. Mr Crayon ,bonsoir j’ai un petit souci ,quand je crée une image .png sous paint (winXp pro 32bits) j’ai remarquer que je ne peut ripé d’image d’une grande taille 152/204 marche ,mais pas 361/475 ce qui m’ handicape beaucoup pour faire des animations sous forme de spirite(taille 32/32).
    Et quand dit que sa marche ben l’image s’affiche 1fois /2 (compilation en tatonant)

    voici quelques parties de mon code , peut être que vous y verrez plus clair…

    GRRLIB_texImg *marioimg = GRRLIB_LoadTexture(mario);

    #define NUM_STARS 2

    typedef struct {
    u32 px;
    u32 py;
    } star;

    static star stars[NUM_STARS];

    i=0;
    //affichage des objets 2d
    for(i=0;i<NUM_STARS;i++) {
    GRRLIB_DrawPart(stars[i].px,stars[i].py,(frame-1)*33+frame,(anim-1)*33+anim,32,32,marioimg,0,1,1,0xFFFFFFFF);
    }

    • Les images doivent être des multiples de 4. Ce n’est pas le cas de 361×475. Comme autre restriction, elles doivent être inférieures à 1024 pixels en largeur et hauteur.

      Au lieu d’utiliser raw2c, je vous conseil le logiciel WiiBuilder car il donne des avertissements lorsque les images n’ont pas un format approprié.