Pages: [1] 2   Bas de page
Imprimer
Auteur Fil de discussion: [Tuto/NDS] LibLobby pour les nuls (et les autres aussi ^^)  (Lu 6526 fois)
0 Membres et 1 Invité sur ce fil de discussion.
Kram Hors ligne
Débile en chef
*****
Messages: 417


Voir le profil WWW
Un jour j'aurais un super avatar !!!

« 10 Juin 2008, 21:09:48 »

Salut !
Suite à des demandes pour les sources de DS2DS (à propos de LibLobby), j'ai décidé de faire le tuto le plus complet et simple possible (parce que je ne veux pas distribuer les sources de DS2DS (pour le moment Tongue)).

Sommaire :
I) - Installation et inclusions.
II) - Initialisation de la librairie.
III) - Envoi et réception de données.
IV) - Aller plus loin : LibLobby et AS_lib.



I) - Installation et inclusions.

Tout d'abord, il vous faut LibLobby. Une fois téléchargé, dé-7zez-le directement dans le dossier "devkitpro". Voilà ! Vous avez installé LibLobby.

Maintenant, vous voulez créer un homebrew utilisant Lilobby. Allez donc dans le makefile de votre projet et cherchez :
Code:
ARM7_SELECTED = ARM7_BASIC
#ARM7_SELECTED = ARM7_MOD_DSWIFI
#ARM7_SELECTED = ARM7_MOD_LIBLOBBY
#ARM7_SELECTED = ARM7_MP3_DSWIFI
#ARM7_SELECTED = ARM7_MP3_LIBLOBBY
#ARM7_SELECTED = ARM7_MIKMOD_DSWIFI
#USE_EFS = YES

Mettez # devant ARM7_SELECTED = ARM7_BASIC et enlevez celle devant #ARM7_SELECTED = ARM7_MOD_LIBLOBBY ou #ARM7_SELECTED = ARM7_MP3_LIBLOBBY (UN seul des deux !!!) suivant que vous vouliez utiliser du mod ou du MP3 dans votre projet.

Enregistrez et fermez le makefile.

Ouvrez le dossier C:\devkitPro\liblobby\include et copiez les fichiers lobby.h / MessageQueue.h / 802.11.h dans le dossier source de votre projet.

Ouvrez votre projet et rajoutez en plus de vos includes :
Code
(c):
#include "MessageQueue.h"
#include "802.11.h"
#include "lobby.h"


II) - Initialisation de la librairie.

Une fois votre librairie installée et prête à l'emploi, il vous faut l'initialiser.
Avant toute chose, il faut savoir que LibLobby a besoin d'être actualisé le plus souvent possible. Le plus simple pour cela est de créer un "custumVBL" :
Code
(c):
PA_VBLFunctionInit(customVBL); //Vous pouvez mettre n'importe quoi a la place de customVBL, c'est vous qui choisissez.
Cette ligne doit être placée juste après l'initialisation de la PAlib et du VBL standard. Concrètement,  ça donne :
Code
(c):
int main(int argc, char ** argv)
{
PA_Init();    // Initializes PA_Lib
PA_InitVBL(); // Initializes a standard VBL
PA_VBLFunctionInit(customVBL);
//la suite de votre programme

Ce customVBL implique que vous devez créer une fonction au début de votre programme qui s'appelle "custumVBL" (ou le nom que vous lui avez donné, cela n'a aucune importance) :

Code
(c):
#include <PA9.h>       // Include for PA_Lib
#include "MessageQueue.h"        // Includes for LibLobby
#include "802.11.h"
#include "lobby.h"
 
//Ici vos variables...
 
void customVBL(void)
{
IPC_RcvCompleteCheck();     //Cette fonction fait un scan WIFI et recoit toutes les informations qui ont ete transmises a cette DS.
LOBBY_Update();                //Actualise LibLobby...
}

Ensuite les initialisations obligatoires de LibLobby (dans main, à la suite de PA_VBLFunctionInit(customVBL);) :
Code
(c):
IPC_Init();
IPC_SetChannelCallback(0, &LWIFI_IPC_Callback);  //<==== Je n'ai toujours pas compris ce que c'est mais cette fonction ne gene pas... Laissez la ;-)
LOBBY_Init();

En résumé :
Voilà ce que vous obtenez :
Code
(c):
#include <PA9.h>       // Include for PA_Lib
#include "MessageQueue.h"        // Includes for LibLobby
#include "802.11.h"
#include "lobby.h"
 
//Ici vos variables...
 
void customVBL(void)
{
IPC_RcvCompleteCheck();     //Cette fonction fait un scan WIFI et recoit toutes les informations qui ont ete; transmises à cette DS.
LOBBY_Update();                //Actualise LibLobby...
}
 
//Votre programme...
 
int main(int argc, char ** argv)
{
PA_Init();    // Initializes PA_Lib
PA_InitVBL(); // Initializes a standard VBL
PA_VBLFunctionInit(customVBL);
 
IPC_Init();
IPC_SetChannelCallback(0, &LWIFI_IPC_Callback);
LOBBY_Init();
 
while(1){
//Des trucs....
}
 
return 0;
} // End of main()
 


III) - Envoi et réception de données.

C'est un peu la fonction principale de LibLobby... échanger des données !
Mais avant d'envoyer quoi que ce soit, il faut d'abord être prêt à recevoir quoi que ce soit Azn !
Pour cela, il faut déclarer les fonctions qui serviront à recevoir et à stocker ces données :

Code
(c):
LOBBY_SetStreamHandler(0x0001, &nom_de_votre_fonction_qui_recoit_des_donnees);

Petite précision vachement importante quand même : 0x0001 est le "canal" sur lequel "nom_de_votre_fonction_qui_recoit_des_donnees" pêche les infos qui sont envoyées à cette DS, vous pouvez mettre ce que vous voulez, de 0x0001 à 0x8000, pour ceux au dessus (plus de 0x8000), nous en reparlerons plus tard...

Donc dans votre code, en dessous de customVBL(void) vous allez mettre la fonction "nom_de_votre_fonction_qui_recoit_des_donnees", dans laquelle seront disponibles les données envoyées à cette DS sur le "canal" 0x0001 (uniquement. Pour les autres canaux, créez d'autres fonctions, de la même manière) :
Code
(c):
void customVBL(void)
{
IPC_RcvCompleteCheck();
LOBBY_Update();
}
 
void Echangedonnees(unsigned char *data, int length, LPLOBBY_USER from)
{  
   //Cette fonction recois 3 choses : data : les donnees au format unsigned char / length qui est un entier envoye par l'autre DS (voir plus bas) / from : une variable au format LPLOBBY_USER : c'est le "nom" de la personne qui vous a envoye ces donnees
}

NOTE : Cette fonction est exécutée à l'instant même où la DS reçoit des données (ici dans le "canal" 0x0001, il ne faut pas l'appeler durant votre programme !) et cela peu importe l'endroit "réel" où vous vous trouvez dans votre programme. Cela vous permet de recevoir des données tout en continuant à faire tourner votre programme.

Vous voilà fin près a recevoir des données !! Vous pouvez maintenant en envoyer !!
Pour cela, vous utiliserez :

Code
(c):
LOBBY_SendToUser(LPLOBBY_USER user,unsigned short stream, unsigned char *data, int length) ;
 

-user : "nom" de la DS à laquelle les données sont envoyées; (pour connaitre le nom des autres DS, voir plus bas) (pas trop bas non plus !).
-stream : "canal" sur lequel vous envoyez les données (ex : 0x0001). Attention : si vous envoyez sur un canal que l'autre DS n'a pas initialisé, elle ne recevra rien...
-data : une chaîne de caractères qui sera envoyée. => Plus elle est longue, plus le temps pour l'envoyer sera long (logique...) mais vous pouvez allez jusqu'a 1000 caractères sans avoir le moindre problème.
-length : il peut servir à 2 choses : 1) La fonction envoi length caractères de data; 2) length est transmis à l'autre DS tel quel, vous pouvez donc envoyer un entier.

Voilà ! vous avez envoyé des données  Cheesy !! Mais à qui ??
Avant de trouver le nom au "format" LPLOBBY_USER des DS qui utilisent le Wifi en même temps que vous, il vous faut connaitre le nombre de DS, pour cela il existe une fonction :

Code
(c):
LOBBY_GetNumberOfKnownUsers() ;
Cette fonction renvoie le nombre d'utilisateurs de LibLobby actuellement proche de vous, sous la forme d'un unsigned short.

Ensuite il vous faut mettre des noms sur ces DS :
Code
(c):
LOBBY_GetUserByID(unsigned short id);
Renvoie le nom en LPLOBBY_USER de la DS numéro id (id peut aller de 0 à LOBBY_GetNumberOfKnownUsers() ; au delà, la fonction renvoi 0)

Pour trouver le nom de votre propre DS, vous pouvez faire :
Code
(c):
LOBBY_GetUserByID(USERID_MYSELF);
USERID_MYSELF correspond au numéro id de la DS sur laquelle le programme tourne.
Attention : N'envoyez pas de données à vous-même !!! (je ne sais pas ce que ça fait, mais c'est fortement déconseillé...)

En résumé :

Voilà un exemple qui liste les DS et qui envoie "Salut !" Si vous appuyez sur A :
Code
(c):
// Includes
#include <PA9.h>       // Include for PA_Lib
 
#include "MessageQueue.h" // Includes for LibLobby
#include "802.11.h"
#include "lobby.h"
 
 
void customVBL(void)
{
IPC_RcvCompleteCheck();
LOBBY_Update();
}
 
 
void Reception(unsigned char *data, int length, LPLOBBY_USER from)
{
PA_OutputText(1, 1, 20, "Recu: %s de %s      ", (char*)data, LOBBY_GetUserName(from)); //LOBBY_GetUserName(from) "convertit" le nom en LPLOBBY_USER de la DS "from" en un const char *
}
 
 
int main(int argc, char ** argv)
{
PA_Init();    // Initializes PA_Lib
PA_InitVBL(); // Initializes a standard VBL
PA_InitText(0, 0);
PA_InitText(1, 0);
PA_WaitForVBL();PA_WaitForVBL();PA_WaitForVBL(); //<======= indispensable pour que le homebrew tourne sous no$gba : le seul emu qui supporte bien le wifi DS <===> DS (vous n'êtes pas obligé de le mettre si vous voulez faire marcher votre homebrew sur DS).
PA_VBLFunctionInit(customVBL);
IPC_Init();
IPC_SetChannelCallback(0, &LWIFI_IPC_Callback);
LOBBY_Init();
 
LOBBY_SetStreamHandler(0x0001, &Reception);
 
int select = 0;
while (1)
{
 
int max = LOBBY_GetNumberOfKnownUsers();
PA_OutputText(0, 1, 21, "Votre nom : %s \nUtilisateurs : %d  ",LOBBY_GetUserName(LOBBY_GetUserByID(USERID_MYSELF)), max);
 
if (Pad.Newpress.Down)
select++;
if (Pad.Newpress.Up)
select--;
if (max > 0)
select %= max ;
 
if (Pad.Newpress.A)
LOBBY_SendToUser(LOBBY_GetUserByID(select),0x0001,(unsigned char *)"Salut !",8) ;
 
int i;
for (i = 0; i < max; i++)
{
LPLOBBY_USER user = LOBBY_GetUserByID(i) ;
if (i == select) PA_OutputText(0, 2, 8+i, "->%s        ", LOBBY_GetUserName(user));
else PA_OutputText(0, 2, 8+i, "  %s       ", LOBBY_GetUserName(user));
}
 
PA_WaitForVBL();
}
 
return 0;
} // End of main()

Vous pouvez aussi regarder l'exemple de la PAlib dans C:\devkitPro\PAlibExamples\Wifi\libLobby, je m'en suis inspiré pour créer le petit programme ci-dessus.


IV) - Aller plus loin : LibLobby et AS_lib

Vous voilà capable de créer plein de mini jeux, tout rigolos pour jouer à plusieurs, tout beaux pour le plaisir des yeux, mais pas tout musicaux... Et oui, si vous sélectionnez ARM7_SELECTED = ARM7_MP3_LIBLOBBY dans votre makefile, il ne faudra pas initialiser AS_lib et LibLobby n'importe comment ! Sinon, pas de son...  Cry

Voilà l'ordre dans lequel il faut faire les initialisations :

Code
(c):
//PAlib :
PA_Init();
PA_InitVBL();
 
//LibLobby :
PA_VBLFunctionInit(customVBL);
IPC_Init();
IPC_SetChannelCallback(0, &LWIFI_IPC_Callback);
LOBBY_Init();
PA_WaitForVBL();PA_WaitForVBL();PA_WaitForVBL();
LOBBY_SetStreamHandler(0x0001, &Reception);
 
//AS_Lib :
AS_SetDefaultSettings(AS_PCM_8BIT, 11025, AS_SURROUND);



Et voilà, c'est tout pour le moment. Je vais faire un autre tuto regroupant toutes les fonctions de Lobby, mais vous en avez assez pour concocter de super petits jeux !!!  Cheesy

P.-S. Si quelque part j'ai écrit n'importe quoi (je veux dire : plus n'importe quoi que partout ailleurs), dites-le-moi ! Si vous avez des questions ou besoin de précisions, demandez-moi !!

Pub : Téléchargez DS2DS, parce que vous le valez bien !
« Dernière édition: 11 Juin 2008, 16:57:11 par Kram » Journalisée

Cid2Mizard Hors ligne
Super Mega Member
****
Messages: 3948


Voir le profil WWW
Disciple Kukulcanien

« Réponse #1 : 10 Juin 2008, 21:56:05 »

Wahooo, bravo c'est un travail énorme  Wink. Moi j'ai une question par rapport à LOBBY_UserIsAllSent que tu n'as pas abordé  Azn, je vois dans ton puissance 4 :

Code
(c):
LOBBY_SendToUser(compagnon,0x0001,(unsigned char *)"jeveuxjouer",11);
PA_WaitFor(!LOBBY_UserIsAllSent(compagnon));//IMPORTANT : On attend que les coordonées soient transmisent !! Sinon le réseau sature et le jeu plante !

Donc pour un jeu en temps réel, c'est fort recommandé  Azn, mais moi il freeze le programme ou me parle de pointer  Undecided, j'ai mis :

Code
(c):
LOBBY_SendToUser (LOBBY_GetUserByID (selected), 0x0001, (unsigned char *) send_buf, 54);
PA_WaitFor(!LOBBY_UserIsAllSent(user)); //user ou selected = problème de POINTER

Alors comme selected = 0 en théorie, j'ai mis 0 mais dès le premier envois wifi je bloque sur PA_WaitFor...
Journalisée

MasterDje Hors ligne
Diet Coke Addict
Global Moderator
*****
Messages: 3242


Voir le profil WWW
« Réponse #2 : 10 Juin 2008, 22:02:33 »

-private joke inside-
oh, mais ce tuto m'a l'air parfaitement rédigé et digne des meilleures prévisualisations  Wink

et maintenant, grace à Kram, va falloir que j'm'y mette Azn

Sacré boulot, man, surtout à 2 ko/sec Grin
Journalisée

Kram Hors ligne
Débile en chef
*****
Messages: 417


Voir le profil WWW
Un jour j'aurais un super avatar !!!

« Réponse #3 : 10 Juin 2008, 22:16:37 »

MasterDje => Vu la super qualité de mon tuto (  whistle ), je sens que tu vas nous faire des jeux du tonnerre ! Bonne chance Azn

Cid2Mizard => Si tu fais
Code:
PA_WaitFor(!LOBBY_UserIsAllSent(selected));
c'est normal que ça plante, mais comment tu définis ton user ?
Si tu veux utilisé selected, il faut faire :
Code:
PA_WaitFor(!LOBBY_UserIsAllSent(LOBBY_GetUserByID (selected)));
car selected n'est pas un LPLOBBY_USER, mais un nombre.

[EDIT] : LOBBY_UserIsAllSent viendra dans un autre tuto qui regroupera toutes les fonction de Liblobby.
« Dernière édition: 10 Juin 2008, 22:20:09 par Kram » Journalisée

Cid2Mizard Hors ligne
Super Mega Member
****
Messages: 3948


Voir le profil WWW
Disciple Kukulcanien

« Réponse #4 : 10 Juin 2008, 22:26:29 »

Ah ok, merci  Wink, sinon sans le mettre et garder l'envois des infos à chaque VBL, fonctionne pendant un moment mais plante finalement.
Journalisée

Ludo6431 Hors ligne
Elite Member
**
Messages: 825


Voir le profil WWW
It rocks !

« Réponse #5 : 11 Juin 2008, 08:11:46 »

Salut Kram, sympa ton tuto, en revanche j'ai trouvé une petite erreur :
Quand tu mets ça :
Code
(c):
LOBBY_SendToUser(LOBBY_GetUserByID(select),0x0001,(unsigned char *)"Salut !",7) ;
 
Tu n'envoies pas le '\0' final de la chaîne de caractères, ce qui est très bien car tu envoies un caractère en moins, donc le transfert est un peux plus rapide.
Mais, à ce compte là, il faut le rajouter à la réception.

Où alors, l'envoyer avec la chaîne (mettre 8 au lieu de 7) et ne rien modifier à la réception.

edit :
Autre chose :
Tout d'abord, il vous faut LibLobby. Une fois téléchargé, dé-7zez-le directement dans le dossier "devkitpro". Voilà ! Vous avez installé Liblobby.
Ce lien est mort Azn.

Et il y a une petite faute ici :
IV) - Aller plus loin : Liblooby et AS_lib
Wink
« Dernière édition: 11 Juin 2008, 08:15:07 par Ludo6431 » Journalisée

Mon matériel : DS Lite blanche flashée v8 | DSi noire | SCDS ONE v2 | SCLite | DSerial EDGE | MK-R6 gold | rumble pack | R4(r4ds.cn) | M3i Zero | Acekard 2i | µSD 1Go sandisk ultra II | µSDHC 4Go sandisk
Yus Hors ligne
Relecteur et
Administrateur
*****
Messages: 349


Voir le profil WWW
« Réponse #6 : 11 Juin 2008, 08:38:33 »

Lien corrigé, pour le code je laisse l'auteur choisir sa méthode. Tongue
Journalisée


Il est dangereux de frôler les arbres, mais vous serez récompensé si vous prenez des risques.
Kram Hors ligne
Débile en chef
*****
Messages: 417


Voir le profil WWW
Un jour j'aurais un super avatar !!!

« Réponse #7 : 11 Juin 2008, 10:16:02 »

Ludo => c'est pas necessaire de mettre 8 a la place de 7, si tu test le programme tu verra que ça passe nickel ! C'est aussi comme ça que je fait avec ds2ds.

Yus => merci pour le lien ;-)
Journalisée

Ludo6431 Hors ligne
Elite Member
**
Messages: 825


Voir le profil WWW
It rocks !

« Réponse #8 : 11 Juin 2008, 10:31:08 »

Ludo => c'est pas necessaire de mettre 8 a la place de 7, si tu test le programme tu verra que ça passe nickel ! C'est aussi comme ça que je fait avec ds2ds.
Pour envoyer des données c'est d'accord, car tu te fous de l'afficher (et donc d'attendre ce fucking 0 à la fin du tableau de char qui est alloué).
Mais pour envoyer un tableau de char que tu affiches en attendant un 0 dans ce tableau, il est nécessaire de mettre un 0 à la fin avant de l'afficher, en effet tu n'es pas sûr qu'il y ai un 0.
Si ça marche c'est que tu as de la chance, il y a un 0 après l'allouement dynamique fait par la liblobby.
C'est assez instable, en effet sur d'autre matériel, ce tableau pourrait être alloué dynamiquement par la liblobby à un endroit différent, dans ce cas là il pourrait ne pas y avoir un 0 après ce tableau dans la mémoire, tu te retrouverais donc avec des caractères "bizarres" affichés après le '!' de "Salut !" !!!!!!!

P.S. : J'en ai marre de toujours être pris pour un con !
Journalisée

Mon matériel : DS Lite blanche flashée v8 | DSi noire | SCDS ONE v2 | SCLite | DSerial EDGE | MK-R6 gold | rumble pack | R4(r4ds.cn) | M3i Zero | Acekard 2i | µSD 1Go sandisk ultra II | µSDHC 4Go sandisk
Kram Hors ligne
Débile en chef
*****
Messages: 417


Voir le profil WWW
Un jour j'aurais un super avatar !!!

« Réponse #9 : 11 Juin 2008, 16:48:21 »

Oula oula ! Alors d'abords tu te calme et après on discutera, ok ?

Je n'ai jamais dis "il FAUT mettre 7 !!", j'ai dis "c'est pas nécessaire de mettre 8", et c'est pas la même chose !
Maintenant, tu n'as pas tout à fait tort et il vaut mieux mettre 8.

La prochaine fois lis avant dire n'importe quoi !!! ("P.S. : J'en ai marre de toujours être pris pour un con !") Angry
Journalisée

Michoko Hors ligne
Full Member
***
Messages: 224


Voir le profil
« Réponse #10 : 11 Juin 2008, 17:21:54 »

Super tuto, merci Kram !
Journalisée
Toiletking Hors ligne
Mega Member
***
Messages: 1289


Voir le profil WWW
"Caca Boudin!"

« Réponse #11 : 11 Juin 2008, 19:17:32 »

C'est de la balle ce tuto !  Cheesy

On va pouvoir s'échanger plein d'image de fesse pendant les cours Kiss
Journalisée
Cobain Hors ligne
Mega Member
***
Messages: 1131


Voir le profil WWW
mes talents de graphiste lol

« Réponse #12 : 12 Juin 2008, 20:19:47 »

t'as des idées de merde quand même toiletking Smiley

superbe idée ce tuto Azn
Journalisée

Mes Projets || Mon Blog
Citation
Honey bunny : I love you, pumpkin.
Pumpkin : I love you, honey bunny.
Pumpkin : Everybody be cool this is a robbery!
Honey bunny : Any of you fuckin' pricks move and i'll execute every motherfucking last one of you
Mony Hors ligne
Hero Member
*****
Messages: 548


Voir le profil WWW
zOMG !!!1

« Réponse #13 : 14 Juin 2008, 14:03:50 »

Hum... je voulais essayer ça, mais j'ai pas de linker, avec quel ému je peux le faire ?
J'ai cherché des tutos pour iDeas avec son plugin, mais, j'ai pas trouvé...
Journalisée

Membre du club des joyeux guitaristes pas aidés et codeurs avec les pieds de Dev-Fr et pas du club des pieds pas guitaristes aidés de joyeux codeurs Dev-fr...

unkwar Hors ligne
Hero Member
*****
Messages: 759


Voir le profil
Oeil de L1NX

« Réponse #14 : 14 Juin 2008, 14:06:54 »

avec no$gba, dans les options tu mets 2 dans nbr of emulated gameboys...
Journalisée

Pages: [1] 2   Haut de page
Imprimer

Aller à: