AccueilAccueil  RechercherRechercher  S'enregistrerS'enregistrer  Connexion  

 

 [Tutoriel] 39dll en détails

Aller en bas 
AuteurMessage
Wargamer
*Excellent utilisateur*
Wargamer

Messages : 6938
Projet Actuel : Bataille de cake au fruits

[Tutoriel] 39dll en détails Empty
MessageSujet: [Tutoriel] 39dll en détails   [Tutoriel] 39dll en détails EmptySam 12 Juin 2010 - 16:57

Hello world, je vias pas faire 50 exemples sur ce qui n'est pas utile vu que on s'en servira pas. Si vous voulez les détails des détails sur tout, aller voir lui de Levan il est très complet.

donc on commence:

1.L'interface
Si jamais vous voulez faire un interface pour se connecter lisez ce qui suit sinon passez au point 2.
Pour se connecter il faut un hote donc on va en faire un.
Créé un objet, pour l'exemple c'est ObjWaitOnline (mais osef on l'utilisera pas) puis un pour les joueur connecté ObjWaiter
-Donc on dit que on est l'hôte en partant comme on sait pas ses intentions
-on dit que il est le premier joeur connecté
-On créé une liste potentiel de joueur(tableau ou liste à vous de voir selon vos besoins) ainsi que une liste de "In Game" pour savoir si on est en trian dejoueur ou en attante(histoire de savoir quand afficher le joueur)
-On initilialise la 3dll

Code:
global.Host=1
global.MyPos=0
for(i=0;i<4;i+=1)
{global.JO[i]=-1
global.IG[i]=0}
dllinit(0,1,0)
listen = tcplisten(14804, 2, true)
if(listen <= 0)
show_message("Connexion impossible, passez go et réclamez 200$.")

Connexion à l'hote
Ensuite on est l'hôte donc on veux voir qui est se connecte:
Code:
if global.Host
{global.Client=tcpaccept(listen, true)

et on veux pas continuer si on recois rien:
Code:
if global.Client<=0 exit

ensuite on syncronise les 2 joueurs pour pas qu'ils fassent d'autres choses en même temps(le 0 c'est pour activer la syncronisation)
Code:
setsync(global.Client,0)

Puis on recoit ce qu'il a envoyé (on verra ca dans la fonction rejoindre)
Code:
receivemessage(global.Client)
Nom=readstring()

Puis on regarde la liste qu'on c'est fait plus haut pour trouver une place vide (on commence à 1 vu que 0 c'est nous) puis on continu
Code:
for(i=1;i<4;i+=1)
if global.JO[i]=-1
break

Ensuite on va se créé un objet pour lui et lui assigné sa position et son adresse de connection (Id) et son Nom
Code:
global.NewP=instance_create(0,0,ObjWaiter)
global.NewP.Id=global.Client
global.NewP.Joueur=i
global.NewP.Nom=Nom

Puis on ajoute l'objet à la liste de joueurs
Code:
global.JO[i]=global.NewP

Ensuite, si ya d'Autres joueur de connecté (donc des ObjWaiter) on leurs envoient tout(on vide toujours le buffer avant et on écrit le type de message, ici c'est 1) et on s'assure que l'id du ObjWaiter est pas le même que celui qu'on vient de connecter (oubliez pas, Id c'est l'Adresse online lié à chaque joueur)
Code:
clearbuffer()
writebyte(1)
writebyte(i)
writestring(Nom)
with ObjWaiter
if id!=global.NewP
sendmessage(Id)

Ensuite ba faut que le nouveau sache qui est connecté. toujours on vérifie que c'est pas le nouveau joueur(global.Client est notre nouveau)
Code:
with ObjWaiter
if id!=global.NewP
{clearbuffer()
writebyte(1)
writebyte(Joueur)
writestring(Nom)
sendmessage(global.Client)}

Ensuite l'hôte envoi des info sur la partie au joueur, sa position dans la liste de joueur, et on enlève la syncro vu que... c'est fini! (à l'adresse 0 et non 1 comme les jouerus normaux)
Code:
clearbuffer()
writebyte(0)
writebyte(i)
writestring(global.MonNom)
writebyte(global.Niveau)
sendmessage(global.Client)
setsync(global.Client,1)}

Connexion à l'hôte
Comme promis c'est la connexion à l'hote et l'illumination de quelques problèmes.

donc vous faites un bouton de connexion puis comme il rejoint il sera pas hote(global.Host=0) puis on se connecte(127.0.0.1 = IP local, donc de votre réseau):
Code:
global.Host=0
ip = get_string("Entrez l'IP auquel se connecter", "127.0.0.1")
global.Server = tcpconnect(ip, 14804, true)

On s'assure que ya quelqu'un de l'autre coté:
Code:
if(global.Server <= 0)
{show_message("Impossible de se connecter à l'hôte, routeur en carton spoted.")
exit}

Donc si vous suivez, on est connecté à l'hote, qui a activer la syncro, qui veux recevoir un message(son nom en l'occurance):
Code:
clearbuffer()
writestring(global.MonNom)
sendmessage(global.Server)

Réception des message(coté joueur)
Simple comme bonjour vu que tout est fait, on recoit les messages sur les nouveaux joueurs
Pour l'exemple j'ai mis un else direct après le code de connexion à l'hote (if global.Host)

donc on recoit les messages du server(global.Server récupéré plus haut)
Code:
else
{while 1
{Mess=receivemessage(global.Server)
if Mess<=0 break

Pourquoi un while? pour s'assurer de faire tout les messages recu et non 1 par step, quand ya plus rien il quitte le while et continue

Bon ensuite comme j'ai dit on met toujours un chiffre d'adresse(0 ou 1 pour l'exemple) c'est la qu'on voit son utilité

On fait un switch sur le premier byte lu (car ils sont lu dans l'ordre de réception) pour voir si c'est un 1 ou un 0

Code:
switch readbyte()
{case 0:

Pour le 0, c'est l'hote qui envoi des info sur la partie donc on les lit et les assigne puis on se créé un ObjWaiter pour lui (et oui c'est aussi un joueur)
Code:
global.MyPos=readbyte()
NewP=instance_create(0,0,ObjWaiter)
NewP.Joueur=0
NewP.Nom=readstring()
global.JO[0]=NewP
global.Niveau=readbyte()
break

Puis le case 1; Nouveua joueur détecté(pareil que case 0 sans la réception de donnée sur la partie)
Code:
case 1:
NewP=instance_create(0,0,ObjWaiter)
NewP.Joueur=readbyte()
NewP.Nom=readstring()
global.JO[NewP.Joueur]=NewP
break}

Voila, tout marche il reste qu'à ajouter quelques truc de base comme un chat, des message pour quand un joueur quitte

Pour la prochaine partie ca sera la un vrai jeu Very Happy

_________________
[Tutoriel] 39dll en détails Wargamer3
Règle #1 du CBNA, ne pas chercher à faire dans la subtilité; personne comprend


Dernière édition par Wargamer le Mer 16 Juin 2010 - 3:09, édité 3 fois
Revenir en haut Aller en bas
Wargamer
*Excellent utilisateur*
Wargamer

Messages : 6938
Projet Actuel : Bataille de cake au fruits

[Tutoriel] 39dll en détails Empty
MessageSujet: Re: [Tutoriel] 39dll en détails   [Tutoriel] 39dll en détails EmptySam 12 Juin 2010 - 16:57

2. Le jeu
bon, on retrousse nos manche c,est là que ca devien plaisant
Vous vous souvenez des ObjWaiter? cochez les persistant, on va les utiliser comme joueurs

Bon ensuite déclarer toute les variable relativement à un joueur normal dans le create comme vous le faite normalement(on le mettera pas à jour dans le step mais par les message recu online)
Comme je suis gentil, je vais montrer comment créé des objet online aussi, ajouter ce code aussi, ca permettera de garder la position de nos balle pour mieux les envoyer: (toujours dans le create)
Code:
BallList=ds_list_create()
Ensuite, admettant que vous avez déja un ObjJoueur (sinon faites en un)
ajouter la même ligne pour créé une liste de VOS balles.

Bien maintenant que c'est fait, faut lancer la partie, rajouter un case de valeur que vous voulez qui lancera la partie(dans ObjWaitOnline) puis un bouton Lancer partie qui enverra le message avant de lancer la partie pour lui même

Donc vous voila seul dnas votre niveau, avec des ObjWaiter invisible
Donc dans votre ObjJoueur, hote ou non, va faloir envoyer aux autre ObjJoueur un message pour leurs dire que vous êtes la (ObjWaitOnline n'est plus en changeant de room)
Comme on a plus de référence de case pour savoir quel message est quel, on recommence à 0 (le dernier recu étant celui pour changer de niveau, il n'y a rien après pour interferrer)

Pour s'assurer que tout le monde recoit les info de tout le monde je fait que seul les joueur non hote envoi leurs position à l'hote

Code:
if !global.Host
{clearbuffer()
writebyte(1)
writebyte(CeQueVousVoulezEnvoyerDeBase)
sendmessage(global.Server)}

Voila, les joueur ont envoyer leurs truc à l'hote, faut qu'il les recoivent et les renvoie aux autres, dnas le step de votre ObjJoueur on fait la base de ce qu'on a vu(en vérfiant tout les joueurs):
Code:
if global.Host
        {
        for(global.i=1;global.i<4;global.i+=1)
            if global.JO[global.i]!=-1
                while 1
                    {   
                    Mess=receivemessage(global.JO[global.i].Id)
                    if Mess<=0
                        break
                    switch readbyte()
                        {
                        case 1:
                        global.JO[global.i].ValeurAAassigner=readbyte()

on envoi en retour 2 choses: nos variables au joueur qui nous les envoi;
Code:
clearbuffer()
writebyte(1)
writebyte(0)
writebyte(ValeurAAassigner)
with global.JO[global.i]
sendmessage(Id)

ensuite on renvoi tout aux autres avec le même message(avec 0 comme position, l'hote en a pas de besoin car il sait qui lui envoi le message)
Code:
clearbuffer()
writebyte(1)
writebyte(global.i)
writebyte(global.JO[global.i].ValeurAAassigner)
with ObjWaiter
if id!=global.JO[global.i]
sendmessage(Id)

Ensuite le code du non hote pour recevoir les valeurs des autres(IG à 1 car là on sait qu'il a rejoins la partie)
Code:
else//Joueur normal
        {
        while 1
            {
            Mess=receivemessage(global.Server)
            if Mess<=0
                break
            switch readbyte()
                {//Initialisation
                case 1:
                    i=readbyte()
                    global.JO[i].ValeurAAssigner=readbyte()
                    global.IG[i]=1
                    break

l'initilisation faite reste à mettre à jour les coordoonées, donc dans step on envoi nos message x et y à une adresse différente de celles utilisé.(rappel que ya pas de besoin dedire à qui envoyé le message quand c'.est pas l'hote)
Code:
clearbuffer()
writebyte(5)
if global.Host
{writebyte(0)
writeshort(x)
writeshort(y)
with ObjWaiter
sendmessage(Id)}
else
{writeshort(x)
writeshort(y)
sendmessage(global.Server)}

de retour dnas la reception du message de l'hote on lis et renvoi les messages aux autres
Code:
case 5:
                            global.JO[global.i].x=readshort()
                            global.JO[global.i].y=readshort()
                            clearbuffer()
                            writebyte(5)
                            writebyte(global.i)
                            writeshort(global.JO[global.i].x)
                            writeshort(global.JO[global.i].y)
                            with ObjWaiter
                                if id!=global.JO[global.i]
                                    sendmessage(Id)
                            break

pour le joueur on fait pareil(sans renvoiyé les valeurs après ca va de soit Razz)
Code:
case 5:
                    i=readbyte()
                    global.JO[i].x=readshort()
                    global.JO[i].y=readshort()
break

et voila vous avez tout réussi, pour le reste c'est simple à mettre en place.
gm6 résumant tout: mediafire.com ?tfvyyyrqu5z

_________________
[Tutoriel] 39dll en détails Wargamer3
Règle #1 du CBNA, ne pas chercher à faire dans la subtilité; personne comprend


Dernière édition par Wargamer le Mar 15 Juin 2010 - 21:42, édité 2 fois
Revenir en haut Aller en bas
Oculus
Utilisateur confirmé: Rang *****


Messages : 1688

[Tutoriel] 39dll en détails Empty
MessageSujet: Re: [Tutoriel] 39dll en détails   [Tutoriel] 39dll en détails EmptyDim 13 Juin 2010 - 15:59

Tu me passer le gmk résumant tout? gnii
Revenir en haut Aller en bas
marty
Utilisateur confirmé: Rang ***
marty

Messages : 697
Projet Actuel : laby-ereinte !

[Tutoriel] 39dll en détails Empty
MessageSujet: Re: [Tutoriel] 39dll en détails   [Tutoriel] 39dll en détails EmptyDim 13 Juin 2010 - 17:43

merci pour ce tuto !
Revenir en haut Aller en bas
Wargamer
*Excellent utilisateur*
Wargamer

Messages : 6938
Projet Actuel : Bataille de cake au fruits

[Tutoriel] 39dll en détails Empty
MessageSujet: Re: [Tutoriel] 39dll en détails   [Tutoriel] 39dll en détails EmptyDim 13 Juin 2010 - 17:54

c'est bon l'exemple que j'avais fait étais basé sur le mode online de mon jeu, quand je l'ai mis seul ba il a planter alors j'en refait 1 à partir du tuto
j'editerai quand il sera pret

_________________
[Tutoriel] 39dll en détails Wargamer3
Règle #1 du CBNA, ne pas chercher à faire dans la subtilité; personne comprend
Revenir en haut Aller en bas
Wargamer
*Excellent utilisateur*
Wargamer

Messages : 6938
Projet Actuel : Bataille de cake au fruits

[Tutoriel] 39dll en détails Empty
MessageSujet: Re: [Tutoriel] 39dll en détails   [Tutoriel] 39dll en détails EmptyDim 13 Juin 2010 - 19:23

vala, le gm6 est fait, ya même plus que dnas le tuto vu que ca reprend mon script online de salle d'attante happy1

_________________
[Tutoriel] 39dll en détails Wargamer3
Règle #1 du CBNA, ne pas chercher à faire dans la subtilité; personne comprend
Revenir en haut Aller en bas
Oculus
Utilisateur confirmé: Rang *****


Messages : 1688

[Tutoriel] 39dll en détails Empty
MessageSujet: Re: [Tutoriel] 39dll en détails   [Tutoriel] 39dll en détails EmptyLun 14 Juin 2010 - 20:24

Est-ce que c'est normal que l'on ne puisse pas lancé 2 fois le gm6 pour pouvoir tester?
Revenir en haut Aller en bas
Wargamer
*Excellent utilisateur*
Wargamer

Messages : 6938
Projet Actuel : Bataille de cake au fruits

[Tutoriel] 39dll en détails Empty
MessageSujet: Re: [Tutoriel] 39dll en détails   [Tutoriel] 39dll en détails EmptyLun 14 Juin 2010 - 21:20

rien t'empèche de rejoindre le premier .exe avec un 2ième, le message étant surtout pour dire que tu peux héberger, mais rien t'empèche de rejoindre après
habituellement ya pas 2 .exe de lancer en même temps alors j'ai mis un message

_________________
[Tutoriel] 39dll en détails Wargamer3
Règle #1 du CBNA, ne pas chercher à faire dans la subtilité; personne comprend
Revenir en haut Aller en bas
Oculus
Utilisateur confirmé: Rang *****


Messages : 1688

[Tutoriel] 39dll en détails Empty
MessageSujet: Re: [Tutoriel] 39dll en détails   [Tutoriel] 39dll en détails EmptyLun 14 Juin 2010 - 21:30

Ok merci

Edit j'arrive pas a me connecter
Revenir en haut Aller en bas
Oculus
Utilisateur confirmé: Rang *****


Messages : 1688

[Tutoriel] 39dll en détails Empty
MessageSujet: Re: [Tutoriel] 39dll en détails   [Tutoriel] 39dll en détails EmptyMar 15 Juin 2010 - 20:50

J'arrive toujours pas à me connecter j'ai essayé plusieurs port
Revenir en haut Aller en bas
Bast
Administrateur
Bast

Messages : 20010
Localisation : Alsace

[Tutoriel] 39dll en détails Empty
MessageSujet: Re: [Tutoriel] 39dll en détails   [Tutoriel] 39dll en détails EmptyMar 15 Juin 2010 - 20:56

Beau travail Wargamer. :)

_________________
[Tutoriel] 39dll en détails Sl_sign_icon
Revenir en haut Aller en bas
http://www.lecbna.org/
Wargamer
*Excellent utilisateur*
Wargamer

Messages : 6938
Projet Actuel : Bataille de cake au fruits

[Tutoriel] 39dll en détails Empty
MessageSujet: Re: [Tutoriel] 39dll en détails   [Tutoriel] 39dll en détails EmptyMar 15 Juin 2010 - 21:41

Merci Bast Smile
Bon dans l'ordre si tu veux lancer 2 fois le même exe pour testé:
1.Lance le premier attand d'être dnas la salle
2.Lance le 2ième, fait ok au message d'erreur puis fiat rejoindre
3.Enjoy!

MAJ: j'ai mis à jour le gm6 vu que j'avias oublier d'effacer une variable qui fesait une vérification quand on appuyait sur Enter

_________________
[Tutoriel] 39dll en détails Wargamer3
Règle #1 du CBNA, ne pas chercher à faire dans la subtilité; personne comprend
Revenir en haut Aller en bas
Oculus
Utilisateur confirmé: Rang *****


Messages : 1688

[Tutoriel] 39dll en détails Empty
MessageSujet: Re: [Tutoriel] 39dll en détails   [Tutoriel] 39dll en détails EmptyMar 15 Juin 2010 - 21:53

C'est ce que je fais mais j'ai un message d'erreur comme quoi je ne peux pas me connecter

Sinon quand je regarde dans windows mon adresse ip n'est pas la même que celle quand je regarde sur un site comme celui ci
http://www.adresseip.com/
donc la quel faut il mètre ?

Pour l'instant je test avec les 2 à chaque fois

Et sinon je ne compile pas les gmk donc je l'ai lance depuis gm8 donc est-ce pour ça que sa ne marche pas?
Est-ce la faute à windows 7?
Mauvais port?Pour l'instant j'ai test avec plusieurs port.
Revenir en haut Aller en bas
Wargamer
*Excellent utilisateur*
Wargamer

Messages : 6938
Projet Actuel : Bataille de cake au fruits

[Tutoriel] 39dll en détails Empty
MessageSujet: Re: [Tutoriel] 39dll en détails   [Tutoriel] 39dll en détails EmptyMer 16 Juin 2010 - 3:12

Je vois... Je pensait que le Tuto à Levan expliquais ce qu'était 127.0.0.1
mais non
Bref
127.0.0.1 c'est l'IP de ton réseau local, c'est elle que j'ai mis par défaut et c'est la seule qui peut te permettre d'être co sur ton propre PC (sur le même réseau donc)

Sinon l'adresse windows est soi la mac(adresse du PC) ou IP TCP6 (un truc du genre) alors que on tourne encore sous TCP4 donc ca risque de pas marcher, prend elle du site internet sit uveux faire des test entre 2 pc

_________________
[Tutoriel] 39dll en détails Wargamer3
Règle #1 du CBNA, ne pas chercher à faire dans la subtilité; personne comprend
Revenir en haut Aller en bas
Oculus
Utilisateur confirmé: Rang *****


Messages : 1688

[Tutoriel] 39dll en détails Empty
MessageSujet: Re: [Tutoriel] 39dll en détails   [Tutoriel] 39dll en détails EmptyMer 16 Juin 2010 - 8:25

Ok merci je pensais que c'était une adresse ip bidon car avec l'autre tuto je m'étais une autre adresse ip et je voyais que j'étais connecté
Revenir en haut Aller en bas
Contenu sponsorisé




[Tutoriel] 39dll en détails Empty
MessageSujet: Re: [Tutoriel] 39dll en détails   [Tutoriel] 39dll en détails Empty

Revenir en haut Aller en bas
 
[Tutoriel] 39dll en détails
Revenir en haut 
Page 1 sur 1

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