|
|
| Auteur | Message |
|---|
master4523 Modérateur GameMaker


Nombre de messages: 2442 Age: 17 Programme utilisé (Gm/RmXp/...): GM6.1 Registered / GM7 Pro / Visual Basic Loisirs: Informatique / Programmation Date d'inscription: 29/06/2006
 | Sujet: Jeu en ligne avec 39dll Dim 13 Mai - 15:03 | |
| *** Requis
- 39dll- GameMaker 6+ version Registered/Pro - De la patience - Un cerveau *** Introduction 39dll vous permet de faire un jeu en réseau avec Game Maker. Notez qu'un jeu en réseau marche comme ceci : | Citation: | | Client >>>Envoit Message>>> Serveur >>>Envoit Message >>> Clients |
Pour commencer nous allons utiliser une base contenant tous les scripts dont GM a besoin : Télécharger la base. Maintenant que vous avez 39dll et la base nous pouvons vraiment commencer.
*** Le Client Nous allons faire une connection simple donc créez un objet que vous appellerez obj_Controller. Dans cet objet, insérez un script dans l'évenement Create. Dans ce script nous allons mettre ce code :
| Code: | dllinit(0,true,false) |
dllinit sert à initialiser la DLL pour qu'elle se mette en marche. A la suite de cette ligne de code, mettez
| Code: | players[0] = 0 global.name = get_string("Pseudo ?","NooB") global.tcpsocket = tcpconnect("127.0.0.1",4523,true); if(!global.tcpsocket) { show_message("Impossible de se connecter au serveur."); game_restart(); exit; } else { instance_create(32,32,obj_Player); }
|
Le client essaye de se connecter au serveur sauf que nous ne l'avons pas encore créé alors il va dire "Impossible de se connecter au serveur." C'est finit pour l'évenement Create de l'objet obj_Controller.
Maintenant dans l'évenement Step du même objet mettez ce script :
| Code: | var size; while(true) { size = receivemessage(global.tcpsocket); if(size < 0) break; if(size == 0) { show_message("Le serveur est fermé.") game_restart(); exit; } event_user(0);
} |
Si le client recevra un message de la part du serveur il appellera la fonction "User Defined 0"
Maintenant occupons nous du plus dur puisque nous allons faire les actions que devra executer le client quand il reçoit un message de la part du serveur. Dans un évenement User Defined 0 mettez ce script :
| Code: | messageid = readbyte(); switch(messageid) { case 0: //Créé un nouveau joueur
name = readstring() p_id = readshort() //p_id contient l'ID du joueur
players[p_id] = instance_create(100,100,obj_other_Player) players[p_id].p_id = p_id players[p_id].name = name
break;
case 1: //Mouvement du joueur
a = players[readshort()] a.x = round(readshort()) a.y = round(readshort()) a.sprite_index = readbyte() a.image_index = readbyte() break;
case 2: //Un joueur quitte ! player_id = readshort() global.playing = readint(); global.playing-=1; with(obj_other_Player) { if other.player_id != p_id exit; instance_destroy(); } break; }
|
Contentez-vous de mettre ce code dans User Defined 0 ca serait trop long d'expliquer ligne par ligne mais si vous avez un peu d'experience vous pourrez facilement "décrypter" ce code lol.
C'est finit pour obj_Controller ! Mais pas pour le client
Créez un objet nommé : obj_Player et mettez lui un sprite quelconque.
Dans Create mettez
| Code: | alarm[11] = 3 alarm[0] = 5 |
Dans Keyboard left mettez x-=4 Dans Keyboard right mettez x+=4 Dans Keyboard up mettez y+=4 Dans Keyboard down mettez y-=4
Dans Alarm 0 mettez
| Code: | clearbuffer() writebyte(1) writeshort(x) writeshort(y) writebyte(sprite_index) writebyte(image_index) sendmessage(global.tcpsocket)
alarm[0] = 3 |
Dans Alarm 11 mettez
| Code: | with (obj_Controller) { clearbuffer() writebyte(0) writestring(global.name) writebyte(other.room) sendmessage(global.tcpsocket) } |
Créez un objet nommé obj_other_Player et mettez lui un sprite quelconque (aucun code dedans).
Créez une room avec UN obj_Controller dedans.
Enregistrez le projet sous un nouveau nom (exemple: Client.gm6) pour ne pas effacer base.gm6 car nous en aurons besoin pour le serveur !
_________________ <iframe name="kirby4523" SRC="http://master4523.123.fr/kirby.php" scrolling="no" height="175" width="180" FRAMEBORDER="no"></iframe>
Au moins, c'est plus naturel que tes cheveux.
Dernière édition par le Lun 24 Déc - 11:38, édité 7 fois |
|
 | |
master4523 Modérateur GameMaker


Nombre de messages: 2442 Age: 17 Programme utilisé (Gm/RmXp/...): GM6.1 Registered / GM7 Pro / Visual Basic Loisirs: Informatique / Programmation Date d'inscription: 29/06/2006
 | Sujet: Re: Jeu en ligne avec 39dll Dim 13 Mai - 15:06 | |
| *** ServeurOuvrez Base.gm6 et ajoutez un objet et nommez le : obj_Controller. Dans cet objet mettez un script dans l'evenement Create : | Code: | dllinit(0,true,false) global.players = 0 //Nombre total de connection depuis que le serveur est allumé global.playing = 0 //Nombre de joueurs qui jouent actuellement global.names = ds_list_create()
listen = tcplisten(4523,10,true);
if(!listen) { show_message("Impossible d'ouvrir le serveur en TCP !"); game_end(); exit; } for(i = 0; i < 256; i += 1) playerlist[i] = -1; |
Maintenant dans l'evenement Step de l'objet mettez un premier bloc de script avec :
| Code: | client = tcpaccept(listen, true); if(client <= 0)exit;
setnagle(client ,true)
new_player = instance_create(0, 0, obj_Login); new_player.name = "Connection..." new_player.p_id = 9999 new_player.socket = client;
|
Puis dans un second bloc de script mettez :
| Code: | var size;
while(1) { size = receivemessage(client); if(size <= 0)break; setpos(buffsize()-1); myid = readbyte(); myid = playerlist[myid]; if(!instance_exists(myid))exit; myid.size = size-1; setpos(0); with(myid)event_user(0); }
|
Ensuite créez un objet nommé : obj_Login Dans Alarm 0 mettez Dans Step mettez | Code: | if(!tcpconnected(socket))instance_destroy(); while(true) { size = receivemessage(socket); if(size < 0) break; if(size == 0) { instance_destroy(); break; } event_user(0); }
|
Puis dans un User Defined 0 mettez :
| Code: | alarm[0] = 100*room_speed; messageid = readbyte(); switch(messageid) {
case 0: //Message de création d'un nouveau joueur name = readstring() if ds_list_find_index(global.names,name) = -1 { ds_list_add(global.names,name) if global.players = 255 { clearbuffer() writebyte(3) //Serveur complet ! sendmessage(socket) exit; } global.players +=1 p_id = global.players clearbuffer() writebyte(4) writeshort(p_id) sendmessage(socket) clearbuffer() writebyte(0); writestring(name); writeshort(p_id)
with (obj_Player) { sendmessage(socket); } with (obj_Player) { clearbuffer() writebyte(0); writestring(name); writeshort(p_id) sendmessage(other.socket) } instance_change(obj_Player,true) global.playing +=1 break; } else { clearbuffer() writebyte(5) //Le joueur existe déjà sendmessage(socket) instance_destroy() exit; } break;
} |
Enfin, créez un objet nommé : obj_Player Dans Alarm 0
| Code: | clearbuffer() writebyte(2) writeshort(p_id)
with(obj_Player) { if (id != other.id) { sendmessage(socket) } }
i = ds_list_find_index(global.names,name) ds_list_delete(global.names,i) global.playing -=1 instance_destroy()
|
Dans Step :
| Code: | if(!tcpconnected(socket))alarm[0] = 1 while(true) { size = receivemessage(socket); if(size < 0) break; if(size == 0) { alarm[0] = 1 break; } event_user(0); }
|
Dans User Defined 0 :
| Code: | alarm[0] = 100*room_speed; messageid = readbyte(); switch(messageid) {
case 1: //Le joueur bouge
x = readshort() y = readshort() sprite = readbyte() image = readbyte() clearbuffer(); writebyte(1); writeshort(p_id); writeshort(x); writeshort(y); writebyte(sprite); writebyte(image); with(obj_Player) { if(id != other.id) { sendmessage(socket); } }
break; }
|
Finalement, mettez obj_Controller dans une nouvelle room et enregistrez le projet sous "Serveur.gm6" _________________ <iframe name="kirby4523" SRC="http://master4523.123.fr/kirby.php" scrolling="no" height="175" width="180" FRAMEBORDER="no"></iframe>
Au moins, c'est plus naturel que tes cheveux.
Dernière édition par le Lun 14 Mai - 19:10, édité 3 fois |
|
 | |
master4523 Modérateur GameMaker


Nombre de messages: 2442 Age: 17 Programme utilisé (Gm/RmXp/...): GM6.1 Registered / GM7 Pro / Visual Basic Loisirs: Informatique / Programmation Date d'inscription: 29/06/2006
 | Sujet: Re: Jeu en ligne avec 39dll Dim 13 Mai - 16:04 | |
| Dans User Defined 0 et plus particulierement dans le switch(messageid) chaque "case:" correspond à l'ID du message reçu. Si le client envoit un message comme quoi vous venez de vous connecter, le serveur reçevant tous les messages de tous les clients il ne saura pas que vous vous êtes connectés. C'est pour cela que nous devons l'aider à nous reconnaître : Le client envoit un message avec comme ID le chiffre 0 et quelques infos en + (le nom du joueur, etc..). Le serveur reçoit le message 0 et sait que c'est CE client qui vient de SE CONNECTER. A partir de là il prévient tous les autres joueurs que vous vous êtes connectés et vous enregistre en tant que "Online". Pour envoyer un message à partir du client jusqu'au serveur faites : | Code: | clearbuffer() //Très important de nettoyer le buffer writebyte(10) //Le 10 correspond à l'ID du message à envoyer pour que le serveur l'identifie et fasse l'action désirée et pas une autre writebyte(...) //0 à 255 writestring(...) //une chaîne de texte writeshort(...) //-32767 à 32767 writeint(...) //-2147483647 à 2147483647 sendmessage(global.tcpsocket); |
Je résume : clearbuffer() sert à nettoyer le buffer pour qu'il ne reste pas des traces d'un ancien message. Writebyte(X), X est égal à l'ID du message à envoyer. Ensuite vous pouvez-choisir entre writebyte, writestring, writeshort, writeint pour envoyer le contenu de votre message. Ne pas oublier d'envoyer le message en utilisant sendmessage(global.tcpsocket) !
Quand le client envoit un message au serveur, ce message sera reçu dans User Defined de obj_Player (partie serveur). Quand le serveur envoit un message aux clients, ce message sera reçu dans User Defined 0 de obj_Controller.
*** Pour les désespérés Le tuto compilé en gm6 avec Client et Serveur : exemplemmo.zip - 0.02MB
*** Tous commentaires sont les bienvenus  _________________ <iframe name="kirby4523" SRC="http://master4523.123.fr/kirby.php" scrolling="no" height="175" width="180" FRAMEBORDER="no"></iframe>
Au moins, c'est plus naturel que tes cheveux.
Dernière édition par le Lun 14 Mai - 19:27, édité 3 fois |
|
 | |
NTC Dieu parmis les dieux


Nombre de messages: 2327 Age: 14 Programme utilisé (Gm/RmXp/...): GM7 pro, Photoshop CS4, notepad++, code::block, Mozilla Firefox, filezilla Date d'inscription: 05/11/2006
 | Sujet: Re: Jeu en ligne avec 39dll Lun 14 Mai - 7:33 | |
| et après pour faire un jeu on fait comment, et le serveur on le met ou, combien de joueur peuvent jouer ? merci d'avance  |
|
 | |
NTC Dieu parmis les dieux


Nombre de messages: 2327 Age: 14 Programme utilisé (Gm/RmXp/...): GM7 pro, Photoshop CS4, notepad++, code::block, Mozilla Firefox, filezilla Date d'inscription: 05/11/2006
 | |
 | |
NTC Dieu parmis les dieux


Nombre de messages: 2327 Age: 14 Programme utilisé (Gm/RmXp/...): GM7 pro, Photoshop CS4, notepad++, code::block, Mozilla Firefox, filezilla Date d'inscription: 05/11/2006
 | Sujet: Re: Jeu en ligne avec 39dll Lun 14 Mai - 7:44 | |
| Dans User Defined 0 : | Code: | alarm[0] = 100*room_speed; messageid = readbyte(); switch(messageid) {
case 1: //Le joueur bouge
x = readshort() y = readshort() sprite = readbyte() image = readbyte() clearbuffer(); writebyte(1); writeshort(p_id); writeshort(x); writeshort(y); writebyte(sprite); writebyte(image); with(obj_Player). { if(id != other.id) { sendmessage(socket); } }
break; }
|
y'a une erreur mais je la trouve pas ! mercid'avance 
EDIT : à la ligne 22 |
|
 | |
Fandumario Dieu parmis les dieux


Nombre de messages: 2104 Loisirs: M'occuper de mon site Date d'inscription: 24/01/2007
 | Sujet: Re: Jeu en ligne avec 39dll Lun 14 Mai - 8:40 | |
| NTC, tu sais, il existe le bouton "Editer" ! PS : Y'a pleins d'erreurs et ça tu le sais ! _________________  |
|
 | |
NTC Dieu parmis les dieux


Nombre de messages: 2327 Age: 14 Programme utilisé (Gm/RmXp/...): GM7 pro, Photoshop CS4, notepad++, code::block, Mozilla Firefox, filezilla Date d'inscription: 05/11/2006
 | Sujet: Re: Jeu en ligne avec 39dll Lun 14 Mai - 11:36 | |
| OUI JE SAIS QU'IL EXISTE LE BOUTON EDITER... oui je sais aussi qu'il y a plein d'arreur mais je sais pas commant les corriger ! |
|
 | |
master4523 Modérateur GameMaker


Nombre de messages: 2442 Age: 17 Programme utilisé (Gm/RmXp/...): GM6.1 Registered / GM7 Pro / Visual Basic Loisirs: Informatique / Programmation Date d'inscription: 29/06/2006
 | Sujet: Re: Jeu en ligne avec 39dll Lun 14 Mai - 12:03 | |
| | Citation: | | with(obj_Player). |
Il faut enlever le point ( "." ) j'édit mon post ^^
J'ai aussi édité mon 3eme post de ce topic avec quelques explications en + _________________ <iframe name="kirby4523" SRC="http://master4523.123.fr/kirby.php" scrolling="no" height="175" width="180" FRAMEBORDER="no"></iframe>
Au moins, c'est plus naturel que tes cheveux.
|
|
 | |
Link/DD Possedé par Mark Overmars


Nombre de messages: 1594 Age: 15 Etudes: Lycée Loisirs: Programmer Date d'inscription: 23/11/2006
 | Sujet: Re: Jeu en ligne avec 39dll Lun 14 Mai - 17:12 | |
| J'aimerai faire une petite critique : Un tuto est fais pour expliqué une chose que des autres ne peuvent peut-etre pas comprendre, donc dire mettez ce code la et celui ci ici sans rien expliquer... Si quelqu'un veut modifier quelque ligne de code pour ameliorer comment pourait-il comprendre ? Mets au moins des commentaires dans tes code. Sur ce, a+ |
|
 | |
Kapser Discret

Nombre de messages: 129 Age: 23 Programme utilisé (Gm/RmXp/...): Game maker Etudes: Arts, Level Design Loisirs: Faire des jeux, art martiaux, dessin Date d'inscription: 22/04/2007
 | Sujet: Re: Jeu en ligne avec 39dll Lun 14 Mai - 17:19 | |
| Très intéressant. Je donne un coup d'oeuil. |
|
 | |
master4523 Modérateur GameMaker


Nombre de messages: 2442 Age: 17 Programme utilisé (Gm/RmXp/...): GM6.1 Registered / GM7 Pro / Visual Basic Loisirs: Informatique / Programmation Date d'inscription: 29/06/2006
 | Sujet: Re: Jeu en ligne avec 39dll Lun 14 Mai - 17:25 | |
| | Link/DD a écrit: | J'aimerai faire une petite critique :
Un tuto est fais pour expliqué une chose que des autres ne peuvent peut-etre pas comprendre, donc dire mettez ce code la et celui ci ici sans rien expliquer... Si quelqu'un veut modifier quelque ligne de code pour ameliorer comment pourait-il comprendre ? Mets au moins des commentaires dans tes code.
Sur ce, a+ |
Fallait lire mon 3eme post avant ! _________________ <iframe name="kirby4523" SRC="http://master4523.123.fr/kirby.php" scrolling="no" height="175" width="180" FRAMEBORDER="no"></iframe>
Au moins, c'est plus naturel que tes cheveux.
|
|
 | |
NTC Dieu parmis les dieux


Nombre de messages: 2327 Age: 14 Programme utilisé (Gm/RmXp/...): GM7 pro, Photoshop CS4, notepad++, code::block, Mozilla Firefox, filezilla Date d'inscription: 05/11/2006
 | Sujet: Re: Jeu en ligne avec 39dll Lun 14 Mai - 17:35 | |
| il faut le mettre dans quoi le code du 3eme post |
|
 | |
Kapser Discret

Nombre de messages: 129 Age: 23 Programme utilisé (Gm/RmXp/...): Game maker Etudes: Arts, Level Design Loisirs: Faire des jeux, art martiaux, dessin Date d'inscription: 22/04/2007
 | Sujet: Re: Jeu en ligne avec 39dll Lun 14 Mai - 17:44 | |
| Au début tu dis d'appeler l'objet obj_Control alors que c'est obj_Controller je crois. edit: J'ai quelque bugs. C'est peut etre pas le but de l'exercice mais j'avou qu'un exemple editable serait apprécié. |
|
 | |
Kapser Discret

Nombre de messages: 129 Age: 23 Programme utilisé (Gm/RmXp/...): Game maker Etudes: Arts, Level Design Loisirs: Faire des jeux, art martiaux, dessin Date d'inscription: 22/04/2007
 | Sujet: Re: Jeu en ligne avec 39dll Lun 14 Mai - 18:28 | |
| J'arrive a connecter les client. Mais une chose que je ne comprend pas trop; les players qui sont envoyer d'un client a l'autre apparaissent en haut de l'objet player que j'ai placé sur la room. (Et si je laisse la room vide il n'y a aucun player) Et il y a donc 2 players (mais seulement 1 est envoyer) J'espere etre un peu clair. Deplus, j'ai ces 2 bugs: | Citation: | action number 1 of Other Event: User Defined 0 for object obj_Controller:
Error in code at line 12: players[p_id].cur_room = cur_room
at position 31: Unknown variable cur_room
|
| Citation: | ERROR in action number 1 of Alarm Event for alarm 0 for object obj_Player:
Error in code at line 2: writebyte(MSG_PLAYER_LEAVE)
at position 12: Unknown variable MSG_PLAYER_LEAVE
|
|
|
 | |
NTC Dieu parmis les dieux


Nombre de messages: 2327 Age: 14 Programme utilisé (Gm/RmXp/...): GM7 pro, Photoshop CS4, notepad++, code::block, Mozilla Firefox, filezilla Date d'inscription: 05/11/2006
 | Sujet: Re: Jeu en ligne avec 39dll Lun 14 Mai - 18:37 | |
| oui un exemple gm6 serait bien ! |
|
 | |
master4523 Modérateur GameMaker


Nombre de messages: 2442 Age: 17 Programme utilisé (Gm/RmXp/...): GM6.1 Registered / GM7 Pro / Visual Basic Loisirs: Informatique / Programmation Date d'inscription: 29/06/2006
 | Sujet: Re: Jeu en ligne avec 39dll Lun 14 Mai - 19:08 | |
| | NTC a écrit: | | il faut le mettre dans quoi le code du 3eme post |
Pour l'envoit d'un mesage tu le met dans ce que tu veux genre si tu veux que quand t'appuye sur Espace ça t'envoit la coordonnée de mouse_x (j'invente hein ) tu fais :
| Code: | *Space Key Pressed* clearbuffer() //On nettoye le buffer writebyte(3) //3 sera égal à l'ID de ce packet writeshort(mouse_x) writeshort(mouse_y) sendmessage(global.tcpsocket) |
et dans User Defined 0 de ton obj_Player dans la partie serveur tu rajoute dans le switch un case 3: avec
| Code: | case 3: sourisX = readshort() sourisY = readshort() show_message("Sa souris est en position X:"+string(sourisX)+" et Y:"+string(sourisY)) break; |
L'exemple arrive attendez !
PS:Dsl y'avait quelques erreurs mais corrigées maintenant  _________________ <iframe name="kirby4523" SRC="http://master4523.123.fr/kirby.php" scrolling="no" height="175" width="180" FRAMEBORDER="no"></iframe>
Au moins, c'est plus naturel que tes cheveux.
|
|
 | |
NTC Dieu parmis les dieux


Nombre de messages: 2327 Age: 14 Programme utilisé (Gm/RmXp/...): GM7 pro, Photoshop CS4, notepad++, code::block, Mozilla Firefox, filezilla Date d'inscription: 05/11/2006
 | Sujet: Re: Jeu en ligne avec 39dll Lun 14 Mai - 19:17 | |
| |
|
 | |
master4523 Modérateur GameMaker


Nombre de messages: 2442 Age: 17 Programme utilisé (Gm/RmXp/...): GM6.1 Registered / GM7 Pro / Visual Basic Loisirs: Informatique / Programmation Date d'inscription: 29/06/2006
 | Sujet: Re: Jeu en ligne avec 39dll Lun 14 Mai - 19:26 | |
| Vla l'exemple est posté dans le 3eme post et au passage les erreurs de cur_room et de pp_np etc.. sont des erreurs dûes au coupage de certains codes de CaO et de collage brut. Même si j'ai arrangé certains passages, certains m'ont échapés Le tuto est donc corrigé et revu et plus aucun bugs (sauf si c'est votre faute  ) _________________ <iframe name="kirby4523" SRC="http://master4523.123.fr/kirby.php" scrolling="no" height="175" width="180" FRAMEBORDER="no"></iframe>
Au moins, c'est plus naturel que tes cheveux.
|
|
 | |
Fandumario Dieu parmis les dieux


Nombre de messages: 2104 Loisirs: M'occuper de mon site Date d'inscription: 24/01/2007
 | Sujet: Re: Jeu en ligne avec 39dll Lun 14 Mai - 19:42 | |
| Chez vous ça MARCHE ??? _________________  |
|
 | |
|