JeuWeb - Crée ton jeu par navigateur
Production d'unité avec le temps - 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 : Production d'unité avec le temps (/showthread.php?tid=6122)

Pages : 1 2


Production d'unité avec le temps - tghpow - 11-05-2012

Bonjour tout le monde,

mon ptit jeu avance tranquillou (faut quand même garder du temps pour les études^^) mais je rencontre un leger probleme.

Je veux faire quelque chose (expliqué plus bas) mais je ne suis pas sur que ce soit bien de le faire en PHP.


Situation:

Imaginons que un lancier met 3 min a être créer une fois que le joueur l'a payé.

Imaginons maintenant, que le joueur a lancé la production de 3 lanciers.

Il a donc une file de production longue de 9min, et toute les 3 minutes il gagne un lancier en plus.


Comment je peux faire? Je pensais faire un truc du genre:

Je prend l'heure où le joueur lance la production, et toute les 3 minutes je fais executer une requête SQL qui incremente de nombre de lanciers dans la BDD.

Seulement, j'ai l'impression que c'est hyper galère et pas très optimisé.

Un ami m'a conseillé de faire du CROM (je viens d'apprendre ce nom^^), qu'en pensez vous? Quel langage avez utilisé?

Merci a vous.

Tghpow


RE: Production d'unité avec le temps. - Sephi-Chan - 11-05-2012

Tu as quel genre de serveur ? Mutualisé ? Dédié ?

Je pense que ton ami te parlait de Cron et ça ne résout que partiellement ton problème puisque c'est seulement précis à la minute près (or comme tu as des durées courtes, tu as besoin d'une précision plus importante).

C'est typiquement le genre de choses très simples et propre à faire sur un dédié (car il y a des outils de queueing).
Par contre sur du mutualisé, c'est toujours moche et inefficace.


RE: Production d'unité avec le temps. - keke - 11-05-2012

Y'a une solution très simple, qui consiste non pas à compter le délai, mais l'heure de création de tes lanciers.

Par exemple, si à 14h03 tu lances la production de 3 lanciers, alors tu peux insérer dans une table
UNITE_A_PRODUIRE :
Joueur1, lancier, 15/05/2012 14h03
Joueur1, lancier, 15/05/2012 14h06
Joueur1, lancier, 15/05/2012 14h09

et à chaque fois que le joueur fait une action (ou plus précisément une action dans lequel les unités intervient), tu compare l'heure des unités à produire avec l'heure actuelle.

Ainsi, pas besoin de cron ...

kéké


RE: Production d'unité avec le temps. - tghpow - 11-05-2012

Hum, par exemple a chaque fois que le joueur accède a une page où il peux voir son nombre de lanciers, si il est 14h07 j'ajoute 2 lanciers (et je supprime les 2 de la liste qui ont été "construit") c'est cela?

C'est vrai que ça m'a l'air plutôt bon..Merci a toi.

Sephi pour l'instant je n'ai aucun serveur, et je ne m'y suis pas encore intéressé (même si apparemment vu ce que tu me dit, il faudrait que je me renseigne sur les dédié).
Mon jeu comportant beaucoup de requêtes avec le "temps" répété très régulièrement, je crois que je vais aller faire un tour sur google^^


Merci a vous deux.

tghpow


RE: Production d'unité avec le temps. - Sephi-Chan - 11-05-2012

L'avantage d'un dédié, c'est que tu peux y installer un système de queueing qui te permet de faire des choses en asynchrone (en dehors d'une requête HTTP).

Ça te permet de fonctionner avec des tâches de fond. Par exemple avec PHP Resque et PHP Resque scheduler. Ça donnerait :


// On récupère la durée de production pour ce type d'unité.
$duration = $unit_type->getProductionDuration();

// On calcule l'heure à laquelle la production sera terminée.
$finishAt = strtotime("+{$duration} seconds");

// On collecte quelques données pour les transmettre à la tâche.
$args = array(
'player_id' => $player->getId(),
'unit_type_id' => $unit_type->getId()
);

// On met la tâche en queue. A l'heure demandée, le système va appeler
// la méthode perform de la classe CreateUnit en lui passant le hash $args
// en arguments. Comme ça tu pourras faire le nécessaire, en l'occurrence
// ajouter une unité du type souhaité au joueur indiqué. La tâche est traitée
// par le worker qui s'occupe des tâches de type 'create_unit'.
ResqueScheduler::enqueueIn($finishAt, 'create_units', 'CreateUnit', $args);


Et comme ça, les choses sont faites dans les temps sans demander plein de requêtes SQL supplémentaires tout le temps.


RE: Production d'unité avec le temps. - tghpow - 11-05-2012

Hum..en effet si je peux eviter 36 000 requêtes SQL c'est toujours mieux.

Je vais me renseigner via mon ami google pour ce systeme de queueing, en plus je crois avoir accès a un ptit serveur dédié en tant qu'étudiant..

Merci de votre aide, elle est très apprécié!


RE: Production d'unité avec le temps. - tghpow - 11-05-2012

Désolé du double post:

Je n'y connais pas grand chose en serveur..Toute fois avec Msdna academic, j'ai accès a des logiciels de microsoft gratuit.
Celui la, me suffit t'il a programmer mon jeu? A faire ce que doit faire pour les troupes..etc?

http://e5.onthehub.com/WebStore/OfferingsOfMajorVersionList.aspx?ws=4c052145-669b-e011-969d-0030487d8897&vsro=8&pmv=f1b6ae59-7b3a-de11-b696-0030485a8df0&cmi_mnuMain=bdba23cf-e05e-e011-971f-0030487d8897


RE: Production d'unité avec le temps. - niahoo - 11-05-2012

ça c'est juste un serveur de bases de données (genre mySQL en plus poussé), il te faut un serveur avec un OS dessus pour installer un serveur web, un serveur SQL, etc.


RE: Production d'unité avec le temps. - tghpow - 11-05-2012

Merci de ta réponse.

Puis-je avoir votre aide sur mon choix? Voici la liste des serveurs que je peux télécharger gratuitement et légalement (important^^).

http://e5.onthehub.com/WebStore/ProductsByMajorVersionList.aspx?ws=4c052145-669b-e011-969d-0030487d8897&vsro=8&pc=e3f92cf0-4b09-e011-bed1-0030487d8897


RE: Production d'unité avec le temps. - Sephi-Chan - 11-05-2012

Pour un serveur, le mieux est un Ubuntu server ou un Debian, mais ça demande des compétences en administration Linux (tout comme Windows Server nécessitera des compétences en administration Windows).

Après, si tu as de l'argent tu peux le faire infogérer, mais tu n'apprends pas grand chose.

Bref, à toi de voir ce que tu veux faire, comment tu veux le faire, et le temps que tu es prêt à y consacrer.