Le Multijoueur sous GameMaker expliqué (2024)

Le Multijoueursous GameMaker expliqué
Buhl Damien
allias daminetreg
http://lecbna.com/

- Topic ForumCorrespondant

GameMaker6 et +
Enregistré
Bien,
Je vais dans ce petit tutorial (:p) énumerer toutes lesfaçons defaire un jeu multijoueur sousGameMaker.
Aussi à sa fin vous trouverez comment créer un jeumultijoueur rapidement et facilement, le tout bien expliqué par mes soins.
Aller laissez vous tenter, c'est lu en une demi-heure, et le tuto enfin de page dure 15 minutes, allez s'il vous plaît dites oui?
45 minutes de votre temps pour devenir un Online GMProger.
De plus si ça vous paraît trop long vous pouvez juste lirela fin du tutorial: Un petit projet, cela ne durera que 15 minutes,toutefois il est conseillé de le lire en entier si l'on veutvraiment comprendre, et pas juste recopier. Merci d'avance.

Voici le Sommaire:

GML:Mode Multi Joueurs

1Configurer une connexion
2Créer et Rejoindre des Sessions
3Joueurs
4Partage de Données ou Shared Data
5Messages
AutresFaçons De Créer Un Jeu Multi Joueurs
Un petitProjet

GML: Mode Multi Joueurs



Jouer contre l'ordinateur est amusant. Mais jouer contre d'autresêtres humains peut être encore plus amusant. Il estrelativement facile de fabriquer de tels jeux car vous n'aurez pasà mettre en place des algorithmes compliquésd'Intelligence Artificielle (IA). Vous pouvez bien sur mettre deuxjoueurs devant le même clavier et leurs demander d'utiliser destouches différentes mais il est plus intéressant demettre chaque joueur devant son ordinateur. Ou mieux encore, unjoueur de chaque côté de l'océan. Game Maker offreun support multi joueurs. Veuillez réaliser que synchronisertout ce petit monde sans délai d'attente est une tâchedifficile, et qu'ici je ne ferais qu'expliquer les bases.

1Configurer une connexion

Pour que 2 ordinateurs communiquent, il faut un protocole de connexion.Comme beaucoup de jeux, Game Maker offre 4 différents types deconnexion : IPX, TCP/IP, Modem, et Série :

IPX Ce protocole fonctionne de façoncomplètement transparente. Il peut être utilisé pardifférents joueurs situés sur le même réseaulocal. Il doit être installé sur votre ordinateur pourêtre utilisable (voir la documentation d'installation de Windowsou allez dans les propriétés du Voisinage Réseauet ajoutez le protocole IPX)
TCP/IP est le protocole internet. Il peut êtreutilisé pour jouer avec des personnes situées n'importeoù sur le Web, à condition que vous connaissiez leursadresses IP.
Modem Il faut dans ce cas appeler un autre joueurayant lui aussi un modem par son numéro detéléphone et une chaîne de caractèresd'initialisation.
Série Grâce à un simplecâble entre 2 ordinateurs, vous pouvez jouer ensemble àcondition de préciser le port série (Com1, Com2 etc.)utilisé.

Voici les fonctions utilisables :

mplay_init_ipx()
Initialise une connexion IPX.
mplay_init_tcpip(adr)
Initialise une connexion TCP/IP . Adr est une chaîne IP('www.gameplay.com' ou '123.123.123.222') suivie éventuellementd'un port (':12' à '123.123.123.222:12). Sur un réseaulocal, les adresses ne sont pas nécessaires.
mplay_init_modem(init,notel)
Initialise une connexion modem. Init est la chaîned'initialisation (peut être vide) et NoTél est lenuméro de téléphone à appeler('001122334455'). C'est seulement pour joindre une session qu'il vousfaut un n° de téléphone.
mplay_init_serial(noport,vitesse,bitarret,parité,flux)
Initialise une connexion série.
- NoPort est le numéro de port (1-4). 0affiche une boîte de dialogue.
- Vitesse (baudrate) 100 Bauds à 256 KBauds.
- BitArrêt 0 = 1 bit, 1 = 1.5 bit, 2 = 2 bits.
- Parité 0=none, 1=odd, 2=even, 3=mark.
- Flux (flow ctrl) 0=none, 1=xon/xoff, 2=rts,3=dtr, 4=rts et dtr.
Indique si la connexion est réussie. Un paramétrageclassique est : 1,57600,0,0,4.

Votre jeu doit utiliser ces fonctions qu'une seule fois. Toutes cesfonctions indiquent si l'initialisation s'est correctementdéroulée. Il y a erreur si le protocole n'est pasinstallé ou supporté par l'ordinateur. Pourvérifier si la connexion en elle-même est correcte,utilisez la fonction :

mplay_connect_status()
Retourne le type de statut de la connexion en cours
0 : erreur 1 : IPX 2 :TCP/IP 3 : Modem 4 : Série

mplay_end()Coupe la connexion.

Quand vous utilisez une connexion TCP/IP, vous devez connaîtrel'adresse IP de la personne jointe. Et parfois la vôtre ! Lafonction suivante y pourvoit :

mplay_ipaddress()
Retourne l'adresse IP de votre ordinateur (exemple : '123.123.123.12').Vous pouvez afficher cette adresse à l'écran. Attention,cette routine prend du temps (enfin pas tant que ça).

2Créer et Rejoindre des Sessions

Quand vous vous connectez à un réseau, il peut y avoirdivers jeux en cours de route. Nous appelons çà dessessions. Ces différentes sessions correspondent àdifférents jeux ou à un seul. Un jeu doit êtreidentifié de façon unique sur un réseau.Heureusem*nt, Game Maker s'en occupe. La seule chose àsavoir est que vous devez changer l'identifiant dans les options dujeu à travers les différentes versions. Sans cetteprécaution, il est possible de jouer avec des personnes ayantune ancienne version ou une récente.

Si vous démarrer une session multi joueur, il faut lacréer:

mplay_session_create(nomsession,maxi,nomjoueur)
Crée une nouvelle session dans la connexion en cours.
- NomSession est le nom de la session à créer.
- Maxi est le nombre maximum de joueurs dans cette session.
- NomJoueur est le nom du joueur, le vôtre.
Indique si la session a pu être créée.

Une instance du jeu doit créer la session. Les autres instancesdu jeu rejoignent la session qui vient d'êtrecréée. C'est un peu plus compliqué : Vous devezd'abord voir quelles sessions sont disponibles puis choisir celleà rejoindre. 3 fonctions s'en occupent :

mplay_session_find()
Recherche toutes les sessions qui acceptent des joueurs et retourne lenombre de sessions trouvées.
mplay_session_name(num)
Retourne le nom de la session n° Num (0 est la 1èresession). Cette routine ne fonctionne que si laprécédente a été appelée.
mplay_session_join(num,nomjoueur)
Vous introduit dans la session n° Num (0 est la 1èresession). NomJoueur est le nom que vous décidez de prendre entant que joueur dans la session.La fonction indique si tout s'est bienpassé.

Il y a une autre routine qui vous permet de changer de mode de session.Doit être appelée après la création de lasession :

mplay_session_mode(dépl) Faut-il oui ou non transférer l'hôte dela session sur un autre ordinateur quand l'hôte quittera lapartie ? Dépl est soit sur True ou sur False (valeurpar défaut).

Pour connaître le statut de la session en cours :

mplay_session_status()Retourne le statut : 0 = pas de session, 1 = sessioncréée, 2 = session rejointe.

Un joueur peut quitter la session par la fonction suivante :

mplay_session_end()Termine la session pour le joueur.

3Joueurs

Chaque instance du jeu qui rejoint une session est enréalité considérée comme un joueur. Chaquejoueur a un nom. Trois routines s'occupent des joueurs :

mplay_player_find()Recherche tous les joueurs d'une session et retourne le nombre dejoueurs trouvés.
mplay_player_name(num)Retourne le nom du joueur n° Num (0 étant le 1erjoueur). Cette routine ne fonctionne que si la précédentea été appelée.
mplay_player_id(num)Retourne l'identifiant unique (id) du joueur n° Num (0étant le 1er joueur). Cette routine ne doit êtreutilisée qu'après avoir lancé mplay_player_find().Cet ID est utilisé pour envoyer et recevoir des messages desautres joueurs.

4Partage de Données ou Shared Data

La communication par partage de données est probablement lafaçon la plus simple( pour les matheux, car il vous faudra fairedeux trois calculs pour définir les slots selon le nombre dejoueurs) et la meilleur de synchroniser le jeu. Toutes voscommunications sont protégées. Il y a un ensemble de1000000 valeurs (ou emplacements, je préfère nommerça Slot) qui sontcommunes à tout le jeu. Chaque instance du jeu peut lire etécrire des valeurs dans ces emplacements. Game Maker garantitque chaque instance du jeu (chaque joueur) voit les mêmesvaleurs. Une valeur peut être un réel ou texte. Il y aseulement 2 routines :

mplay_data_write(e,v)Ecrit la valeur V (texte ou réel) à l'emplacement E(E compris entre 0 et 1000000).
mplay_data_read(e)Retourne la valeur de l'emplacement E (entre 0 et 1000000). Audébut, toutes les valeurs sont à 0.

Pour synchroniser ces valeurs sur différents ordinateurs, vouspouvez utiliser un mode "garanti" qui vous assure que chaque changementde valeur sera bien envoyé à tout le monde (mode lent) ouun mode "non garanti" plus rapide. Pour choisir le mode, utilisez lafonction :

mplay_data_mode(guar)
Guar = true mode "garanti" (valeur pardéfaut).
Guar = false mode "non garanti".

Note: Le mode garanti, n'est pas silent que les gens le pense, mieux vaut l'utiliser, jusqu'à uncertain nombre de joueurs, puis au dessus de ce nombre changer le mode.
Pour les mmo, qui comporte beaucoup de joueurs, le mode non garanti estintéressant pour les déplacements mais pour ce qui estdesmessages privés etc... mieux vaut l'utiliser,
après vous faites ce que vous désirez.

5Messages

Le second mécanisme de communication que Game Maker supporte estl'envoi et la réception de message. Un joueur peut envoyer desmessages vers un joueur en particulier ou à tous les joueurs.Les joueurs peuvent ainsi accorder leurs actions en fonction desmessages reçus. Ces messages peuvent être envoyésen mode "garanti" pour être sur qu'ils arrivent (mais ce mode estlent) ou en mode "non garanti" (qui est plus rapide et tout aussifiable devrais je dire...).

Les routines suivantes existent :

mplay_message_send(joueur,id,val)
Envoie un message au joueur indiqué (soit un identifiant ou unnom, utilisez 0 pour adresser un message à tous les joueurs). Idest un nombre entier qui identifie le message et Val est la valeur(texte ou réel). Le message est envoyé en mode "nongaranti".
mplay_message_send_guaranteed(joueur,id,val)
Idem que la précédente sauf que le message estenvoyé en mode "garanti".
mplay_message_receive(player)
Reçoit le prochain message stocké dans la mémoired'entrée, de réception des messages, tampon(buffer/queue) qui provient du joueur indiqué (nom ouidentifiant). Utilisez 0 pour recevoir un message de tous les joueurs.La routine indique s'il existe effectivement un message à lire.Pour consulter le message, utilisez les fonctions suivantes :
mplay_message_id() Retourne l'identifiant du dernier message reçu.
mplay_message_value() Retourne la valeur du dernier message reçu.
mplay_message_player() Indique le joueur qui a envoyé le derniermessage reçu.
mplay_message_name() retourne le nom du joueur qui a envoyé ledernier message reçu
mplay_message_count(joueur) Retourne le nombre de messages restés dans lebuffer d'entrée provenant du joueur indiqué (0 pourcompter les messages de tous les joueurs).
mplay_message_clear(joueur) Supprime tous les messages restés dans le tampond'entrée du joueur indiqué (0 pour effacer tous lesmessages de tous les joueurs).

Pour envoyer un message, il faut connaître l'identifiant ou lenom du joueur voulu. Utilisez la fonction mplay_player_id() pour leconnaître. Si plusieurs joueurs ont le même nom, seul le1er est concerné. Idem pour lire un message particulier, il fautconnaître qui l'envoie.
Pourquoi chaque message possède un identifiant ? La raison estque çà facilite beaucoup la programmation. Cetidentifiant est une sorte de type de message et permet de faire le trien réception. Comme l'envoie de messages n'est pas garanti, vouspouvez utiliser cet identifiant comme une sorte de compteur afin devérifier si tout a bien été reçu dansl'ordre.


Bien sûr il existe d'autresfaçons de créer un jeu multijoueur sousGameMaker, mais puisqu'elle ne sont pasofficielles nous ne les aborderons pas.
Je vais juste vous donnez quelques noms afin que vous puissiez lesretrouver sur la toile:
-GMSock
-SOC
-GMProxy
-CBNA_IPC
Et sûrement d'autres dont je ne connais pas l'existence.


Un petit Projet

Bien, il est tant d'appliquer ce quevous venez d'apprendre n'est-ce pas?
Si vous ne voulez pas tant pis, mais je l'ai déjàécris et vous me fairez le plaisir de lire...

Légende:
Sprites
Sounds
Background
Paths
Scripts
Fonts
Timelines
Objects
Rooms

Groupe

Event
Action

§Point étape
!Informationimportante


1) Le jeu

Tout d'abord, qu'allons nous faire?
Un jeu vidéo simple multijoueur sur internet, pour évitertous calculs mathématiques périlleux, nous allons donclimiternotre jeu à 2 joueurs.
Que diriez vous d'un jeu où deux joueur se déplacent dansune room?
Ce n'est pas vraiment un jeu, mais c'est un moyen de vous apprendreàvous servir du multijoueur et de créer quelques chosed'intéressant et simple à programmer.

2) Le système dontnous allons userMaintenant, quel protocole allons nous utiliser?
Les message seraient intéressant pour un tchat, mais les shareddata sont beaucoup plus intéressants pour une mise àjour en temps réel des informations sur le joueur comme lesvariables x,y.
Donc ici nous userons des Shared data.

3) Mise en application
Vous êtes prêt?
Ok, on y va!
Bien nous allons tout d'abord définir les paramètresglobaux du jeu, ainsi que le script de connexion serveur et client.

Nous allons créer l'unique script deconnexion:

script_connect

ip= get_string("Ip:","127.0.0.1");

if (mplay_init_tcpip(ip) != 1)
{
show_message("ConnexionImossible.");
break;
}
else
{
global.name = get_string("Nom dujoueur","daminetreg");
}

if (mplay_session_find() == 0)
{
game_name = get_string("Nomde la partie:","Serv");
global.gamename =game_name;
mplay_session_create(game_name,2,global.name);
global.ident = 1;//Pourdéfinir qui est le joueur 1
//Jeu en préchargement
}
else
{
global.gamename = mplay_session_name(0);
mplay_session_join(mplay_session_name(0),global.name);
global.ident = 2;//Pourdéfinir qui est le joueur 2
}

global.number = mplay_player_find();//Nousn'en aurons pas usage

On règle sur 2 le nombre max de joueur.

!Soyez conscient qu'il faut toujours qu'il y est un joueur qui fasse leserveur et l'autre le client, sinon le jeu ne peut pas fonctionner.
Maintenant créons un objet: Y_control

Y_control

Vous y entrerez les paramètres suivant:
Selectionnez l'event createpuis entrez y l'action Execute a piece of code:

mplay_data_mode(false);//Lesdonnées seront en mode non garanti
script_connect();

§Vous enêtes là, Step 1:
Le Multijoueur sous GameMaker expliqué (1)
Voir l'image engrand
Récapitulatif:
-Vous avez créé le script_connect
-Vous avezcréé un objet Y_control


Bien maintenant il nous faut créer les scripts demaintenance desjoueurs, c'est à dire les scripts qui vont mettre à jouret qui vontlire les mises à jour des déplacement des joueurs.
Nous inclueront aussi dans ce script, un système pour savoir siun des deux joueurs quitte la partie.
Donc, créons dans Scripts un groupe que nous nommerons: Maintenance
Nous y placerons les deux scripts qui suivent:
script_update_p1

//Scriptde maintenance du joueur 1
//lecture des déplacements
x = mplay_data_read(5);
y = mplay_data_read(6);
//Déplacements
if global.ident = 1//sile joueur est l'hôte
{
if (keyboard_check(vk_up))
{
y -= 6
mplay_data_write(6,y);
}

if (keyboard_check(vk_down))
{
y +=6
mplay_data_write(6,y);
}

if (keyboard_check(vk_left))
{
x -= 6
mplay_data_write(5,x);
}

if (keyboard_check(vk_right))
{
x +=6
mplay_data_write(5,x);
}
}

//Si l'autre joueur quitte
//if (mplay_player_find() < 2)
//{
// show_message('...::Le joueur adverse aquitté la session::...');
// game_end();
//}



script_update_p2

//Scriptde maintenance du joueur 2
//Synchronisation des déplacements
x = mplay_data_read(11);
y = mplay_data_read(12);
//Déplacements
if global.ident = 2//Sile joueur est le client
{
if (keyboard_check(vk_up))
{
y -= 6
mplay_data_write(12,y);
}

if (keyboard_check(vk_down))
{
y +=6
mplay_data_write(12,y);
}

if (keyboard_check(vk_left))
{
x -= 6
mplay_data_write(11,x);
}

if (keyboard_check(vk_right))
{
x +=6
mplay_data_write(11,x);
}
}

//Si l'autre joueur quitte
//if (mplay_player_find() < 2)
//{
// show_message('...::Le joueur adverse aquitté la session::...');
// game_end();
//}


!

Nousavons créer deux scripts quasiment similaire, pour bien vous montrer qu'il faututiliser des slots différents pour les données du joueur1 et les données du joueur 2. En réalité il serait préférable de ne faire qu'un seul script se basant sur une variable d'identifiant de joueur associée a un objet joueur unique, mais ici c'est un anti-pattern à but pédagogique.
Prenez la 11ème ligne:

mplay_data_write(12,y);

Le 12est le slot utilisé, et le y la valeur qui est attribuéà ce slot.
On ne peut pas utilisé deux fois le même slot? biencompris? des réticences? Non? vousêtes un bon élève. :p

Maintenant nous allons créer un groupe nommé Joueurs dans objects, nous yinclueront les objets: J1et J2
Vous créerez aussi un groupe Joueursdans sprite et vous y incluerez les sprites: spr_j1et spr_j2
Suite à cela vous chargerez les sprites de votre choix et lesassignerez à leurs objetsrespectifs, c'est à dire: spr_j1pour J1et spr_j2pour J2.

Dans

J1vous entrerez une piece of code dans step (comme vu plus haut ) pour executer: script_update_p1
Ensuite pour
J2dans stepplacez une piece of code pour executer: script_update_p2Puis vous créerez uneroom nommée Y_room .

Vous y placerez les objets

J1, J2et Y_control

Sauvegardez le tout puis cliquez sur lapetite flèche verte qui permet de faire démarrer le jeu.
Il vous suffit après avoir sauvegardé votre gm6, del'ouvrir deux fois et de le démarrer deux fois, entrez y danschacun l'ip 127.0.0.1 decettes façon vous pourrez tester le jeu en local sur votre ordinateur. ;p
Si cela ne fonctionne pas assurez vous que vous avez la versionEnregistrée de GM 6 ou +, cherchez si vous ne vous êtespas trompéquelque part, éssayez de refaire le tutorial, ou alorsconnectez voussur http://lecbna.com/ direction: LeForum, là il y aura bien quelqu'un pour vous aider ( Moi parexemple ).
Topic du tutorial: http://

§Vous enêtes là, Step Final:
Le Multijoueur sous GameMaker expliqué (2)
Voir l'image en grand
Récapitulatif:
-Vous avez créé le script_connect
-Vous avezcréé un objet Y_control
-Vousavez créé le script_update_p1
-Vousavez créé le script_update_p2
-Vous avez crée le sprite
spr_j1
-Vous avez créé le sprite spr_j2
-Vous avez crée l'objet J1
-Vous avez crée l'objet J2
-Vous avez créé le
script_update_p2


Alors après tout ça? voustrouvez toujours aussi dur de créer un jeu multijoueur?
Vous vous rendez compte, c'est tout simple, c'est même enfantin,maisça semble faire peur à tout le monde, au moins maintenantvous savezcomment faire, et vous savez que ce n'est pas difficile. ;-)

J'espèresimplement que cela vous aidera à créer de super jeuxmultijoueurs, et si jamais vous en créez un, contactez moi: lecbna@estvideo.fr , je seraistrès heureux d'y jouer et de le publier sur Le CBNA.
J'ai passé un agréable moment avec vous merci, vousêtes un bon élève. :)

BuhlDamien
allias daminetreg
Fondateur du CBNA
http://lecbna.com/
@3

Le Multijoueur sous GameMaker expliqué (2024)

References

Top Articles
Latest Posts
Article information

Author: Dr. Pierre Goyette

Last Updated:

Views: 5770

Rating: 5 / 5 (70 voted)

Reviews: 85% of readers found this page helpful

Author information

Name: Dr. Pierre Goyette

Birthday: 1998-01-29

Address: Apt. 611 3357 Yong Plain, West Audra, IL 70053

Phone: +5819954278378

Job: Construction Director

Hobby: Embroidery, Creative writing, Shopping, Driving, Stand-up comedy, Coffee roasting, Scrapbooking

Introduction: My name is Dr. Pierre Goyette, I am a enchanting, powerful, jolly, rich, graceful, colorful, zany person who loves writing and wants to share my knowledge and understanding with you.