Merci de vous intéresser à mon problème
Mais je ne pense pas que nous parlions du même problème
Tout d'abords, le choix de mettre les ressources à jour de façon sélective par rapport à une gestion via des cron job est déjà pris !
Le rapport avantages/inconvénients favorise plus que grandement la première approche.
Pour niahoo, la mise à jour des ressources n'est pas faite à la connexion du joueur !
Elle est faite dès qu'on en a besoin !
Donc à chaque fois que le joueur va sur une nouvelle page, on calcule les nouvelles ressources.
Mais pas seulement ! i.e. si le joueur est attaqué alors qu'il n'a pas été sur le jeu depuis 2mois et bien ses ressources seront mise à jour avant d'exécuter l'attaque.
Ma question portait simplement sur la façon de stoquer les ressources dans la base de donnée.
Imaginons que dans mon jeu, les ressources sont des nombres entiers. Car, par exemple, avoir 0,66 unité n'a pas de sens.
J'ai donc naturellement envie de les stoquer sous forme d'entier non signé (BIGINT UNSIGNED) dans ma base de donnée. Ça a pour avantage de pouvoir stoquer des nombres très grand !
Je vous rappelle l'algorithme pour que vous compreniez bien la suite.
Dans la BDD, on garde le nombre d'unité de chaque ressource que possède le joueur.
En plus, on garde la date de la dernière mise à jour de ces dernières.
Petit exemple:
BDD
Ressource: 800
LastUpdate: 2010-02-06 12:00:00
Le joueur arrive sur une page à 2010-02-06 13:00:00, on récupère les données dans la BDD et on calcule le temps qui s'est écoulé depuis la dernière mise à jour (Ici 1h).
Si sa production est de 50 unités par heure, on va mettre à jour la BDD de cette façon :
BDD
Ressource: 850
LastUpdate: 2010-02-06 13:00:00
Mais avec cette approche (ressources sous forme de nombre entier), un problème surviens.
Imaginons que la production du joueur est de 3 unités par heure, donc de 0.05 unité par minute.
Le joueur arrive sur une page, la BDD est comme suit:
BDD
Ressource: 800
LastUpdate: 2010-02-06 12:55:00
Il est maintenant 13h, on calcule la différence: 5 minutes. Ce qui correspond à 0.25 unité produite ! Si on calcule en entier, ça correspond à 0 unité supplémentaire, la BDD sera donc mise à jour de la façon suivante :
BDD
Ressource: 800
LastUpdate: 2010-02-06 13:00:00
Le problème est que si je joueur se promène sur le site à raison de 1 page toutes les 5 minutes, seul le champ LastUpdate sera mis à jour et ses ressources n'augmenteront jamais !!
Une solution serait de stoquer les ressources en float, après 5 minutes la BDD serait alors :
BDD
Ressource: 800.25
LastUpdate: 2010-02-06 13:00:00
Mais cette solution ne me plait pas trop
Tout d'abord parce qu'elle a un range de valeur possible fort inférieur aux entiers... Mais également car sémantiquement, 0.5 unité n'a pas de sens dans mon jeu.
Je me demandais donc si vous voyiez une autre solution
Un grand merci d'avance
Mais je ne pense pas que nous parlions du même problème
Tout d'abords, le choix de mettre les ressources à jour de façon sélective par rapport à une gestion via des cron job est déjà pris !
Le rapport avantages/inconvénients favorise plus que grandement la première approche.
Pour niahoo, la mise à jour des ressources n'est pas faite à la connexion du joueur !
Elle est faite dès qu'on en a besoin !
Donc à chaque fois que le joueur va sur une nouvelle page, on calcule les nouvelles ressources.
Mais pas seulement ! i.e. si le joueur est attaqué alors qu'il n'a pas été sur le jeu depuis 2mois et bien ses ressources seront mise à jour avant d'exécuter l'attaque.
Ma question portait simplement sur la façon de stoquer les ressources dans la base de donnée.
Imaginons que dans mon jeu, les ressources sont des nombres entiers. Car, par exemple, avoir 0,66 unité n'a pas de sens.
J'ai donc naturellement envie de les stoquer sous forme d'entier non signé (BIGINT UNSIGNED) dans ma base de donnée. Ça a pour avantage de pouvoir stoquer des nombres très grand !
Je vous rappelle l'algorithme pour que vous compreniez bien la suite.
Dans la BDD, on garde le nombre d'unité de chaque ressource que possède le joueur.
En plus, on garde la date de la dernière mise à jour de ces dernières.
Petit exemple:
BDD
Ressource: 800
LastUpdate: 2010-02-06 12:00:00
Le joueur arrive sur une page à 2010-02-06 13:00:00, on récupère les données dans la BDD et on calcule le temps qui s'est écoulé depuis la dernière mise à jour (Ici 1h).
Si sa production est de 50 unités par heure, on va mettre à jour la BDD de cette façon :
BDD
Ressource: 850
LastUpdate: 2010-02-06 13:00:00
Mais avec cette approche (ressources sous forme de nombre entier), un problème surviens.
Imaginons que la production du joueur est de 3 unités par heure, donc de 0.05 unité par minute.
Le joueur arrive sur une page, la BDD est comme suit:
BDD
Ressource: 800
LastUpdate: 2010-02-06 12:55:00
Il est maintenant 13h, on calcule la différence: 5 minutes. Ce qui correspond à 0.25 unité produite ! Si on calcule en entier, ça correspond à 0 unité supplémentaire, la BDD sera donc mise à jour de la façon suivante :
BDD
Ressource: 800
LastUpdate: 2010-02-06 13:00:00
Le problème est que si je joueur se promène sur le site à raison de 1 page toutes les 5 minutes, seul le champ LastUpdate sera mis à jour et ses ressources n'augmenteront jamais !!
Une solution serait de stoquer les ressources en float, après 5 minutes la BDD serait alors :
BDD
Ressource: 800.25
LastUpdate: 2010-02-06 13:00:00
Mais cette solution ne me plait pas trop
Tout d'abord parce qu'elle a un range de valeur possible fort inférieur aux entiers... Mais également car sémantiquement, 0.5 unité n'a pas de sens dans mon jeu.
Je me demandais donc si vous voyiez une autre solution
Un grand merci d'avance