JeuWeb - Crée ton jeu par navigateur
aide jeux par navigateur avec gestion du 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 : aide jeux par navigateur avec gestion du temps (/showthread.php?tid=6540)



aide jeux par navigateur avec gestion du temps - hercull - 26-12-2012

Bonjour! voila j'aimerai réaliser un jeux par navigateur avec gestion dans le temps du genre ogame travian...
je suis apprenti codeur C# ASP.NET et PHP , Javascript et on ma conseillé sur ce site de plutôt choisir le PHP ,ce que j'ai fais, je voulais savoir si on pouvais m'aider dans la conception de mon jeux?
1)Voila ou je bloque dans ma BDD (ou j'ai déjà beaucoup de mal a organiser) ,j'ai créer un table "date", temp-debut, temp-fin, temp_actuelle, seulement pour chacun de ces éléments je ne sais pas quoi choisir entre DATETIME, TIME, TIMESTAMP...??

2) je voudrai que lorsqu'on clic sur un lien ou un bouton cela déclenche une action exemple: on clic l'heure actuel est envoyé dans la base avec +1h, et le compte à rebours se déclenche , ensuite pour l'affichage du compte a rebours on compare le temps actuel et le temps enregistrer dans la base si il est inférieur au temps écrit dans la base le compte à rebours continu si il est supérieur sa permet de re-clicer sur un nouveaux lien.


Je ne sais pas si c'est le bon procédé?
si c'est le bon je comprend le mécanisme mais de le coder concrètement je bloque complétement.
Je sais sa va un peu dans tous les sens, si vous pouvez m'aider à me structuré ce serai génial.


RE: aide jeux par navigateur avec gestion du temps - Sephi-Chan - 26-12-2012

On part du principe qu'à chaque fois qu'un joueur effectue une action qui va prendre du temps (effectuer une recherche, construire un bâtiment, entraîner une unité, etc.), on enregistre un événement dans la base de données (dans une table scheduled_events, par exemple.

On donne à cette table une colonne finish_date de type DATETIME (qui permet de stocker une date et une heure au format 2000-12-31 23:59:59, TIMESTAMP fait la même chose avec un autre format).

Ensuite, il te faut des colonnes pour stocker l'auteur de l'action (l'identifiant du joueur, disons player_id), l'information des choses à faire : l'identifiant du type d'unité à créer unit_id (avec une valeur NULL si ce n'est pas une création d'unité), l'identifiant de la recherche à effectuer research_id (à NULL si ce n'est pas une recherche), l'identifiant du bâtiment à construire building_id (à NULL si ce n'est pas une construction de bâtiment).


Exemple d'une requête qui planifie la construction du bâtiment 1 par le joueur 1 dans 2 heures.


INSERT INTO scheduled_events (finish_at, player_id, building_id) VALUES (DATE_ADD(NOW(), INTERVAL 2 HOUR), 1, 1);


Ensuite, enregistrer les événements est un bon début mais il faut aussi effectuer des choses quand le décompte est atteint. Pour ça, tu peux avoir une fonction qui se charge de rechercher toutes les tâches dont la date de fin est passée, puis d'effectuer des actions et de les supprimer de la table. Tu peux appeler cette fonction à chaque chargement de page ou mieux : via une tâche CRON.

La requête pour sélectionner les événements terminés :


SELECT * FROM scheduled_events WHERE finish_at < NOW();

Ensuite, à toi de faire quelque chose avec les lignes retournées, puis les supprimer (pour ne pas effectuer la même action une deuxième fois).


Pour compter le nombre de constructions de bâtiments planifiées :


SELECT COUNT(*) FROM scheduled_events WHERE building_id IS NOT NULL AND NOW() < finish_at;

À toi de griser ou non les boutons pour construire de nouveaux bâtiments selon le nombre de bâtiments déjà en construction.


Voilà, n'hésite pas à demander si tu as toujours besoin d'aide.


RE: aide jeux par navigateur avec gestion du temps - hercull - 31-12-2012

Tout simplement génial! merci!
Juste quelques petites choses:

1)pour les tables et les colonnes je choisi MyISAM ou INODB?

2)pour la table scheduled_events je dois créer une colonne scheduled_events_id?

3)Quelle est la différence entre la colonne finish_date et finish_at? car tu me propose de rajouter la colonne finish_date mais dans la requête SQL tu écri finish_at, désolé de mon faible niveau.

4)Pour ne pas avoir à refaire ma base plusieurs fois à cause d'erreur de ma part, je dois construire combien de table?
une table "player" contenant(player_id, player_pseudo, player_email, player_mdp, autre?

pour les ressources du joueur je dois créer une autre table ou je les met dans la table "player"?
imaginons qu'il y a 5 types de ressources table "resources"(or, pierre, bois, fer, matière spécial)

Ensuite je dois construire une table pour les batiments, une autre pour les recherches et une autre pour les unités?
-table "building"(building_id, building_name, building_cost, building_level, building_number, building_propriety, building_time?

-table "research"(research_id, research_name, research_cost, research_level, research_effect, research_time?

-table "unit"(unit_id, unit_name, unit_cost, unit number ,unit_propriety, unit_time?

Quoi d'autre?

5)Comment gérer le changement de temps de construction et le changement de prix des batiments , unités et recherche en fonction de leur niveau?

6)peux tu me donner plus d'explication pour l'utilisation d'une tache CRON?

Merci.


RE: aide jeux par navigateur avec gestion du temps - Sephi-Chan - 31-12-2012

(31-12-2012, 11:22 AM)hercull a écrit : 1)pour les tables et les colonnes je choisi MyISAM ou INODB?

InnoDB est très bien, il te permettra d'utiliser des transactions.


(31-12-2012, 11:22 AM)hercull a écrit : 2)pour la table scheduled_events je dois créer une colonne scheduled_events_id?

Comme clé primaire pour cette table, je te conseille de simplement nommer la colonne id.


(31-12-2012, 11:22 AM)hercull a écrit : 3)Quelle est la différence entre la colonne finish_date et finish_at? car tu me propose de rajouter la colonne finish_date mais dans la requête SQL tu écri finish_at, désolé de mon faible niveau.

C'est une erreur, je te conseille d'utiliser finish_at.


(31-12-2012, 11:22 AM)hercull a écrit : 4)Pour ne pas avoir à refaire ma base plusieurs fois à cause d'erreur de ma part, je dois construire combien de table?
une table "player" contenant(player_id, player_pseudo, player_email, player_mdp, autre?

C'est toi qui voit ce que tu mets dans ta table players. Je te conseille d'opter pour des termes anglais (c'est la langue la plus appropriée à la programmation) et de ne pas utiliser d'abréviations. Tu n'as pas besoin de préfixer tes colonnes non plus, puisqu'elles le sont naturellement par le nom de la table. Je te suggère donc d'avoir des colonnes nommées id, name, email, password_hash, etc.


(31-12-2012, 11:22 AM)hercull a écrit : pour les ressources du joueur je dois créer une autre table ou je les met dans la table "player"?
imaginons qu'il y a 5 types de ressources table "resources"(or, pierre, bois, fer, matière spécial)

Si tu as seulement une poignée de ressources, utiliser des colonnes dédiées (gold, stone, wood, iron, special_stuff) me paraît plus pertinent et simple.

(31-12-2012, 11:22 AM)hercull a écrit : Ensuite je dois construire une table pour les batiments, une autre pour les recherches et une autre pour les unités?
-table "building"(building_id, building_name, building_cost, building_level, building_number, building_propriety, building_time?

-table "research"(research_id, research_name, research_cost, research_level, research_effect, research_time?

-table "unit"(unit_id, unit_name, unit_cost, unit number ,unit_propriety, unit_time?

Quoi d'autre?

Là aussi je te suggère d'abandonner les préfixes des colonnes, mais l'idée est là. Je te suggère d'utiliser une colonne par type de ressource pour exprimer les coûts (ça ajoute des colonnes mais ça rend le script plus simple, donc facile à maintenir et à comprendre).

De même, attention aux informations potentiellement complexes comme effect ou propiety. Je pense qu'on pourrait discuter de ce que tu stock dedans dans un second temps.


(31-12-2012, 11:22 AM)hercull a écrit : 5)Comment gérer le changement de temps de construction et le changement de prix des batiments , unités et recherche en fonction de leur niveau?

Tout dépend de ces coûts : sont ils statiques ou calculés de manière dynamique (en fonction du niveau de la recherche, de technologies débloquées, etc.) ?

Dans un cas comme dans l'autre, tu devrais faire des fonctions "boîte noire" qui te donnent le coût d'un bâtiment B effectuée par un joueur J. cost_for_upgrade($building, $player). Comme ça tu pourras changer son implémentation à un seule endroit le jour où tu veux modifier la méthode de calcul. L'expression des coûts pourra t'être retournée sous la forme d'un tableau associatif array('wood' => 180, 'stone' => 800)


(31-12-2012, 11:22 AM)hercull a écrit : 6)peux tu me donner plus d'explication pour l'utilisation d'une tache CRON?

Les tâches CRON sont des scripts exécutés à intervalles réguliers par le système (dans la même veine, il y aussi des tâches AT, exécutées ponctuellement à un instant donné). Ça permet d'extraire les tâches des processus Web, ce qui permet souvent d'éviter d'infliger aux joueurs qui doit exécuter une résolution d'avoir une page lente. J'ai écrit un article Utiliser l'asynchrone : pourquoi et comment ? , je t'invite à le lire. Wink

Certains hébergement proposent ce genre de tâche, sinon des services externe le font.


RE: aide jeux par navigateur avec gestion du temps - hercull - 31-12-2012

Merci vraiment tu m'aide énormément!
Je continu toujours des questions techniques:

-Pour le cout des améliorations de niveau des structures ou des recherches le cout double pour chaque niveau supplémentaire, don statique je pense?

-à part la clé primaire "id" de chaque table , les autres doivent pouvoir être NULL?

-Pour la taille des INT pour le ressources je dois mettre combien? j'ai mis INT(64) sa suffit?

-comment répertorier les différents bâtiments, différents unités, différents recherches, tu as parler de tableau associatif, je comprend l’idée mais je ne sais pas ou cela se situe ni comment le construire? ou cela se fait dans chaque table correspondante en utilisant une colonne par type d'unité ou de bâtiment ou de recherche?

Merci.


RE: aide jeux par navigateur avec gestion du temps - Sephi-Chan - 31-12-2012

(31-12-2012, 02:09 PM)hercull a écrit : -Pour le cout des améliorations de niveau des structures ou des recherches le cout double pour chaque niveau supplémentaire, don statique je pense?

Si tu suis une formule aussi simple, tu peux recalculer dynamiquement à chaque fois : tu sais que pour avoir le prix du niveau 10, tu double 10 fois de suite le prix du niveau initial (du niveau 1)


(31-12-2012, 02:09 PM)hercull a écrit : -à part la clé primaire "id" de chaque table , les autres doivent pouvoir être NULL?

La plupart des colonnes peuvent être à en effet NULL, sauf bien sûr celles où tu attends forcément une valeur. Typiquement, les colonnes contenant les ressources d'un joueur où les coûts ne devraient pas être à NULL mais plutôt à 0.


(31-12-2012, 02:09 PM)hercull a écrit : -Pour la taille des INT pour le ressources je dois mettre combien? j'ai mis INT(64) sa suffit?

Tu choisis INT et tu laisses ce qu'il te propose (je crois que c'est 11 par défaut). Le tableau en bas de cette page de documentation te donne la capacité maximale des colonnes numériques (quand la colonne est UNSIGNED, son intervalle de valeur passe de 0 au double de la valeur de fin classique).


(31-12-2012, 02:09 PM)hercull a écrit : -comment répertorier les différents bâtiments, différents unités, différents recherches, tu as parler de tableau associatif, je comprend l’idée mais je ne sais pas ou cela se situe ni comment le construire? ou cela se fait dans chaque table correspondante en utilisant une colonne par type d'unité ou de bâtiment ou de recherche?

Cette question me laisse perplexe. C'est bien le but des tables buildings, researches, units que tu stock les différents types d'unités, avec leurs coûts, leurs caractéristiques, etc.

Puis après, quand un joueur achète une unité, tu crées une ligne dans une autre table (unit_instances, par exemple) qui dispose de colonnes unit_id, player_id, ainsi que des colonnes pour stocker l'état de cette unité spécifique current_health).


Il est temps que tu passes à la pratique. :p


RE: aide jeux par navigateur avec gestion du temps - Xenos - 01-01-2013

(j'ajoute rapidement mon grain de sel entre deux flûtes de Champagne car les coupes c'est le mal les bulles s'en vont... bref. MyISAM ne gère pas les transactions certes, mais il reste 10x plus rapide que InnoDB, ce qui peut ne pas être négligeable pour un début de projet: plus de rapidité = serveur moins cher donc plus abordable au début. D'autant que les transactions faut en avoir l'utilité)

(Bonne année)

(C'était Xenos qui passe en coup de vent entre le magret de canard et les buchettes de dessert)


RE: aide jeux par navigateur avec gestion du temps - php_addict - 02-01-2013

(01-01-2013, 05:57 PM)Xenos a écrit : (j'ajoute rapidement mon grain de sel entre deux flûtes de Champagne car les coupes c'est le mal les bulles s'en vont... bref. MyISAM ne gère pas les transactions certes, mais il reste 10x plus rapide que InnoDB, ce qui peut ne pas être négligeable pour un début de projet: plus de rapidité = serveur moins cher donc plus abordable au début. D'autant que les transactions faut en avoir l'utilité)

(Bonne année)

(C'était Xenos qui passe en coup de vent entre le magret de canard et les buchettes de dessert)


ok ok, mais là comme il est pas près d'utiliser un syteme de queue schedulding où les actions seront résolues par un seul process, il va faire comme la majorité d'entre nous, resoudre les actions au rafraichissement de page, donc gérer les concurences d'accès à la base de donnée, et donc innodb et transaction, pas trop le choix non?

j'aimerais bien avoir le temps de refaire la résolution de mes actions par un seul process en queue schedulding, mais c'est quand même bien chaud...si sa structure de code et de bdd ne devient pas trop pourrie et qu'il utilise "resolution on refresh" il pourra changer par la suite, du moins c'est ce que j'espere pour moi en realité...

bref...bonne année !