AccueilAccueil  FAQFAQ  RechercherRechercher  S'enregistrerS'enregistrer  MembresMembres  Connexion  

Partagez | 
 

 [Tutoriel] 39Dll : jeux multijoueurs sur internet

Aller en bas 
Aller à la page : 1, 2, 3  Suivant
AuteurMessage
Levans
Utilisateur confirmé: Rang *****
avatar

Messages : 1598
Localisation : France -> Île de France -> Essonne -> Gif sur Yvette

MessageSujet: [Tutoriel] 39Dll : jeux multijoueurs sur internet   Mer 27 Aoû 2008 - 9:26


Tutorial : 39Dll pour des jeux multijoueurs

(j'espère que ce tuto n'existe pas encore, s'il existe déjà, veuillez m'excuser je ne l'ai pas trouvé)
(pour les plus anciens : Et oui je suis un revenant ! veuillez excuser cette abscence de très longue durée)

Voici un tuto destiné à permettre à tous de créer des jeux multijoueurs facilement grâce à la dll 39Dll.
Notre objectif dans ce tuto sera simple nous allons créer un "jeu" utilisant une relation serveur/clients.

J'ai décidé de m'écater du Pong habituel pour la base des jeux en réseau pour une raison simple : il ne permet pas l'apprentissage des méthodes de la gestion en masse de clients dont le nombre peut varier à tout instant.
Nous ferons donc quelque chose de simple : grâce aux sprites gracieusement founits par GM, nous ferons 2 programmes :
- le serveur : il affichera la liste des joueurs accompagnés de leurs ids et de leurs coordonnées x et y
- le client (que l'on pourra démarrer autant de fois que l'on veut) : qui affichera le personnage sous la forme d'un petit fantôme rouge (sprites de pacman xD ) et les autres joueurs sous la forme de petits fantômes verts !

(veuillez m'excuser davance mais la connection internet que j'utilise pour envoyer ce tuto ne me permet pas d'envoyer des screenshots et autres images (56k powaaa ... ) j'essaierais donc d'être le plus clair possible)

bien, commençons ...

I. Etablir la connection
[size=12]
Nous allons commencer avec le serveur, prenez un projet vierge accompagné des tous les scripts de la Dll pour la version 6.1 de GM, ou avec le GEX 39Dll pour GM 7.0 (disponible sur le site du CBNA il me semble). J'ai fait ce tuto avec la version 6.1 j'espère donc que dans le GEX les noms de fonctions sont les mêmes.
Donc, créez un objet appelé "controlleur" (ou tout ce que vous voulez), ce sera le seul objet de ce programme.
Dans l'évènement "create" de cet objet mettez la pièce de code suivante :
Citation :
dllinit(0,true,false);

cette fonction sert à initialiser la DLL, elle prent 3 arguments : le premier est l'emplacement de la DLL dans l'ordinateur, mettez 0 si le fichier se nomme "39dll.dll" et quil est dans le répertoire du jeu. Le deuxième argument vous demande si oui ou non (true ou false) vous voulez charger les fonction d'envoi de données via internet (nous on en a besoin) et le troisième si vous voulez charger les fonction de cryptage et autres, inutile pour nous.
Toujours dans l'event "create", maintenant que la dll est chargée, nous allons écouter un port. Je m'explique : l'ordinateur possède plusieurs entrée/sorties virtuelles le reliant à internet, elle sont numérotée de 1 à ... plus de 50.000 je pense, et son appelées les ports. (par exemple le port n°80 est réservé à la connection vers les sites web, via firefox, internet explorer, etc ...) donc choisissons un port pa exemple le n°12345, c'est via ce port que nos 2 programmes vont "discuter".
donc écoutons grace à ce code :

Citation :
global.socket=tcplisten(12345,10,1);

if(!global.socket)
{
show_message("Impossible d'ouvrir le port n°12345");
game_end();
}

ici la fonction utilisée est tcplisten, elle comporte elle aussi 3 arguments : le n° de port à ouvrir, la longueur de la "fille d'attente" (c'est le nombre maximal d eprogrammes pouvant être en attente, ça n'a rien à voir avec le nombre de personnes pouvant jouer au jeu, comme il est souvent dit, je l'ai testé) et le troisième argument est si la fonctin doit âtre blocante (0) ou non-blocante (1). (Si la fonction est blocante, elle empèchera la suite du code de s'executer jusqu'à ce qu'elle recoive une connection, en fait, cet argument affectera la fonction tcpaccept que l'on verra plus tard). Cette fonction renvoie l'id du socket ainsi créé, ou un code d'erreur négatif, d'où la vérification faisant quitter le programme en cas d'erreur
/!\ attention : le port que vous utilisez pour écouter doit être laissé libre par votre pare-feu !

Maintenant, créons la liste des joueurs, dans laquelle le serveur enregistrera les IDs des joueurs. Nous pourrions utiliser un tableau (joueur[1], joueur[2], etc ...) mais il y a un inconvénient majeur, si des joueurs quitten en pleine partie, les emplacements de données utilisés pour eux ne serons pas vidés, et le serveur va accumuler les zones de mémoire utilisées pour rien, ce qui n'est pas très bon, et qui en plus rend le traitement des données infernal ...
Je me suis donc penché sur l'utilisation des Listes (ds_list_...) ce sont des tableaux à une dimention qui, lorsqu'on supprime une donnée se réorganisent (si je supprime l'entrée n°2, la 3 devient 2, la 4 devient 3, etc ...), tout bénef pour nous. (je vous invite donc à lire la partie "listes" de l'aide de GM)
Créons donc la liste et initialions une variable qui nous servira plus tard :

Citation :
global.listsockets = ds_list_create();

nbjoueurs = 0;
Voilà, normalement votre code create est donc ceci :
Citation :
dllinit(0,true,false);
global.socket=tcplisten(12345,10,1);
if(!global.socket)
{
show_message("Impossible d'ouvrir le port n°12345");
game_end();
}
global.listsockets = ds_list_create();
nbjoueurs = 0;

maintenant, passons à l'event "steps" :
nous allons utiliser une nouvelle fonction : tcpaccept. Cette fonction renvoie l'ID du programme nouvellement accepté, ou bien 0 ou un code d'erreur négatif.
donc appelons cette fonction et si le code est positif, réons une nouvelle entrée dans la liste de sockets :
socketjoueur = tcpaccept(global.socket,1) // arguments : socket du port à utiliser, blocant/non-blocant.

Citation :
if(socketjoueur>0)

{
ds_list_add(global.listsockets,socketjoueur); //ajoutons ce socket à la liste de sockets.
}

maintenant, je vais vous faire mettre un code sans l'expliquer, (je sais ce n'est pas bien) je ne l'expliquerais que lors de la partie II : les messages. Ce code sert à supprime automatiquement de la liste un joueur déconnecté.

Citation :
nbjoueurs = ds_list_size(global.listsockets);
for(i=0;i<=nbjoueurs-1;i+=1)
{
while(1)
{
size = receivemessage(ds_list_find_value(global.listsockets,i));
if(size < 0) break;
if(size == 0)
{
ds_list_delete(global.listsockets,i);
break;
}
}
}
voila maintenant votre code "steps" :

Citation :
socketjoueur = tcpaccept(global.socket,1) // arguments : socket du port à utiliser, blocant/non-blocant.
if(socketjoueur>0)
{
ds_list_add(global.listsockets,socketjoueur); //ajoutons ce socket à la liste de sockets.
}

// code pour supprimer les joueurs déconnectés
nbjoueurs = ds_list_size(global.listsockets);
for(i=0;i<=nbjoueurs-1;i+=1)
{
while(1)
{
size = receivemessage(ds_list_find_value(global.listsockets,i));
if(size < 0) break;
if(size == 0)
{
ds_list_delete(global.listsockets,i);
break;
}
}
}
puis dans l'event "game end" mettez le code
Citation :

dllfree();
pour libérer la mémoirede la dll.

c'est tout pour l'instant pour le serveur.


nous allons passer aux fonctions de connection du client.

ouvrez un nouveau projet avec les scripts/le GEX de la 39DLL, et créez-y 2 rooms ("waiting" et "game") et 1 objet ("control") persistant et placé dans la 1ere room.

dans le code "create" :

Citation :
global.server=tcpconnect(127.0.0.1,12345,1);
if(global.server<=0)
{
show_message("Impossible de se connecter à 127.0.0.1:12345");
game_end();
}
room_goto_next();
la fonction est tcpconnect avec 3 arguments : l'ip du serveur, le port à utiliser, blocant/non-blocant.

si c'est effectif, on passe dans la room suivante, ou il y aura le jeu. (que l'on fera dans la partie n° 2)

l'objet control doit être persistant à cause du codeplac dans l'event "game end" :
Citation :
dllfree();

voilà c'est tout pour la partie connection, vous pouvez tester en démarrant le serveur puis 2 ou 3 fois le client, pour bien voir, mettez les rooms de tous les jeux taille 300x300, et ajoutez ce code dans le "draw event" du serveur :
Citation :

draw_text(10,10,"id");
draw_line(42,0,42,300);

draw_line(0,30,300,30);

for(k=0;k<=nbjoueurs-1;k+=1)
{
draw_text(10,20*(k+2),ds_list_find_value(global.listsockets,k));
}
c'est une boucle ui affiche la liste des ids de joueurs connectés.

Voilà. La suite dès que j'ai finit de l'écrire


Dernière édition par Levans le Mer 22 Oct 2008 - 16:12, édité 1 fois
Revenir en haut Aller en bas
Levans
Utilisateur confirmé: Rang *****
avatar

Messages : 1598
Localisation : France -> Île de France -> Essonne -> Gif sur Yvette

MessageSujet: Re: [Tutoriel] 39Dll : jeux multijoueurs sur internet   Mer 27 Aoû 2008 - 9:27


II. Les messages et les buffers

Voilà maintenant la 2e partie, où nous allons traiter du plus important : l'envoi de messages. il se fait en 4 étapes :
niveau expéditeur : ecriture sur le buffer => envoi du contenu du buffer
niveau destinataire : reception du message dans le buffer => traitement du contenu.
le buffer est une sorte de variable assez spéciale : elle n'a pas de type vraiment définit et peut contenir plusieurs types de valeurs à la fois.
Par exemple, si chaque 0 est un octet :
voilà mon buffer : 0000000000
il est décomposé ainsi : 00(nombre) - 00000(caractères) - 000(nombre)
mais peut l'être differamment, ainsi, le destinataire doit savoir de quoi est composé le buffer ! je vais donc vous faire la liste des types de contenus possible ainsi que les fonctions servant à les lire et les écrires.
- les bytes (octets en français) = un nombre entier compris entre 0 et 255 (fonctions : writebyte(valeur) et reabyte() ) taille : 1 octet
- les shorts (courts en français) = un nombre entier compris entre -32.768 et 32.767 (fonctions : writeshort(valeur) et readshort() ) taille : 2 octets
- les unsigned shorts (courts non signés) = un nombre entier compris entre 0 et 65.536 (fonctions : writeushort(valeur) et readushort() ) taille : 2 octets
- les int (entiers) = un nombre entier compris entre -2.147.483.648 et 2.147.483.647 (fonctions : writeint(valeur) et readint(valeur) ) taille : 4 octets
- les unsigned int (entiers on signés) = un nombre entier compris entre 0 and 4.294.967.296 (fonctions : writeuint(valeur) et readuint() ) taille : 4 octets
- les float (flottants) = un nombre décimal (à virgule) entrant dans 4 octets (plus il y a de chiffres après la virgule, plus le nombre sera petit, évidemment) (fonctions : writefloat(valeur) et readfloat() )
- les doubles = un nombre décimal de 8 octets (donc à éviter le plus souvent possible, correspond au maximum supporté par GM) (fonctions : writedouble(valeur) et readdouble() )
- les chars = chaine de caractères (1 octet = 1 caractère) (pour la fonction de lecture il faut préciser le nombre d'octets à lire en argument) (fonctions : writechars(valeur) et readchars(longueur) )
- les strings = chaine de caractères terminée par le caractère NULL (la fonction de lecture s'y arrète, il n'est plus nécéssaire de préciser le nombre de caractères à lire) (fonctions : writestring(valeur) et readstring() )
Comme vous le voyez, il y a le choix. il faut donc bien choisir les types de données à choisir : pour les coodonnées d'un objet dans une room, un short suffit, alors que les doubles ne devraient être utilisés que pour le transfert de données scientifiques de hautre précision ...
maintenant, voilà un code d'écriture basique :
Citation :
clearbuffer(); // on vide le buffer
writeshort(x);
writeshort(y); // on écrit les coordonnées
sendmessage(socketid); // on envoie
le code de base de réception est plus complexe :
Citation :
while(1) // boucle infinie
{
size = receivemessage(socketid); // retourne le nombre de bytes reçus ou un code d'erreur
if(size<0){break;} // pas de message reçu, on quitte la boucle
if(size==0) // le joueur s'est déconnecté
{
//actions si le joueur est déconnecté (on supprime/sauvegarde ses infos)
exit;
}

// actions de traitement

}

normalement, il doit vous rappeler quelque chose : le code utillisé dans la partie I pour savoir si le joueur était déconnecté !

maintenant, tout s'eclaircit non ?

retournons à notre jeu : prenons le client, créons un objet joueur (avec le sprite de monstre rouge pacman ^^) que nous mettons dans la room "game", la deuxième, faisons un code rapide de déplacement :

Citation :
//keyboard up
if(y>0)
{
y-=4;
}
//keyboard down
if(y<268) // rappelez vous ! les rooms font 300x300px et le sprite 32x32px
{
y+=4;
}
//keyboard left
ifx>0)
{
x-=4;
}
//keyboard right
if(x<268)
{
x+=4;
}
voilà et maintenant, il a faloir qu'à chaque step, l'objet envoi sa position au serveur : on va faire un code tout simple en se rappelant ce que j'ai dit plus haut :

Citation :
clearbuffer(); // on vide le buffer
writeshort(x);
writeshort(y); // on écrit les coordonnées
sendmessage(global.server); // on envoie avec le socket du serveur
voilà, c'est tout pour l'instant pour le client

revenons au serveur, il va falloir transformer le code de reception précédent (je vous le rappelle) :

Citation :
nbjoueurs = ds_list_size(global.listsockets);
for(i=0;i<=nbjoueurs-1;i+=1)
{
while(1)
{
size = receivemessage(ds_list_find_value(global.listsockets,i));
if(size < 0) break;
if(size == 0)
{
ds_list_delete(global.listsockets,i);
exit;
}
}
}
je pense que vous le comprenez maintenant : la boucle for permet de traiter tous les joueurs dont on reçoit l'un après l'autre les messages.

Mais avant, il nous faut créer 2 autre listes, pour stoquer les coordonnées x et y de chaque joueur, donc dans l'event create on doit avoir à la fin :
Citation :

global.listsockets = ds_list_create();
global.listx = ds_list_create();
global.listy = ds_list_create();
nbjoueurs = 0;
et on revoit aussi le code de steps pour accepter les nouveaux joueurs :

Citation :
socketjoueur = tcpaccept(global.socket,1) if(socketjoueur>0)
{
ds_list_add(global.listsockets,socketjoueur);
ds_list_add(global.listx,0);
ds_list_add(global.listy,0);
}

Voilà. maintenant, on peut traiter les messages reçus pour mettre à jour les données du serveur.

Citation :
nbjoueurs = ds_list_size(global.listsockets);
for(i=0;i<=nbjoueurs-1;i+=1)
{
while(1)
{
size = receivemessage(ds_list_find_value(global.listsockets,i));
if(size < 0) break;
if(size == 0)
{
ds_list_delete(global.listsockets,i);
exit;
}
// traitement des données
ds_list_replace(global.listx,i,readshort());
ds_list_replace(global.listy,i,readshort());
}
}
Et voilà !
si on met à jour le code d'affichage du serveur :

Citation :
draw_text(10,10,"id");
draw_line(42,0,42,300);
draw_text(45,10,"x");
draw_line(77,0,77,300);
draw_text(80,10,"y");
draw_line(112,0,112,300);

draw_line(0,30,300,30)

for(k=0;k<=nbjoueurs-1;k+=1)
{
draw_text(10,20*(k+2),ds_list_find_value(global.listsocks,k));
draw_text(45,20*(k+2),ds_list_find_value(global.listx,k));
draw_text(80,20*(k+2),ds_list_find_value(global.listy,k));
draw_line(0,20*(k+3)-3,300,20*(k+3)-3)
}

on voit s'afficher les coordonnées x et y de chaque joueurs.

il n'y a plus qu'à ajouter 2 codes similaires dans l'autre sens (que je n'expliquerais que peu, car c'est globalement la même chose) grace auxquels le serveur envoie à chaque jouer, les coordonnées des autres joueurs, que ce dernier puisse les afficher (à l'aide du sprite pacman de monstre vert).

code steps du serveur à mettre dans la boucle for du serveur, après la boucle while(1) :

Citation :
clearbuffer(); // on vide le buffer
writeshort(nbjoueurs-1); // on inscrit le nombre de joueurs à traiter (-1 car il ne se traite pas lui même)
for(j=0;j<=nbjoueurs-1;j+=1) // une boucle
{
if(i!=j) // si le joueur dont on a les données n'est pas le joueur que l'on traite (on ne va pas lui envoyer ses propre coordonnées)
{
writeshort(ds_list_find_value(global.listx,j));
writeshort(ds_list_find_value(global.listy,j));
/*
on écrit les données les unes après les autre ainsi : nbjoueurs | joueur1.x | joueur1.y | joueur 2.x | joueur 2.y | etc ...
*/
}
}
sendmessage(ds_list_find_value(global.listsocks,i)); // on envoie le message
puis un code de reception et de traitement dans la client dans steps à placer à la suite :

Citation :
while(1)
{
size=receivemessage(global.server); // on reçoit
if (size<0) break;
if (size==0) // si la connection est perdue
{
show_message("Déconnecté du serveur.");
game_end();
exit;
}
monsternb=readshort(); // on récupère le nombre de monstres
for (i=0;i<=monsternb-1;i+=1)
{
monsterlist_x[i]=readshort(); // on enregistre leurs coordonnées dans des tableaux
monsterlist_y[i]=readshort();
}
}
et un code d'affichage à mettre dans le draw du monstre :

Citation :
for(i=0;i<=monsternb-1;i+=1)
{
draw_sprite(sprite_autre_joueur0,monsterlist_x[i],monsterlist_y[i]);
}
draw_sprite(sprite_joueur,0,x,y); // on affiche son propre sprite
voilà pourquoi j'initialisait monsernb à 0 car comme 0>0-1, la boucle ne se démarre pas si le joueur est seul.

Et voilà, c'est fini grace à celà vous avez normalement compris les bases, en troisième partie je ferais une petite explication sur les possibilités de codage et d'utilisation des fichiers fournies pas la dll.


Dernière édition par Levans le Mer 27 Aoû 2008 - 12:13, édité 1 fois
Revenir en haut Aller en bas
Levans
Utilisateur confirmé: Rang *****
avatar

Messages : 1598
Localisation : France -> Île de France -> Essonne -> Gif sur Yvette

MessageSujet: Re: [Tutoriel] 39Dll : jeux multijoueurs sur internet   Mer 27 Aoû 2008 - 9:27


ATTENTION :
pour utiliser les fonctions suivantes, il vous faudra activer la deuxième partie de la dll, utiliser la fonction dllinit(0,true,true); et non dllinit(0,true,false);
III. Cryptage

alors là ça va être très rapide, il y a deux fonctions à connaitre :
bufferencrypt(password) : code le contenu du buffer avec le mot de passe choisi (à utiliser juste avant l'envoi)
bufferdecrypt(password) : décode le contenu du buffer avec le mot de passe choisi (à utiliser juste après la réception)
et sinon, autre chose utile : les fonctions de hashage
mais avant tout qu'est-ce que je hashage ? c'est un groupe d'algorythmes qui transforment une chaine de caractères en un nombre ou une autre chaine de manière définitive. on ne peut pas revenir en arrière. Mais alors, à quoi cela peut-il bien servir ? Et bien, à rendre le transfert de données encore plus sécurisé, par exemple pour le transfert du mot de passe de connection : le serveur le connait que le hash du mot de passe, (comme ça en cas de piratage, il ne peut pas le fournir), le client pour se connecter, hashe son mot de passe et l'envoie au serveur qui le compare à ce qu'il connait. Car chaque chaine possède un hash unique et différent des autres. Enfin, si vous voulez plus de précitions allez sur wikipédia.
Ici l'algorythme utilisé est MD5, un des plus sûrs existants. Il y a deux fonctions :
md5string(chaine) = retourne le hash md5 de la chaine envoyée
md5buffer() = retourne le hash md5 du contenu du buffer
(dans ce tuto j'ai utilisé le mot "hash" et le verbe "hasher" sans être sûr de l'orthographe ni même s'ils existaient, veuillez m'en excuser)

IV. Les fichiers

la 39 dll permet également l'utilisation des fichiers grace à quelques fonctions de base :
fileopen(file,mode) : 1er argument : fichier à ouvrir, 2e argument : mode (0=lecture, 1=écriture, 2=lecture et écriture), la fonction retourne l'id du fichier ouvert.
fileclose(fileid) : ferme le fichier d'id fileid.
filewrite(fileid) : écrit le contenu du buffer dans le fichier fileid.
fileread(fileid) : copie le contenu du fichier dans le buffer
filepos(fileid) : retournela position du curseur dans le fichier
filesetpos(fileid,pos) : régle la position du curseur dans le fichier (0 = 1er caractère, 1= 2e caractère, etc ...)
filesize(fileid) : retourne la taille du fichier en octets.
V. Les buffers multiples

39Dll permet également de travailler avec plusieurs buffers, et-ce de manière simple :
createbuffer() = crée un buffer et renvoie son id
freebuffer(id) = supprime le buffer choisi
bufferexists(id) = retourne true si le buffer existe, false sinon.
et, pour toutes les fonctions utilisant un buffer, ajoutez un argument contenant l'id du buffer à utiliser
exemple :
writeshort(55) devient writeshort(55,bufferid)
readshort() devient readshort(bufferid)
le buffer 0 est le buffer utilisé par défaut, il ne peut pas être supprimé avec freebuffer(0);
VI. autres fonctions utiles

netconnected() = retourne true si l'ordinateur est connecté à internet
lastinIP() = retourne l'ip du dernier message reçu
lastinPort() = idem avec le dernier port
closesocket(id) = supprime le socket choisi


Dernière édition par Levans le Mer 27 Aoû 2008 - 12:55, édité 1 fois
Revenir en haut Aller en bas
Levans
Utilisateur confirmé: Rang *****
avatar

Messages : 1598
Localisation : France -> Île de France -> Essonne -> Gif sur Yvette

MessageSujet: Re: [Tutoriel] 39Dll : jeux multijoueurs sur internet   Mer 27 Aoû 2008 - 9:28

Voilà, ce tuto est terminé. J'espère qu'il vous aura permi de maitriser cette puissante Dll, ou tout au moins de la trouver moins déroutante. Si vous trouvez une erreur en testant les codes que je vous ai donnés, merci de me le signaler que je corrige.

C'est tout, j'attends vos commentaires happy1


Dernière édition par Levans le Mer 27 Aoû 2008 - 12:59, édité 1 fois
Revenir en haut Aller en bas
alpha
Modérateur
avatar

Messages : 5030
Projet Actuel : Me taper la tête sur le mur.

MessageSujet: Re: [Tutoriel] 39Dll : jeux multijoueurs sur internet   Mer 27 Aoû 2008 - 9:36

Hey Levans, ça faisait un bout de temps happy1
Il est pas mal du tout le tutoriel.


Ps: bon retour chez les fous gnii
Revenir en haut Aller en bas
http://www.perdu.com/
edi9999
Utilisateur confirmé: Rang *****
avatar

Messages : 2480
Localisation : France
Projet Actuel : theatre flashy

MessageSujet: Re: [Tutoriel] 39Dll : jeux multijoueurs sur internet   Mer 27 Aoû 2008 - 11:15

Vraiment bien le tutoriel, ca pourra servir a tous ceux qui veulent faire un jeu multijoueur en ligne.

_________________
Mes tutos sur le site: -Tutoriel débutant- Tutoriel intermédiaire
Venez sur http://gameplay.c.la pour des tutos sur mon site.
Utilisez des hébérgeurs gratuits et sans temps d'attente!:
http://willhostforfood.com/
Revenir en haut Aller en bas
http://gameplay.c.la/
Wargamer
*Excellent utilisateur*
avatar

Messages : 6936
Projet Actuel : Bataille de cake au fruits

MessageSujet: Re: [Tutoriel] 39Dll : jeux multijoueurs sur internet   Mer 27 Aoû 2008 - 13:35

ca va m'être super utile coeur
sauf que c'Est looooooooooooong gha je sias pas si je vias avoir le courage de lire gnii
bon travail sinon super

_________________

Règle #1 du CBNA, ne pas chercher à faire dans la subtilité; personne comprend
Revenir en haut Aller en bas
M@d_Doc
Modérateur
avatar

Messages : 6600
Localisation : 47°44'8.04
Projet Actuel : aucun

MessageSujet: Re: [Tutoriel] 39Dll : jeux multijoueurs sur internet   Mer 27 Aoû 2008 - 13:44

je vais de ce pas le mettre sur le site! bon boulot!

_________________
Tous les icones de gm utilisables sur le cbna ICI
Revenir en haut Aller en bas
http://www.lecbna.org
M@d_Doc
Modérateur
avatar

Messages : 6600
Localisation : 47°44'8.04
Projet Actuel : aucun

MessageSujet: Re: [Tutoriel] 39Dll : jeux multijoueurs sur internet   Mer 27 Aoû 2008 - 14:10

voilà, l'article est mis en forme, corrigé et posté!

_________________
Tous les icones de gm utilisables sur le cbna ICI
Revenir en haut Aller en bas
http://www.lecbna.org
Invité
Invité



MessageSujet: Re: [Tutoriel] 39Dll : jeux multijoueurs sur internet   Mer 27 Aoû 2008 - 14:38

punaise ça c'est du service rapide gha
Revenir en haut Aller en bas
Scooby Doo
Utilisateur confirmé: Rang *
avatar

Messages : 265
Localisation : Québec !

MessageSujet: Re: [Tutoriel] 39Dll : jeux multijoueurs sur internet   Mer 27 Aoû 2008 - 15:39

J'aurais bien aimé avoir un bon tutoriel comme ca quand j'ai commencé a utiliser la .39dll.

_________________
Scooby Doo by doo where are you . . . http://cbna.forumactif.com . . . http://www.lecbna.org/

Mon Jeu, Nothing Less !
Revenir en haut Aller en bas
http://Google.com
Levans
Utilisateur confirmé: Rang *****
avatar

Messages : 1598
Localisation : France -> Île de France -> Essonne -> Gif sur Yvette

MessageSujet: Re: [Tutoriel] 39Dll : jeux multijoueurs sur internet   Mer 27 Aoû 2008 - 18:09

[edit : 30/08/2008, 18h26] c'est hallucinant à quel point ce topic est vite tombé dans l'oubli gha il a duré en tout et pour tout 9 heures .... Je fais donc un travail si mauvais pourqu'on ne se donne pas la peine de le commenter ? snif snif (ok ok je sors fleche_d )

ben en fait, j'ai pas fini de tout lire lowl

[edit] heuu ... jcrois qu'ya un modo qui s'est gouré et qui a édité mon message au lieu de répondre non ?


Dernière édition par Levans le Dim 31 Aoû 2008 - 10:14, édité 1 fois
Revenir en haut Aller en bas
Mass
*Excellent utilisateur*
avatar

Messages : 3331
Localisation : Dans une canonnière wookie.
Projet Actuel :
Things


MessageSujet: Re: [Tutoriel] 39Dll : jeux multijoueurs sur internet   Sam 30 Aoû 2008 - 19:59

Cool, je vais pouvoir arrêter d'harceler dam par mp pour avoir des explications gnii
(maintenant, j'harcèle levans ! :nezrouge: )
nan j'déconne

_________________
Wyvup
Revenir en haut Aller en bas
http://madmass.mype.fr/CBNA/
Wargamer
*Excellent utilisateur*
avatar

Messages : 6936
Projet Actuel : Bataille de cake au fruits

MessageSujet: Re: [Tutoriel] 39Dll : jeux multijoueurs sur internet   Ven 3 Oct 2008 - 0:37

je up pour dire que je testerais bientot(1-5 mois noel )

_________________

Règle #1 du CBNA, ne pas chercher à faire dans la subtilité; personne comprend
Revenir en haut Aller en bas
Levans
Utilisateur confirmé: Rang *****
avatar

Messages : 1598
Localisation : France -> Île de France -> Essonne -> Gif sur Yvette

MessageSujet: Re: [Tutoriel] 39Dll : jeux multijoueurs sur internet   Dim 5 Oct 2008 - 14:23

Wargamer a écrit:
je up pour dire que je testerais bientot(1-5 mois noel )
et ben, on a pas la même notion de bientôt ... gnii gnii

_________________


Tuto 39Dll, jeux multijoueurs sur internet :
fleche_d ici fleche_g


pour la compet n°7 coeur coeur
Revenir en haut Aller en bas
Wargamer
*Excellent utilisateur*
avatar

Messages : 6936
Projet Actuel : Bataille de cake au fruits

MessageSujet: Re: [Tutoriel] 39Dll : jeux multijoueurs sur internet   Dim 5 Oct 2008 - 14:34

ba ton tuto est assez long donc ca va me prendre quelque mois a lire(5min par jours gnii )

_________________

Règle #1 du CBNA, ne pas chercher à faire dans la subtilité; personne comprend
Revenir en haut Aller en bas
lubichro
Invité



MessageSujet: Re: [Tutoriel] 39Dll : jeux multijoueurs sur internet   Mer 22 Oct 2008 - 15:22

Voilà le message que j'ai en lançant le client a la fin de la première partie du tutorial, on peut me dire ce que j'ai fait de mal ?
Citation :
ERROR in
action number 1
of Create Event
for object control:

In script tcpconnect:
Error in code at line 6:
return external_call(global._SokA, argument0, argument1, argument2);

at position 30: Unknown variable _SokA

Pourtant c'est j'ai fait un copié/collé du tuts :
Code:
global.server=tcpconnect(127.0.0.1,12345,1);
Revenir en haut Aller en bas
lubichro
Invité



MessageSujet: Re: [Tutoriel] 39Dll : jeux multijoueurs sur internet   Mer 22 Oct 2008 - 15:34

J'ai trouvé, il faut bien evidemment initialisé la dll pour commencer, donc dans le client=>controller=>create event :
Code:

dllinit(0,true,false);
global.server=tcpconnect(127.0.0.1,12345,1);
Et etc

(c'est sympa de pouvoir poster en invité)
Revenir en haut Aller en bas
hide
Nouveau


Messages : 2
Projet Actuel : SHMUP_engine

MessageSujet: Re: [Tutoriel] 39Dll : jeux multijoueurs sur internet   Mer 22 Oct 2008 - 15:58

hopla, c'était moi ubichro.

Donc pour continuer :
Dans le serveur=>controlleur=>draw event il faut remplacer :
Code:

for(k=0;k<=nbjoueurs-1;k+=1)
{
draw_text(10,20*(k+2),ds_list_find_value(global.listsocks,k));
}
par ça :
Code:

for(k=0;k<=nbjoueurs-1;k+=1)
{
draw_text(10,20*(k+2),ds_list_find_value(global.listsockets,k));
}

listsocks => listsockets
et a nouveau plus loin :
Code:
sendmessage(ds_list_find_value(global.listsockets,i)); // on envoie le message
puis aussi dans le draw :
Code:
draw_text(10,20*(k+2),ds_list_find_value(global.listsockets,k));
J'aurai peut être du faire l'inverse :gniah:
===============================================
Là c'est pas une erreur parce que c'est trop évident mais c'est juste pour noter :
Code:
//keyboard up
if(y>0)
{
y-=4;
}
Doit bien evidemment être :
Code:
if keyboard_check(vk_up)
{
  if(y>0)
  {
    y-=4;
  }
}
Et de même pour les autres directions.
===============================================

J'arrive pas a afficher les monstres, si je mets ça dans le draw d'un objet monstre que j'aurais créer, ça ne marche pas puisqu'il n'est créer nulle part :
Code:
for(i=0;i<=monsternb-1;i+=1)
{
draw_sprite(sprite_autre_joueur0,monsterlist_x[i],monsterlist_y[i]);
}
draw_sprite(sprite_joueur,0,x,y); // on affiche son propre sprite
Et si je le mets dans le draw du joueur il me dit qu'il ne connait pas la variable monsternb.
En tout cas il faut mettre le draw_sprite(joueur) dans le draw du joueur, ça me parait évident et ça marche.

EDIT :
Ça y est ça marche, dans le client=>joueur j'ai ajouté un "create event" avec :
Code:
monsternb=0;
Et toute la partie draw citée au dessus va dans le draw du joueur.

============================================
Je suis sur de rien, je suis encore en train de suivre le tuts.
En tout cas après ces quelques corrections ça se lance, je peut pas bouger mais faut que je regarde ça.

Voilà, avec tout ça, ça marche comme une horloge bien huilée.

Mon résultat final (Server+Client+39dll) : 39dll_tuto.zip - 0.09MB

Au final le tuts est plutôt bien fichu même si on sent un léger ras-le-bol vers la fin, ça marche et pour un tutoriel si complexe c'est très bien.
:p_merci: :p_merci:

Ça aurait été cool d'avoir un début de piste ou un lien sur le comment pouvoir le faire marcher sur internet (je doute que se connecter sur 127.0.0.1 marche dans ces cas) mais je vais pas en demander trop. happy1

Sur ce je vais essayer de comprendre comment tout ça marche plus en détail.


Dernière édition par hide le Jeu 23 Oct 2008 - 17:47, édité 18 fois
Revenir en haut Aller en bas
Levans
Utilisateur confirmé: Rang *****
avatar

Messages : 1598
Localisation : France -> Île de France -> Essonne -> Gif sur Yvette

MessageSujet: Re: [Tutoriel] 39Dll : jeux multijoueurs sur internet   Mer 22 Oct 2008 - 16:12

ah en effet, étourderie de ma part, je corrige happy1

_________________


Tuto 39Dll, jeux multijoueurs sur internet :
fleche_d ici fleche_g


pour la compet n°7 coeur coeur
Revenir en haut Aller en bas
hide
Nouveau


Messages : 2
Projet Actuel : SHMUP_engine

MessageSujet: Re: [Tutoriel] 39Dll : jeux multijoueurs sur internet   Mer 22 Oct 2008 - 17:47

Levans revient, c'est pas fini ! diable
Tu dit une vrai connerie là (ou je comprend rien... C'est pas exclus) :
Citation :
et un code d'affichage à mettre dans le draw du monstre :

Soit j'ai sauté tout le passage ou on crée ce monstre, soit en réalité il faut le mettre dans le draw du joueur auquel cas j'arrive pas a le faire marcher. Voir dans mon précédent message.


EDIT :
Ca y est ça marche, dans le client=>joueur j'ai ajouté un "create event" avec :
Code:
monsternb=0;
Et toute la partie draw va dans le draw du joueur.


Dernière édition par hide le Jeu 23 Oct 2008 - 17:52, édité 1 fois
Revenir en haut Aller en bas
Levans
Utilisateur confirmé: Rang *****
avatar

Messages : 1598
Localisation : France -> Île de France -> Essonne -> Gif sur Yvette

MessageSujet: Re: [Tutoriel] 39Dll : jeux multijoueurs sur internet   Jeu 23 Oct 2008 - 13:41

par monstre je faisais référence au joueur : dans le tuto, je lui met un sprite de monstre pacman ^^

pour monsternb, comme elle est changée à chaque step, il me semblait que le 1e step se déroulait avant le début du draw, en tout cas chez moi sa marchait ...

mais bon, ce ne sont que des "détails" qui n'ont pas de rapport direct avec l'utilisation de la Dll, ce qui est le but du tuto non ?

(et oui, j'essaye de me racheter gnii gnii )

_________________


Tuto 39Dll, jeux multijoueurs sur internet :
fleche_d ici fleche_g


pour la compet n°7 coeur coeur
Revenir en haut Aller en bas
972_creator
Bavard


Messages : 106
Projet Actuel : Matrix Trilogy 2D

MessageSujet: Re: [Tutoriel] 39Dll : jeux multijoueurs sur internet   Ven 13 Fév 2009 - 13:03

:p_hello:

Code:
dllinit(0,true,false);
ne fonctionne pa... :honte:

pourtant gé bien installer le GEX 39dll ( g gm7) et toute les autre fonction fonctionne... :gniah:

HELP :p_svp:

_________________
The matrix has you
Revenir en haut Aller en bas
Invité
Invité



MessageSujet: Re: [Tutoriel] 39Dll : jeux multijoueurs sur internet   Ven 13 Fév 2009 - 15:46

:p_hello:

ah bon ! triste ange

relis le tutoriel encore une fois, super gnii rire2

:p_bye: :p_salut:
Revenir en haut Aller en bas
Wargamer
*Excellent utilisateur*
avatar

Messages : 6936
Projet Actuel : Bataille de cake au fruits

MessageSujet: Re: [Tutoriel] 39Dll : jeux multijoueurs sur internet   Sam 14 Fév 2009 - 1:48

lol shm noel

_________________

Règle #1 du CBNA, ne pas chercher à faire dans la subtilité; personne comprend
Revenir en haut Aller en bas
Mass
*Excellent utilisateur*
avatar

Messages : 3331
Localisation : Dans une canonnière wookie.
Projet Actuel :
Things


MessageSujet: Re: [Tutoriel] 39Dll : jeux multijoueurs sur internet   Sam 11 Avr 2009 - 10:13

j'ai un bug :
les positions x et y restent à 0. Je pense que ça vient de là :
Code:
socketjoueur = tcpaccept(global.socket,1)
if(socketjoueur>0)
{
ds_list_add(global.listsockets,socketjoueur);
ds_list_add(global.listx,0);
ds_list_add(global.listy,0);
}
si j'ai bien compris les listes, ça ajoute à global.listx et à global.listy la valeur 0, non ?
donc j'ai donc remplacé par ds_list_add(global.listx,readshort()) et ds_list_add(global.listy,readshort());
il m'affiche donc les positions x et y au départ, mais celles-ci ne sont pas actualisées !
quelqu'un peut-il m'aider ?

_________________
Wyvup
Revenir en haut Aller en bas
http://madmass.mype.fr/CBNA/
jo
*Excellent utilisateur*
avatar

Messages : 4879
Localisation : CENSURE T_T
Projet Actuel : FAC

MessageSujet: Re: [Tutoriel] 39Dll : jeux multijoueurs sur internet   Mer 2 Déc 2009 - 0:15

Une autre erreur :

dans le joueur il faut remplacer

Citation :
for (i=0;i<=monsternb-1;i+=1)
{
monsterlist_x=readshort(); // on enregistre leurs coordonnées dans des tableaux
monsterlist_y[i]=readshort();
}
}

par

Citation :
for (i=0;i<=monsternb-1;i+=1)
{
monsterlist_x[i]=readshort(); // on enregistre leurs coordonnées dans des tableaux
monsterlist_y[i]=readshort();
}
}


Et surtout, il faudrait peut-être penser a mettre à jour la version du tuto sur le site. Dés que j'ai vu que m@d l'avait mis en ligne, jme suis dit "Super, jvais sur le site et jregarde la dessus, ça sera plus lisible"

Sauf qu'il n'y avait aucune correction dessus. Jme suis donc emmerdé (note que ça m'a fait un très bon exercice) a tout corriger, avant de voir en revenant sur le topic ici que ça avait déjà été fait.

Tout ça pour dire, merci beaucoup levans, exellent tuto^^

_________________
http://viciousslugs.sup.fr/ <- Des imbéciles en action. Venez visiter, on recherche des lecteurs, des auteurs, et ça paye mal. En fait ça paye pas, mais ya moyen de se marrer.
Revenir en haut Aller en bas
http://psyckho.skyrock.com/
lionelvader
Très bonne participation
avatar

Messages : 114
Localisation : la louviere/hainaut/belgique

MessageSujet: Re: [Tutoriel] 39Dll : jeux multijoueurs sur internet   Dim 3 Jan 2010 - 12:39

je ne trouve pas la dll, quelqu'un pourrais m'aider, j'ai téléchargé "Winsock 39 GEX" mais je ne sais pas ou télécharger la dll, tout les liens qui semblait y mener sont mort

_________________
Télécharger mes jeux:
-Snake- -CasseBrique-

Télécharger mes exemple:
-IA suivre objet-
Revenir en haut Aller en bas
Linky439
Utilisateur confirmé: Rang *****
avatar

Messages : 2632
Localisation : Sur le forum du CBNA...ou pas
Projet Actuel : La Galaxie Scellée

MessageSujet: Re: [Tutoriel] 39Dll : jeux multijoueurs sur internet   Dim 3 Jan 2010 - 12:51

http://www.mediafire.com/download.php?khntwwavdzo
Wink

_________________
Cliquez pour accéder aux topics dédiés !
   
Revenir en haut Aller en bas
lionelvader
Très bonne participation
avatar

Messages : 114
Localisation : la louviere/hainaut/belgique

MessageSujet: Re: [Tutoriel] 39Dll : jeux multijoueurs sur internet   Dim 3 Jan 2010 - 13:00

merci beaucoup

_________________
Télécharger mes jeux:
-Snake- -CasseBrique-

Télécharger mes exemple:
-IA suivre objet-
Revenir en haut Aller en bas
Contenu sponsorisé




MessageSujet: Re: [Tutoriel] 39Dll : jeux multijoueurs sur internet   

Revenir en haut Aller en bas
 
[Tutoriel] 39Dll : jeux multijoueurs sur internet
Revenir en haut 
Page 1 sur 3Aller à la page : 1, 2, 3  Suivant
 Sujets similaires
-
» Les petits jeux gratuits d'internet
» jeux de lettres et sudoku en ligne
» Configurer le pare-feu pour PG avec Norton Internet Security
» Ou acheter MAC sur Internet
» Salle de jeux p2 !

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
Forum Le CBNA :: Développement :: Game Maker-
Sauter vers: