Page 2 sur 2

Re: Aide : deplacement du joueur => client serveur [non réso

Publié : dim. 07/avr./2013 15:18
par G-Rom
autre chose , utilise l'udp pour un jeu en réseau.

Re: Aide : deplacement du joueur => client serveur [non réso

Publié : dim. 07/avr./2013 15:30
par sebastien
@cederavic
Merci beaucoup, cela corrige bien le problème. Merci beaucoup :)

@G-Rom
Non, mini jeu sans prétention, je ne veux pas de paquet perdu. L'UDP est bien pour certains type de jeu, le TCP est mieu pour d'autres.
Je ne cherche pas à faite un super mmo : juste à corriger le bout de code que j'ai posté pour qu'il fonctionne, afin que je puisse l'améliorer par la suite ;)

j'ai nettoyé et corrigé mon script sur mon 1er topic. En l'essayant, vous verrez que je ne suis plus très loin, mais j'ai vraiment toujours besoin d'un petit coup de main :D Un aide sur mon code serait vraiment super sympa, ça fait des jours (et nuits) que je suis la dessus.

Re: Aide : deplacement du joueur => client serveur [non réso

Publié : dim. 07/avr./2013 16:54
par G-Rom
bon... tu as l'air de savoir alors... :|

Re: Aide : deplacement du joueur => client serveur [non réso

Publié : dim. 07/avr./2013 17:08
par sebastien
Oui, je connais la différence entre le TCP et l'UDP et j'ai fait mon choix par rapport au jeu que je souhaite faire ;)
Après, loin de moi la prétention de tout connaitre, sinon je n'aurais pas demandé de l'aide. Mais je demande de l'aide par rapport à mon code, pas par rapport aux autres possibilités qui s'offrent à moi.
Je te remerci néanmoins d'avoir pris le temps de me répondre, et espère que tu pourras m'aider à résoudre mon problème (rendre fonctionnel mon code, il l'est presque en plus. Ou a défaut m'aider à comprendre ce qui ne va pas et à m'aider à le corriger éventuelement) :D

Re: Aide : deplacement du joueur => client serveur [non réso

Publié : dim. 07/avr./2013 17:13
par Backup
cederavic a écrit :Utilise WindowEvent() plutot que WaitWindowEvent() qui est bloquant. Ca resoudra ton probleme de focus sur le serveur pour que celui-ci envois les données.
en fait le mieux c'est d'utiliser

Code : Tout sélectionner

WaitWindowEvent(10)
le fait d'ajouter une attente est preferable
car dans l'etat si tu n'utilises QUE WindowEvent() regarde le gestionnaire des taches ton prg prends du temps machine pour rien ;

lorsqu'on utilise "WindowEvent()" il faut faire suivre d'un Delay(xx)

c'est pourquoi la fonction WaitWindowEvent(xx) a un paramètre de temps ;)
de la sorte ton prg ne prends plus de temps machine pour rien

pour l'envoi de tes messages

Code : Tout sélectionner

Macro SendMove(type) ;Formation des paquet et envoie
	TaillePaquet=8
	*SenderMemory=AllocateMemory(TaillePaquet+5)
	PokeB(*SenderMemory,type)
	PokeL(*SenderMemory+1,TaillePaquet)
	PokeL(*SenderMemory+5,Player(PlayerID)\x)
	PokeL(*SenderMemory+9,Player(PlayerID)\y)
	SendNetworkData(ConnectionID,*SenderMemory,TaillePaquet+5)
EndMacro

Macro SendText(type,message) ;Formation des paquet et envoie
	TailleMessage=Len(message)
	TaillePaquet=TailleMessage
	*SenderMemory=AllocateMemory(TaillePaquet+5)
	PokeB(*SenderMemory,type)
	PokeL(*SenderMemory+1,TaillePaquet)
	PokeS(*SenderMemory+5,message,TailleMessage)

	SendNetworkData(ConnectionID,*SenderMemory,TaillePaquet+5)
	Debug message
EndMacro
j'ai pas regardé danns le detail, mais ton sendmove ( qui fonctionne )
envoie un message avec un format different de SendText .. c'est normal ?

chez moi le SendText plante ..

pourquoi tu ne fais pas qu'une seule (procedure/macro) pour l'envoi ??
une structure pour recuperer toutes les données (x,y,idclient,massage.s ) et tu n'utilise qu'une seule Macro (procedure)
pour envoyer le tout ...

Re: Aide : deplacement du joueur => client serveur [non réso

Publié : dim. 07/avr./2013 17:40
par sebastien
WaitWindowEvent(10)
Et ben bien vu, merci beaucoup :D

Sendmove envoi un message de format différent exprès :
Sendmove envoi la position du joueur, donc j'y met le minimum 1Bool, 3Long
le serveur lit le bool, et grâce à ça, sait quel type de message il va recevoir. On fait transiter ainsi le minimum de donnée
Ca évite de faire un genre de string split par la suite
Sendtext est différent car on ne peu pas le prédéfinir à l'avance, vu que c'est un genre de tchat.

Etonnant que le SendText ne marche pas chez toi, alors qu'il fonctionne correctement chez moi...
Bon si tu veux chercher à m'aider, ça ne sera pas génant, le bug est surtout sur l'arrivée d'un nouveau joueur et son déplacement ;)

Je pense que c'est dans AddNewPlayerToAllClient(ClientID) qu'il faut que je refasse une boucle dans la boucle pour bien prévenir tout le monde, mais j'en suis pas sur car j'y arrive toujours pas ^^

Re: Aide : deplacement du joueur => client serveur [non réso

Publié : dim. 07/avr./2013 18:08
par Backup
heu , tu fais comment pour ajouter un client ?

car si je relance le client ça va pas lfaire ...

(au fait les massages marchent chez moi ;) )

Re: Aide : deplacement du joueur => client serveur [non réso

Publié : dim. 07/avr./2013 18:12
par sebastien
Coté serveur, la fonction AddNewPlayerToAllClient(ClientID) gère ça, mais mal apparement ^^
Il suffit de relancer justement un second client pour le voir. J'ai l'impression que les nouveaux joueurs se superposent (sans certitude)

Re: Aide : deplacement du joueur => client serveur [non réso

Publié : dim. 07/avr./2013 18:14
par Backup
chez moi l'ajout d'un client en relaçant une deuxieme fois le Client ne marche pas car ....
conflit de Directx .. le fait d'ouvrir 2 fois un Screen pose probleme ...
faudrait tester a partir d'un autre ordinateur ...

voici l'erreur obtenu :
Image

Re: Aide : deplacement du joueur => client serveur [non réso

Publié : dim. 07/avr./2013 18:26
par Backup
ok , en fait ça marche tres bien :)

pour coder j'utilise mon EPB (editeur Purebasic Perso )
et celui-ci ne recreer pas un fichier temporaire different a chaque lancement ...
ceux qui empeche tout nouveau lancement ...
d'ou l'erreur POLINK typique d'un prg deja present en RAM

en utilisant JAPBE (un autre Editeur voir Site de Gnozal) ton prg marche parfaitement ...
je supose que l'editeur Officiel doit avoir le meme defaut que mon EPB ( a propos du fichier temporaire )

donc, avec JAPBE ton prg affiche bien l'arrivé de plusieurs Client , et la disparition de ceux ci en cas d'arret ... :)

Re: Aide : deplacement du joueur => client serveur [non réso

Publié : dim. 07/avr./2013 18:30
par sebastien
Etrange car fonctionnel chez moi, mais tu utilise une ancienne version de PB :
peut-être que de passer à la version 5.x resoudrerai ton problème (pas forcément pour m'aider mais pour toi pour la suite également).

Sinon, merci d'avoir essayé de m'aider , c'est sympa ;)

Edito : tu viens de reposter en même temps, je n'avais pas vu : Heureux que ça marche ! :)
Attends quelques minutes, je crois avoir réussi a corrigé une partie du probleme :D

Reédito :
Voila, une petite avancée dans mon probleme, reste le petit bug lié aux déplacements.
J'ai édité le code du 1er poste.
Les nouveaux persos sont désormais créés au bon endroit, je suis bien content :D
Reste plus qu'a corrigé un bug lié aux déplacements, et je comprend pas d'ou ça vient, pourtant je suis pas loin...

Re: Aide : deplacement du joueur => client serveur [non réso

Publié : dim. 07/avr./2013 20:40
par sebastien
Ca y est, j'ai enfin trouvé :
La fonction corrigée (serveur) :

Il fallait rajouter
cl=ClientID X=XX Y=YY
en début de fonction. je comprend néanmoins pas encore bien pourquoi...

Code : Tout sélectionner

Macro MovePlayerToAllClient(ClientID,XX,YY) ;Formation des paquet et envoie
  cl=ClientID
  X=XX
  Y=YY
  For a=0 To ListSize(Player())-1
  SelectElement(Player(),a)
      .....
;)

Re: Aide : deplacement du joueur => client serveur

Publié : dim. 07/avr./2013 21:31
par Backup
oui je confirme ceci marche

Code : Tout sélectionner

Macro MovePlayerToAllClient(ClientID,Xx,Yy) ;Formation des paquet et envoie
cl=ClientID
  X=XX
  Y=YY
  For a=0 To ListSize(Player())-1
  SelectElement(Player(),a)
      TaillePaquet=12
      *SenderMemory=AllocateMemory(TaillePaquet+5)
      PokeB(*SenderMemory,#MovePlayer)
      PokeL(*SenderMemory+1,TaillePaquet)
      PokeL(*SenderMemory+5,Cl)
      PokeL(*SenderMemory+9,X)
      PokeL(*SenderMemory+13,Y)
      SendNetworkData(Player()\id,*SenderMemory,TaillePaquet+5)
      Debug "On envoi a "+Str(Player()\id)+" que "+Str(Cl)+" a bougé en "+Str(X)+"/"+Str(Y)
   Next
EndMacro
c'est peut etre simplement parcequ'une MACRO n'est pas une Procedure !!
les variable ne sont donc pas Locale a la Macro
si tu avait utilisé une Procedure a la place, tu n'aurai peut etre pas eu ce probleme ;)

en tout cas ton histoire m'a aidé a me debugger mon éditeur qui en mode Run+Debugger
ne pouvais pas lancer plusieurs instance d'un meme programme :)