Partage
  • Partager sur Facebook
  • Partager sur Twitter

Création d'un jeu par navigateur

Gestion des automatismes dans le temps

    13 juin 2019 à 22:38:01

    Bonjour,

    Voilà, étant DWJ depuis peu, (Merci OPENCLASSROOMS!!!) je suis conscient que le projet est très ambitieux mais je suis quelqu'un de très obstiné et compte bien y parvenir même s'il me faut 10 ans, donc merci d'avance pour les mises en garde mais je sais à quel Everest je fais face... Cela dit... J'ai évidemment besoin d'aide et je compte sur une âme charitable qui voudra bien m'aider à résoudre quelques incompréhensions de ma part.

    1- Je suis partis sur une base POO prise du cours (l'application de news) pour tout ce qui est framework de base (router, application, applicationComponent etc...). Question: Ais-je bien fait? Ou la structure d'un jeu par navigateur est-elle totalement différente?

    2-J'en suis actuellement à la création et évolution des bâtiments et je bloque sur le concept de temps (temps d'évolution, production de ressources, d'unités etc...) Je pourrai très simplement le faire en JS et avec de l'Ajax pour envoyer en BD (et je le ferai en plus du php évidemment) mais je sais que c'est faisable en PHP, par contre je n'ai absolument aucune idée de la façon dont je dois m'y prendre... des dates en BD et des comparaisons mais cela demande de checker la base à chaque sec pour vérifier la date et sur toutes les pages... bref... voyez... je patauge et j'aurai bien besoin d'un petit coup de pousse.

    Merci d'avance!

    • Partager sur Facebook
    • Partager sur Twitter
      13 juin 2019 à 23:17:50

      Salut,

      il faut en fait stocker la date-heure de fin d'action et comparer au chargement de page si elle est passée ou non ;)

      • Partager sur Facebook
      • Partager sur Twitter
        14 juin 2019 à 8:45:00

        Bonjour,

        Je ne suis pas du tout spécialiste du sujet donc je peux dire une belle bêtise mais ma réflexion est la suivante :

        - un jeu c'est surtout de la programmation événementiel me semble t-il et du graphisme. La plateforme php, bdd et usage de la POO ne me semble pas bien correspondre.

        Pour ta question et en complément de Christouphe, il est peut-être intéressant de stocker certaines données sur le poste client via un mécanisme comme le web storage du html5 et ainsi d'éviter du trafic réseau et des requêtes serveur.

        A+

        • Partager sur Facebook
        • Partager sur Twitter
          14 juin 2019 à 21:07:57

          salut et merci à vous 2 pour vos réponses,

          Christouphe, si je comprends ton concept, mon script doit donc s'effectuer sur toutes les pages de mon application afin de pouvoir terminer la construction sans avoir à retourner dans le module des bâtiments. Et pour le temps réel un peu de JS...

          monkey3d, ne crois-tu pas possible de gérer l'évennementiel avec du JS  et sauver tout ça en BD via PHP?

          merci d'avance pour votre aide! ^^

          • Partager sur Facebook
          • Partager sur Twitter
            15 juin 2019 à 7:49:24

            monkey3d, ne crois-tu pas possible de gérer l'évennementiel avec du JS  et sauver tout ça en BD via PHP?

            Si c'est sans nul doute possible mais cela ne complique t-il pas l'architecture logicielle ? ... mettre un serveur web + base de données + 2 langages de programmation au moins ... il me semble qu'il peut y avoir plus simple pour juste sauver un contexte sur un serveur.

            Bye

            -
            Edité par monkey3d 17 septembre 2019 à 7:33:50

            • Partager sur Facebook
            • Partager sur Twitter
              15 juin 2019 à 8:20:16

              Ok monkey3d, j'imagine que tu as raison, l'architecture logicielle doit pouvoir se créer plus simplement, je vais demander à mon ami Google s'il peut m'aider à trouver des solutions alternatives ...

              Ou alors, si quelqu'un a une idée sur la façon dont est codé un jeu par navigateur (genre Ogame) je suis preneur!

              (je vais quand même continuer mon projet en attendant de trouver plus efficace).

              Merci encore!

              • Partager sur Facebook
              • Partager sur Twitter
                15 juin 2019 à 9:49:31

                Salut, tout comme toi j'ai fais la formation DWJ et j'ai aussi fait un jeu pour le p5 mais sous Symfony du même style que celui que tu décris. N'hésite pas à me contacter si tu as des questions un peu plus détaillés ou si tu veux un peu d'aide.
                • Partager sur Facebook
                • Partager sur Twitter
                  16 juin 2019 à 9:14:12

                  salut Julien,

                  En fait j'ai 1 million de questions sur pleins de trucs... je me débrouille avec mon ami Google mais c'est pas toujours le type de réponse que j'attends... (codage bordélique, failles de sécurité etc... bref je cherche à le faire propre et j'avoue que si tu aurais un peu de temps à me consacrer (en chat par exemple pour être plus efficace) je t'en serai vraiment reconnaissant.

                  merci D'avance

                  • Partager sur Facebook
                  • Partager sur Twitter
                    16 juin 2019 à 18:14:13

                    Bonjour,

                    Viens voir comment on a fait sur zordania... ça te donnera une idée de comment faut pas faire :D 

                    Bon j'exagère un peu ^^ zordania fonctionne en mode tour par tour, donc à chaque passage d'un tour on refait tous les calculs (progression des constructions / recherches / formations d'unités / production des armes et ressources ... déplacement des légions sur la carte ... calcul des points aussi ...) Bref : un gros sac de noeuds qui se déclenche par cron (toutes les 15 min / heure/ intervalle fixe à définir)

                    L'avantage est que le reste du jeu est beaucoup plus facile à gérer, l'inconvénient c'est beaucoup plus statique: il faut attentre 1 tour pour voir la progressions.

                    Et donc l'option de christouphe c'est surement mieux, tu a une date de début et / ou fin, et tu affiche en temps réel le temps restant jusqu'à l'achèvement, avec une barre de progression et tout. Mais c'est vite très compliqué, il faut prendre en compte les interactions entre joueurs bref, c'est loin d'être simple au final :) 

                    Mais les scrips de cron c'est aussi une usine à gaz, en résumé c'est du php en mode batch qui fait des update en masse.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      17 juin 2019 à 22:54:18

                      Salut et encore merci à vous,

                      Pifou25, merci pour l'idée du tour par tour mais je veux faire un jeu en temps réel, du coup je pense que je vais rester sur l'idée de Christouph en stockant des dates. Et j'aimerai le créer de toute pièce ... Avec le minimum de bibliothèques ou framework, du coup le cron, je veux essayer de faire sans.

                      Donc corrigez moi si je me trompe mais:

                      - Je récupère la date de fin de construction (stockée en base) au moment du login et lors d'une nouvelle construction par exemple, que je stocke dans une variable PHP.

                      - Ensuite je crée un script JS avec AJAX pour appeler (toutes les secondes) une fonction PHP qui à récupérer cette variable (pas la requête, mais une 2eme fonction) pour comparer mes données AJAX (date courante) et ma variable PHP (date de fin de construction... Je ne sais pas si les formats date JS sont comparables à ceux de PHP).

                      Ce qui m'évite de saturer le serveur avec des requêtes incessantes.

                      - Et j'ai plus qu'à terminer la construction si j'ai un résultat positif.

                      Et tout ça en une seule requête... d'après vous est-ce faisable et si oui n'est-ce pas trop lourd en terme de ressources (le JS évidemment)?

                      Merci pour votre aide! :)

                      • Partager sur Facebook
                      • Partager sur Twitter
                        18 juin 2019 à 0:19:48

                        Dans le principe c'est bien. mais si tu fais 1 requete ajax toutes les secondes, pour le coup tu va vraiment saturer ton serveur. Le mieux à mon avis c'est d'avoir un simple "compte à rebours" en JS, et faire l'appel ajax lorsque le compteur arrive à zéro, que la construction est terminée par exemple.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          18 juin 2019 à 9:42:52

                          Salut Pifou25,

                          J'y ai bien pensé au compte à rebours JS mais le problème qui se pose à moi c'est la déconnexion ou fermeture de l'onglet/fenêtre qui va stopper ce script alors qu'il faut que le compte à rebours continue jusqu'à la fin.

                          Comment le JS peut-il savoir où reprendre le compte à rebours après déconnexion et reconnexion ?

                          Mon idée c'était:

                          1- je stocke le temps restant (JS) et la date courante en base (je ne sais pas trop comment faire là)

                          2- Au moment du login,  je récupère le tps restant, la date courante stockée auparavant et la date de fin en base

                          3- je fais mon petit calcul et pouf... je sais combien de temps il reste avant la fin et j'ai plus qu'à relancer le script (JS) avec cette valeur.

                          Le truc c'est que ces 3 valeurs auront des formats différents: script JS = un entier, date courante et date de fin = format date PHP

                          Puis-je transformer ces dates en entiers afin de pouvoir les comparer (il me semble que oui avec un time() mais besoin de confirmation svp)?

                          Et enfin, d'après toi... Est-ce la bonne marche à suivre?

                          Encore merci!

                          • Partager sur Facebook
                          • Partager sur Twitter
                            18 juin 2019 à 10:42:35

                            Bonjour,

                            Tu peux fonctionner avec des timestamp. Cela sera plus simple pour tes calculs.

                            Tu auras une table évolution liée à ta table batiment qui comprendra le début de l'évolution et le timestamp de fin.

                            En JS dès que timestamp de fin < timestamp actuel alors requête ajax.

                            Si la personne quitte avant ce n'est pas grave car tu auras un script php à chaque début de page qui permet de mettre à jour pour le joueur concerné.

                            Du moins c'est comme ça que je vois de mon côté.

                            • Partager sur Facebook
                            • Partager sur Twitter
                              18 juin 2019 à 11:19:04

                              Yep Gloufko, merci!

                              J'ai déjà fait ma table évolution en plus... Je vais tester comme ça pour voir.

                              Le principe de MAJ à chaque début de page me fait un peu peur niveau duplication... Cela signifie que ma fonction de MAJ doit être appelée à chaque action de chaque contrôleur de chaque module vu que chaque action entraîne une vue-> donc une page, non? Si c'est le cas, j'imagine que nul autre que mon backController est mieux approprié pour cette dite fonction, non?

                              Merci!

                              • Partager sur Facebook
                              • Partager sur Twitter
                                18 juin 2019 à 11:21:25

                                Re,

                                pense plus global, tu fait une fonction qui s'occupe des MAJ et tu l'appelle seulement sur les pages d'interactions entre joueurs (espionnage, attaque,transport, classement) et tu raffine en fonction

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  18 juin 2019 à 11:33:33

                                  Re,

                                  Je comprends ce que tu veux dire mais  je vais en avoir besoin beaucoup plus souvent de cette fonction... Pour les prérequis, les technologies, les unités... Pour toute production ou évolution ou interaction je vais en avoir besoin logiquement non? du coup si je la met dans mon backController elle s'exécutera automatiquement à chaque action... Ça ne fonctionnera pas?

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    18 juin 2019 à 11:38:02

                                    chaque action == trop souvent.

                                    Si tu monte en session les information de l'utilisateur pour faire les prod / tehcno déjà tu as moins besoin de MAJ, seulement lorsque le joueur gagne un niveau dans la techno ou lorsqu'il possède des unités en plus et encore là, tu peux le faire en fractionné.

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      18 juin 2019 à 11:46:47

                                      Ok merci, je m'en doutais un peu,

                                      Que veux-tu dire par "le faire en fractionné"?

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        18 juin 2019 à 11:53:01

                                        ne mettre à jour que ce que tu as modifié, tu n'as pas l'obligation de modifier TOUT le joueur, si tu ne modifie qu'une valeur, tu la modifie en base et en session une fois la modif en base validée. Sinon erreur
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          18 juin 2019 à 12:15:33

                                          D'accord, compris,

                                          Bon bah il n'y a plus qu'à essayer ça... ^^ Merci à tous pour vos conseils, cela m'a permis de comprendre comment m'y prendre, du coup je me mets au boulot de ce pas, et... il y a des chances pour que je revienne avec d'autres questions d'ici peu si jamais je bloque trop et que je ne m'en sors pas avec Google donc "restez pas trop loin svp"... ^^

                                          Merci encore!

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            7 juillet 2019 à 21:31:28

                                            Salut à tous!

                                            Bon, pour ce qui est de l'évolution des bâtiments, votre aide m'a été grandement utile et du coup... mission accomplie!

                                            En revanche, je bloque énormément sur le concept de gains de ressources en continue... je ne vois pas du tout comment m'y prendre...

                                            quelqu'un aurait-il une piste svp?

                                            Mes ressources sont stockées dans des variables de session, mais quand dois-je les rentrer en bd? et comment les incrémenter à répétition?

                                            Merci d'avance!

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              8 juillet 2019 à 0:20:12

                                              En fait, il n'y a aucune différence entre l'évolution des bâtiments, et l'évolution des ressources : c'est une variable incrémentée de X (valeur) toutes les Y (secondes / minutes / heures : le temps) jusqu'à un maximum Z (bâtiment terminé, ou grenier rempli) du coup ça va faire beaucoup de copier / coller, et il y aura moyen de factoriser tout ça ^^
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                8 juillet 2019 à 19:38:31

                                                Salut Pifou et merci pour ta réponse rapide....

                                                Je t'expose mon script actuel rapidement:

                                                J'ai une class MotherPlanet avec , pour attributs, le joueur (le propriétaire) et les différentes ressources.

                                                Les silos ne sont pas encore crées mais ça c'est simple je devrai m'en sortir....

                                                Pour mes mines, j'ai crée une class RessourceBuilding avec une production, un level, un joueur, un statut (construit ou en construction), une date de début de construction, une date de fin.

                                                J'ai crée une class RessourceBuildingEvolution avec un level, une nouvelle prod, un coût pour chaque ressource, un temps d'évolution et une mine. (tout est en base)

                                                (je passe sur les attr name, id etc... mais ils y sont)

                                                Quand je fais évoluer un bâtiment, je sélectionne le RessourceBuilding en question, vais chercher dans RessourceBuildingEvolution la mine correspondante, le level suivant, le coût et le temps, je déduis le coût d'évolution aux ressources de MotherPlanet et mets le statut "en construction" au bâtiment avec les temps de début et de fin et tout ça ... en BD... Une fois le temps écoulé...  bim... évolution et le tout en BD avec les nouvelles données et le statut "construit"... 

                                                Si je dois faire pareil pour la production de ressources, Un problème va se poser... l'entrée en BD...

                                                Les bâtiments ne nécessitent que 2 requêtes (début et fin de construction), pour les ressources, comment je fais pour éviter de saturer le serveur avec des requêtes toutes les minutes pour sauver les données ? (elles sont déjà en SESSION) et... autre question... Je compare quelle date à quelle date pour connaitre mon incrémentation? c'est du continue les ressources contrairement aux bâtiments... Désolé mais je nage vraiment sur le concept, j'arrive pas à me le représenter, j'ai besoin d'un coup de pousse...

                                                Merci!

                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  9 juillet 2019 à 21:09:55

                                                  Ha, je vois que c'est déjà bien structuré, tant mieux :) 

                                                  Les ressources n'ont aussi besoin que de 2 dates, T0 la date de maj de la session (à la connexion du joueur par exemple, ou bien s'il y a eu un refresh de la session) et T1 la date actuelle qui te permet de calculer la quantité de ressource en temps réel. Bien sur tu n'a pas besoin de sauver toutes les minutes, d'ailleurs tu n'a quasiment pas besoin de sauver, il te suffit d'avoir T0 et la quantité de ressource à T0, et l'incrément, pour pouvoir calculer les ressources à T1.

                                                  Et tu fera une maj par exemple dès qu'il y a une dépense: si à T1 tu dépense X ressources, tu calcule le nouveau stock à T1 et tu enlève X, et tu maj le nouveau stock et tu remplace T0 par T1. Voila l'idée :) 

                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    10 juillet 2019 à 21:07:15

                                                    Ok alors voyons voir si j'ai bien capté ton concept... (corrige moi si je me trompe):

                                                    Dans ma configuration actuelle il me faut donc:

                                                    - Ajouter un attribut "dateRepère" à ma class MotherPlanet(qui contient mes ressources).

                                                    - Ensuite, je compare mes 2 dates... "dateRepère" et time() ce qui me donne le temps écoulé depuis la dernière maj.

                                                    - je fais mon petit calcul: "ressource1" = "ressource1" + ("prod" X "temps écoulé") . ça c'est ok!

                                                    Mais cette comparaison (les 2 dates), je dois la faire quand? et à quelle fréquence?

                                                    Si Je veux que le gain de ressources soit en session dès l'incrémentation pour que ce même gain soit dispo immédiatement,  cela signifie que je dois exécuter une action (maj des ressources session) toutes les minutes (par exemple si je fais un gain/min) ? C'est encore un peu flou....

                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      10 juillet 2019 à 22:18:36

                                                      Tu peux faire ton calcul sur chaque page, ça ne pose pas de problème du moment que tu a mis en session les variables il n'y a plus besoin de requêtes. Tu calcule et affiche tes ressources en temps réel :) et il n'y a aucun besoin de mettre ce gain en bdd en temps réel. En fait, il ne faut mettre à jour les ressources en bdd que lorsqu'il y a une dépense, un gain ou une perte spécifique. Et dans ce cas, tu refais le calcul normal et tu ajoute cette dépense exceptionnelle, et la seulement tu remet en bdd le nouveau résultat et la nouvelle date.

                                                      La seule difficulté : si, pendant que le joueur est connecté, une maj des ressources intervient pour une cause extérieure (genre une attaque ennemie) il faut forcer la maj des infos de session du joueur.

                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        10 juillet 2019 à 23:55:32

                                                        OK ça marche! Merci!

                                                        C'est bien ce qui me semblait... il faut appeler ma "maj de session" à chaque action... je vais mettre ça dans mon back controller.

                                                        C'est cet élément qui me manquait pour comprendre l'ensemble du principe. Maintenant il n'y a plus qu'à bosser!

                                                        Il ne me manquera plus qu'à me pencher sur les interactions entre joueurs (je reviendrai ici si j'en ai besoin... ) et j'aurais mon premier modèle.... (j'en ai pour un moment mais ... plus de cassage de tête...)

                                                        Merci infiniment Pifou pour ces explications claires et précises , tu viens de me débloquer :) .

                                                        -
                                                        Edité par KévinThais 10 juillet 2019 à 23:57:21

                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          16 septembre 2019 à 21:20:11

                                                          Bonjour à tous!

                                                          Et me revoilà pour une question simple mais je n'ai pas trouvé de réponse sur Google alors je compte, encore une fois, sur une âme charitable qui serait capable de me venir en aide svp.

                                                          Tout d'abord, merci encore Pifou25 pour tes conseils car ils m'ont été très utiles... Tout s'est passé comme sur des roulettes!

                                                          J'en suis à la partie combat et j'ai un doute sur la propreté du code que j'utilise . C'est fonctionnel, ça évite beaucoup de duplications mais je n'ai trouvé nulle part sur le Net quelqu'un qui validait ce script en tant que "script propre" si je puis dire...

                                                          J'appelle une méthode avec une variable comme ci-dessous:

                                                          Admettons que j'ai une class "Test" avec ses getters ($Test->atribut()) et setters ($Test->setAtribut()) pour ses attributs qui sont $test_1, $test_2 et $test_3.

                                                          Ce que je cherche à faire c'est appeler telle méthode en fonction des valeurs que peut prendre une variable:

                                                          $variable = 'test_1'; // ou 'test_2' ou encore 'test_3'... Sa valeur varie
                                                          
                                                          $getMethod = $variable; // $Test->attribut()
                                                          $setMethod = 'set' . ucfirst($variable); // $Test->SetAttribut()
                                                          
                                                          // get:
                                                          $Test->$getMethod();
                                                          
                                                          // set:
                                                          $Test->$setMethod();

                                                          Alors? Est-ce du code propre ou pas?


                                                          Et même question pour les noms de variables:

                                                          $partie_1 = 'truc';
                                                          $partie_2 = 'much';
                                                          
                                                          ${$partie_1 + $partie_2} = 'chose';
                                                          // Ce qui donnerai:
                                                          
                                                          $trucmuch = 'chose';
                                                          
                                                          

                                                          Merci d'avance!

                                                          -
                                                          Edité par KévinThais 16 septembre 2019 à 21:28:48

                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            16 septembre 2019 à 21:33:02

                                                            excuse moi Kévin de venir de la sorte poster sur ton propre post mais je ne comprend pas tout

                                                            Moonkey3d dis qu'il ne serais pas possible de créer un jeu en couplant javascript php mysql si j'ai bien compris

                                                            si c'est le cas je comprend pas pourquoi cela ne serais pas possible...

                                                            tout est possible même en flash sauf que flash est périmé lol:p

                                                            • Partager sur Facebook
                                                            • Partager sur Twitter

                                                            Pas d'aide concernant le code par MP ni par mail, le forum est là pour ça

                                                              16 septembre 2019 à 21:37:52

                                                              Salut Fred,

                                                              Moonkey3d n'a pas dit que ce ne serait pas possible il à juste dit que, selon lui, ce n'était pas forcément une architecture appropriée. (POO PHP et MySql)

                                                              • Partager sur Facebook
                                                              • Partager sur Twitter

                                                              Création d'un jeu par navigateur

                                                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                              • Editeur
                                                              • Markdown