Aide : deplacement du joueur => client serveur

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
sebastien
Messages : 13
Inscription : sam. 06/avr./2013 15:30

Aide : deplacement du joueur => client serveur

Message par sebastien »

Bonjour a tous :)
Je suis nouvellement inscrit sur ce forum, mais utilise Purebasic depuis quelques semaines, sans difficultés... jusqu'a ce que j'essai les fonctions pour essayer le mode multijoueur, et là j'ai un peu de mal ^^ (ancien utilisateur de game maker).

Dans le principe : j'ai un serveur. Des qu'il reçoit une nouvelle connection, il ajoute le nouveau joueur dans un tableau. On peu expulser ce joueur avec le clic droit dans un gadget. Si on appui sur la touche espace, ça envoi un message (futur tchat du coup)

Là ou j'ai plus de mal : le mouvement des personnages. Je pensai avoir géré ceux ci, mais non, ça bug bizare
Lorsqu'un nouveau joueur arrive, on envoi ça au serveur, qui previent tout le monde, et ça affiche un personnage.
Et quand le client se déplace, il envoi sa nouvelle position(x,y, basic, pas optimisé je sais, c'est un début)
Tout ça ne s'affiche pas correctement si je lance 2 clients.

De plus, je dois redonner le focus au serveur si je veu qu'l prenne en compte les changements et les renvoient aux clients : pourquoi ? Et comment palier à cela ?

Je sais que c'est pas facile. Je pense néanmoins que ça pourrait servir de base à d'autres débutants ;)
Si quelqu'un peu m'aider pour mon code, ça serait super sympa :

Code : Tout sélectionner

Resolu : Cf fin du topic
Dernière modification par sebastien le dim. 07/avr./2013 20:51, modifié 14 fois.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: Aide : deplacement du joueur => client serveur

Message par comtois »

Je n'ai pas encore tout lu, ni tout digéré, mais voici une bonne source d'inspiration (en anglais)
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

Re: Aide : deplacement du joueur => client serveur

Message par Golfy »

Pour ma part, j'ai 2 procédures : une de lecture réseau et celle d'écriture, ci-après :)

Code : Tout sélectionner

Procedure EcritureNetwork()
  ; write messages from Velbus or other IP senders to network
  If ListSize(msg2network())
  	ForEach msg2network()
  		ForEach Client()
  			If Client()\EDate=0
  				If msg2network()\Src <> Str(Client()\portID)			; do not send message to original sender
  					Err = SendNetworkData(Client()\portID, msg2network()\cmd, msg2network()\Len)
  				EndIf
  			EndIf
  		Next
  		err = FreeMemory(msg2network()\cmd)
  		Delay(2)
  	Next
  	
  	; then clean list
  	ClearList(msg2network())
	EndIf
EndProcedure
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
sebastien
Messages : 13
Inscription : sam. 06/avr./2013 15:30

Re: Aide : deplacement du joueur => client serveur

Message par sebastien »

@Comtois :
Je connais déja ce lien, mais merci tout de même. Dommage, ayant parcouru déja beaucoup de topic de ce forum, je pensais et aurai misé beaucoup que ce serais toi qui m'apporterais la plus grande aide. Peut-être que si je continu a poster tu m'aidera un peu plus dans mes scripts comme je t'ai déja vu le faire ;)

@Golfy :
je vais tacher de m'inspirer de ForEach Client() et de ce qui s'en suit : merci pour ce petit brin de code.


Autres utilisateurs, je suis à l'écoute pour toute aide ou bout de script apporté à ma source de base :)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Aide : deplacement du joueur => client serveur

Message par Backup »

deja c'est pas des Script !

Purebasic est un compilateur , pas un interpreteur :wink:

on parle de "code" de "listing"
sebastien
Messages : 13
Inscription : sam. 06/avr./2013 15:30

Re: Aide : deplacement du joueur => client serveur

Message par sebastien »

Merci pour cette correction qui me permettra de ne plus faire ce lapsus...
(trop habitué a Java, GM, flash et javascript.... mes principaux langages jusqu'alors )

ça fait 3 jours que je suis la dessus non stop, j'explose XD J'ai corrigé mon code ci dessus : il détecte un nouveau joueur, l'affiche.
Mais dès que je bouge, j'ai un bug d'affichage : avec plusieurs clients connectés

(Je viens d'éditer mon code du 1er topic)

J'ai l'impression de ne pas avoir d'aide super utile à mon problème par rapport à la majorité des topics que j'ai lu. Me suis-je trompé de rubrique ? Mon problème n'est pas assez bien expliqué ? Mon script :twisted: heu... code trop long ?
Hésitez pas à me dire car je patauge vraiment depuis plusieurs nuits et une aide plus approfondie (par rapport à mon code) serait super sympa :)
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Aide : deplacement du joueur => client serveur

Message par G-Rom »

Bonjour et bienvenu a toi.
je vais pas te donner de code , mais le principe du multijoueur qui est plus simple qu'il n'y parait.
je vais commencer par parler du serveur , le serveur c'est la partie centrale de ton jeu , c'est lui et lui seul qui décide de la position des joueurs , du score , du gameplay , etc... , c'est lui qui prend toutes les décisions, si tu ne respecte pas cela , des petits malin comme Dobro coderons des cheats coté clients ;)
le client quand à lui , ne fait qu'afficher les informations en provenance du serveur.
quand le client veut bouger sont joueur , il ne fait que le dire au serveur , le client envois donc un "drapeau", le serveur bouge le joueur et le renvois à tout les clients.

ensuite , viens le problème technique , on sature vite la bande passante du réseau. pour cela , pas la peine d'envoyer les coordonnées en temps réel des joueurs.
une coordonnée généralement est un float , en 2D , tu as donc 2 coordonnées , x & y , ce qui représente 8 bytes pour une position. alors qu'un drapeau ne prend qu'un byte.

- le client envois l'état des ces drapeaux en temps réel ( avance , recul , tir , etc... )
- le serveur traite en temps réel les informations reçue
- le serveur renvois tout les 50/70ms les états de tout les clients à tout les clients.
- le serveur renvois tout les 200ms une correction de coordonnées à tout les clients pour palier à d’éventuels décalage.

le point clé , le serveur décide , le client ne fait qu'affiché.


edit: tes applications doivent être cadencé à la même vitesse.
sebastien
Messages : 13
Inscription : sam. 06/avr./2013 15:30

Re: Aide : deplacement du joueur => client serveur

Message par sebastien »

Coucou G-Rom :)

Oui, merci pour ces précisions. J'ai déja lu plusieurs topics qui parlent d'optimisation, mais avant d'optimiser, j'aimera juste avoir un code de base qui marche :
Le serveur accepte les nouveaux clients, renvoi a tout le monde qu'on arrive. Et on peu se déplacer (tres simplement de maniere non optimisée, c'est juste pour commencer).

Vu que je suis bloqué ici, je ne peux donc pas me servir de tes conseils, qui me seront néanmoins surement utiles pour la suite ;)
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

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

Message par G-Rom »

je ne parle pas d'optimisation , je te parle de bases ;)
sebastien
Messages : 13
Inscription : sam. 06/avr./2013 15:30

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

Message par sebastien »

La base serai de pouvoir afficher un personnage aux coordonnées x et y que je désire :)
Après envoyer des bool, float, pour une position ou un changement de direction... je verais :D
Envoyer les positions x et y pourra servir pour la suite pour corriger la position, une téléportation... Mais si j'y arrive déja pas avec ça, je n'y arriverai pas pour la suite. Merci tout de même, ça me servira surement pour la suite ;)

Si tu compile et lance mon code, tu verras que je ne dois pas en être bien loin, mais que c'est pas encore ça :? (4ème nuit blanche que je passe la dessus :twisted: )

De plus, pourquoi dois-je redonner le focus à mon serveur pour qu'il se mette à bosser ? Comment palier ce probleme svp ?
Dernière modification par sebastien le dim. 07/avr./2013 13:17, modifié 1 fois.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

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

Message par Backup »

tu utilises quel Version de Purebasic ?

#PB_NetworkEvent_File = Constante introuvable en Version 5.11
sebastien
Messages : 13
Inscription : sam. 06/avr./2013 15:30

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

Message par sebastien »

Purebasic 5.0 (x64)
Nénamoins je ne me sert pas de #PB_NetworkEvent_File donc tu peux la commenter/supprimer
Cette constante a été supprimée lors de la 5.10:
Removed: SendNetworkFile(), ReceiveNetworkFile(), #PB_NetworkEvent_File to avoid possible security hole
Je te remerci beaucoup de jeter un oeil sur mon code :D
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

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

Message par Backup »

bon deja comment ce fait t'il que dans ton client
il y a une différence de traitement a l’appui des touches Fleches verticale et horizontale ??

Code : Tout sélectionner

If KeyboardPushed(#PB_Key_Left)
      Player(Str(ConnectionID))\direction-5
    ElseIf KeyboardPushed(#PB_Key_Right)
      Player(Str(ConnectionID))\direction+5
    EndIf
   
    If KeyboardPushed(#PB_Key_Up)
      Player(PlayerID)\y=Player(PlayerID)\y-10
      SendMove(#sendmovement)
    ElseIf KeyboardPushed(#PB_Key_Down)
      Player(PlayerID)\y=Player(PlayerID)\y+10
      SendMove(#sendmovement)
    EndIf
pourquoi

Code : Tout sélectionner

 Player(Str(ConnectionID))\direction-5
et pas

Code : Tout sélectionner

Player(PlayerID)\X=Player(PlayerID)\X-10 
?

c'est quoi le parametre Direction ?
sebastien
Messages : 13
Inscription : sam. 06/avr./2013 15:30

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

Message par sebastien »

C'etait pour anticiper pour la suite, mais je ne me sert que des touches haut et bas pour mes tests (je pensais pas etre bloqué ici)

C'est vrai que cela rend le code moins lisible, mais ne fait pas attention à tout ce qui concerne direction et speed, il ne sont jamais pris en compte : j'essai juste de bouger les x et y pour l'instant : dès que ça marchera, je m'attaquerai au reste.
Je vais nettoyer tout ça et rééditer mon code du 1er topic d'ici quelques instant pour pas induire en erreur les gens qui pourront m'aider :)
Merci :wink:

Mais ta correction est bonne :

Code : Tout sélectionner

If KeyboardPushed(#PB_Key_Left)
      Player(PlayerID)\x=Player(PlayerID)\x-10
      SendMove(#sendmovement)
    ElseIf KeyboardPushed(#PB_Key_Right)
      Player(PlayerID)\x=Player(PlayerID)\x+10
      SendMove(#sendmovement)
    EndIf

Edito : Code en début de topic édité ;)
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

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

Message par cederavic »

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.
Répondre