JeuWeb - Crée ton jeu par navigateur
[resolu] Temps réél et mise à jours - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [resolu] Temps réél et mise à jours (/showthread.php?tid=1482)

Pages : 1 2


[resolu] Temps réél et mise à jours - wIX - 18-07-2007

bonjour à tous,

J'ai un problème :

Comment faire du temps réel et comment le mettre à jour ?


J'ai des notions sur la question, explications :

Pour les ressources, pas de prob, je connais. Le timestamp de la dernière connexion est enregistré et avec ça on fait les calculs.

Maintenant, je désire faire des combats. L'idée est de faire le combat quand 2 joueurs sont sur la même case.

J'ai la franche impression (certitude ?) qu'il n'est pas possible de mettre à jour la BDD de la même façon, explication :

situation :
un joueur "vacance" se déplace pendant 3 jours et ne se connecte plus avant l'arrivée dans la case; Pendant ces 3 jours un autre joueur "Pad'bol" à la bonne idée de tomber pile sur son chemin (au mauavis endroit au mauvais moment Wink ).

là où ça coince :
"Padbol" se connecte, met à jour la BDD, et arrive sur la case. Il interroge la BDD pour savoir qui est dans la case, et forcément il y a personne puisque "vacances" n'est pas connecté...

la solution qui coince
Il faudrait que chaque joueur puisse mettre à jour ou demander à un script serveur de mettre à jour la BDD. M'enfin j'imagine la tête de mon pauvre sql lorsqu'il aura à gérer pleins de joueurs toutes les secondes...


quelqu'un peut-il m'aider ? :toilette:

P.S: j'ai parcouru les tuto et une dizaine de pages de forums pour trouver la réponse, si elel m'avait échappée veuillez être indulgent et ne pas frapper tout de suite Wink

P.S: Je ne poste pas beaucoup, ais j'ai toujours trouvé mes réponses sur ce super forum qui aide beaucoup


RE: Temps réél et mise à jours - Maegia - 18-07-2007

Bonjour !

Je ne tournerai pas autour du pot : Je n'ai aucune idée du "comment faire" de la chose... Il est vrai que tu ne peux pas updater ta table pour tous tes joueurs à toutes les secondes, et si tu le fais à toutes les heures, tu perds ta notion de "temps réel"... Voici donc néanmoins comment j'aborderais le problème... (À noter qu'il est 9h00 du matin ici, que je n'ai toujours pas pris mon premier café et que, comme je le disais, je n'ai aucune idée de la manière de résoudre ce problème... En bref, ce que j'écris ici est peut-être complètement n'importe quoi ! Wink)

À supposé qu'on ne peut se déplacer que d'un nombre limité de cases sans se reconnecté. Bref, je suis sur X-65 et Y-35, je peux demander de me déplacer dans un rayon de 25 cases, pour un total de 25 heures, après quoi je dois me reconnecté pour redemander de me déplacer. Bref, c'est déjà ça, on n'a plus qu'à demander l'actualisation des données des joueurs se trouvant dans un rayon de 50 cases (25 * 2, car si je suis à l'extrême gauche et qu'un joueur, à l'extrême droite, demande aussi, comme moi, un déplacement de 25 cases, on se retrouvera au centre au même moment...) pour chaque déplacement. Je dis l'actualisation, mais en fait, ce n'est pas obliger. On va simplement chercher leurs données, point.

Lorsque le joueur live demande son déplacement, on vérifie dans la base de données tous les joueurs étant dans ledit rayon de 50 cases, on prend leurs coordonnées de base, leur coordonnées d'arrivées, l'heure de lancement du déplacement et le temps actuel. On calcul leur vecteur de déplacement (À supposé qu'ils se déplacent toujours en ligne droite...), et en fonction de l'heure actuelle, on peut déterminer à quelle position chacun des joueurs se trouve en ce moment précis. Ça revient en fait à une simple requête avec un mysql_fetch_row pour chacun des joueurs dans ledit rayon, simplement, en plus, bien sûr, du calcul des différents vecteurs.

Ça a du sens ?

Je vais prendre mon café et je me relis ensuite ! Tongue


RE: Temps réél et mise à jours - Mysterarts - 18-07-2007

EDIT : réponse un peu rapide, comme je l'explique plus bas ^^

Bonjour !
D'abord bravo pour la présentation du problème : C appréciable ^^
C'est vrai que ton problème, finalement, et assez courant... On peut imaginé le même problème dans un ogame-like, lors de l'espionnage d'une planète (du moins si j'ai bien tout compris ^^).
Dans ton cas, comment se matérialise le déplacement dans le BDD ?
Imaginons que tu est un table pour les déplacements (si ce n'est pas le cas, la solution est peut être la...) :
id | joueur | case_arrivé | date
Dans ce cas là, à l'arrivé d'un joueur sur une case, on va aller chercher dans cette table toutes les entrées avec comme case d'arrivé celle du joueur, puis faire une condition/calcul pour savoir si ce déplacement à abouti ! Si c'est le cas, on UPDATE la table "joueur" qui contient la position du joueur "vacance"...
Il ne reste plus qu'a faire un select de tout les joueurs se trouvant à cette case, ds la table "joueur" !
Y'a surement d'autre solution, c'est la première qui me passe par la tête, et elle permet de ne traiter que les cas utiles...
Je peux expliquer mieux si qqu le demande, hein ^^

Mysterarts


RE: Temps réél et mise à jours - Plume - 18-07-2007

Ou tout simplement mettre à jour la table des cases occupées. Pour savoir où en est un joueur qui n'est pas connecté, il faut voir combien de temps il faut pour traverser une case, et combien de case le joueur qui se déplace doit traverser. Et au chargement de la map, essayer de faire une mise à jour des positions.

@ tchaOo°

[Edit] Mysterarts, j'ai pas l'impression que ta solution réponde au problème. C'est peut être moi, mais on dirait que tu ne prends pas en compte les cases traversées par les joueurs qui font de longs trajets. Le problème est semble-t-il pourtant bien là. Savoir s'il n'y a pas un joueur qui traverse cette case où tu te rends, même si celui ci n'est pas connecté.

Cependant, effectivement, une table spécifique me semble nécessaire.



RE: Temps réél et mise à jours - Mysterarts - 18-07-2007

tout a fait DämEn, je n'ai pas du tout penser à ça, et pourtant, j'ai pris mon café ^^
Désolé Sad
Ton problème, c'est de devoir actualisé trop de donnée (ce à quoi je répond presque) ou bien de calculer ou se trouve les autres joueur en déplacement ? (pour cela, il faudrait que tu donne la manière dont tu calcules les déplacements... Une simple division distance/temps ?)
Et puis, connaitre ta BDD un peu plus pourrai nous aider à répondre de manière adapté à ton jeu...

Mysterarts, qui écrit, lit, et même modite* un peu vite en ce moment ^^

(*Modite = Maudit Edit de Modo... je viens de le trouver : super jeu de mot non ? ^^)


RE: Temps réél et mise à jours - Shidame - 18-07-2007

Comme Dämen, et je rajouterai faire une mise a jour de toutes les cases du champs de vision du joueur ainsi non seulement tu pourras résoudre ton pb de combats mais le joueur qui se deplace pourra chercher a frapper un pad'bol_2 qui est a coté de son chemin ;p


RE: Temps réél et mise à jours - wIX - 18-07-2007

Mais bien sûr Misterarts ! Comment n'y ais-je pas pensé...

Evidement il y aura une table avec la case d'arrivée et l'heure prévue. Mais je n'avais pas pensé à regarder si d'autres joueurs arrivaient dans la même case.

Certes cette réponse ne répond pas au problème de croisement de route qui est à mon avis insolvable (excepté avec les bonnes idées ci dessus même Maegia dans le pâté...), mais après tout, ne faire les combats que dans la case d'arrivée me convient (en réalité ce sera plutôt quelques cases autour de la case d'arrivé mais c'est pas pus dur).

Merci beaucoup pour cette réponse rapide.

P.S: j'ai horreur des gens qui viennent demander "comment faire un jeu ? et tant qu'on y est faite le moi", pourquoi pas demander "Qu'est ce que l'univers". Et j'ai pitié des modos qui lisent des km de pages, les yeux rouges sang, sous l'emprise du café :wowowow:


RE: Temps réél et mise à jours - Zamentur - 19-07-2007

Ouai ben moi j'ai pas bien compris le problème... En fait j'ai plus l'impression que je vois pas ou il est :heuuu:

D'abord voici les questions que je me pose:
- tes combat sont en vrai temps réel dans le sens ou le joueurs fait un combat en ligne avec un autre joueur connecté et un affichage instantanée?
- quand tu parles de déplacement j'ai l'impression que les persos se déplacent même quand les joueurs sont déconnecté

Tu parles de collision insolvable si tu expliquer plus précisément le problème peut être que çà se règlerais très vite...


Enfin bon j'ai vraiment rien compris au problème si ce n'est qu'il y a combat quand 2 personne sont au même endroit...


RE: Temps réél et mise à jours - barst - 19-07-2007

Bon j'ai peut-etre un début d'idée pour résoudre ton problème.

Tout d'abord il faut une table trajet comprenant les cases de départ, les cases d'arrivée, l'heure de départ, l'heure d'arrivée et la vitesse.

Ensuite, une autre table de progression du trajet.
En gros, si ton perso doit avancer de 10 cases et qu'il fait tout le trajet en 1h, on en déduit qu'il parcout une case toute les 6mn.

Bon voici les infos de la table TRAJET
- ID = 1
- start_x = 10
- start_y = 5
- end_x = 20
- end_y = 5
- start_date = 19/07/07 10:00:00
- end_date = 19/07/07 11:00:00

Et voici la table PROGRESSION
(TRAJET_ID, x,y, start,end)
(1,11,5,19/07/07 10:00:00,19/07/07 10:06:00)
(1,12,5,19/07/07 10:06:00,19/07/07 10:12:00)
(1,13,5,19/07/07 10:12:00,19/07/07 10:18:00)
(1,14,5,19/07/07 10:18:00,19/07/07 10:24:00)
...
(1,20,5,19/07/07 10:54:00,19/07/07 11:00:00)



Pour info la table de PROGRESSIOn est vidée quand le trajet arrive à son terme (sinon ta taille va être énorme)

Ensuite, pour déterminer une intersection, il suffit de trouver 2 trajets avec les mêmes coordonnées et des horaires correspondant.

Par contre, tu vas avoir besoin d'un algo de pathfinding pour trouver les cases parcourues pendant ton trajet


RE: Temps réél et mise à jours - Plume - 19-07-2007

Remarque :
La propriété `
end_date' ne devrait pas être enregistrée dans la table. C'est une donnée calculable donc c'est superficiel de l'enregistrer.