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.
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.
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?
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.
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).
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.
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.
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.
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)?
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.
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?
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?
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
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?
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é.
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
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"...
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
J'ai une class MotherPlanetavec , 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 RessourceBuildingavec 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 RessourceBuildingEvolutionavec 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 RessourceBuildingEvolutionla mine correspondante, le level suivant, le coût et le temps, je déduis le coût d'évolution aux ressources de MotherPlanetet 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...
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 :)
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....
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.
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 .
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
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)
× 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.
Keep It Simple Stupid - SF4 conf Swift - Cours 1/4 SF4 - Exceptions PDO - Formes Normales
Keep It Simple Stupid - SF4 conf Swift - Cours 1/4 SF4 - Exceptions PDO - Formes Normales
Keep It Simple Stupid - SF4 conf Swift - Cours 1/4 SF4 - Exceptions PDO - Formes Normales
Keep It Simple Stupid - SF4 conf Swift - Cours 1/4 SF4 - Exceptions PDO - Formes Normales
Pas d'aide concernant le code par MP ni par mail, le forum est là pour ça