|
Publicité | |||||||||||||||||||||||
|
|
#1 |
|
Membre éprouvé
![]() Date d'inscription: juin 2007
Localisation: Bordeaux
Messages: 408
|
Bonjour,
je suis en train de créer un jeu en php/MySQL (style ogame pour les connaisseurs) mais se déroulant au moyen age La charte graphique est établie ainsi que le le code de "bas niveau" mais là je rentre dans le dur ![]() En fait, j'ai créé une table events de la forme suivante : Code sql :
CREATE TABLE `events` ( `id_event` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, `id_joueur` int(10) UNSIGNED NOT NULL, `type_event` varchar(2) NOT NULL, `villagois` int(10) UNSIGNED NOT NULL, `date_event` int(10) UNSIGNED NOT NULL, PRIMARY KEY (`id_event`), KEY `id_joueur` (`id_joueur`), CONSTRAINT `events_ibfk_1` FOREIGN KEY (`id_joueur`) REFERENCES `joueurs` (`id_joueur`) ON DELETE CASCADE ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1; Cette table est destinée à recevoir des événements futurs comme la création d'un villageois qui n'interviendra que 2h après sa création par exemple ou alors l'attaque d'un joueur par un autre joueur n'intervenant que 5466, 3750 etc...secondes plus tard après le lancement de l'attaque. La problématique étant d'exécuter la requete future à la seconde près lors de l'événement (notamment l'attaque). Pour l'instant, je compte m'orienter vers la création d'une classe de ce type : Code php :
set_time_limit(0); ignore_user_abort(1); class Scheduleur{ function Scheduleur(){ while(1) { //Mon code de scan table + execution requete sleep(/*un parametre a determiner en fonction du prochain evenement */); } } } Cette classe marchera sans trop de problème je pense mais a un inconvient majeur : si le serveur reboot il faut relancer cette classe et je n'ai pas trouvé comment lancer automatiquement une classe lors d'un boot serveur (Apache). Mis à part un scan régulier de ma table evenements, je ne vois pas trop comment executer des requetes frequemment et à intervalles de temps variables... Comment feriez vous de votre coté ? Merci de vos remarques/suggestions |
|
|
|
|
|
#2 | |
![]() Date d'inscription: juillet 2005
Messages: 10 075
|
Citation:
Ce que tu lances c'est un script PHP ; ce qu'il contient ne change pas la manière dont tu le lances. Il n'y a d'ailleurs pas plus d'interêt a utiliser une classe dans ton "scheduler" qu'ailleurs dans ton code. Pour les solutions : http://matthieu.developpez.com/execution_periodique/ On peut aussi citer, si ton traitement ne consiste qu'en des actions SQL, que certains SGDB (au moins mysql5.1) permettent de planifier des évenements. |
|
|
|
|
|
|
#3 | |
|
Membre éprouvé
![]() Date d'inscription: juin 2007
Localisation: Bordeaux
Messages: 408
|
Merci de ta réponse
Citation:
En effet, ce serait probablement la meilleure solution (qui n'obligerait pas à relancer un script durant la nuit par exemple suite à un reboot du serveur de mon hebergeur |
|
|
|
|
|
|
#4 | ||
![]() Date d'inscription: juillet 2005
Messages: 10 075
|
Citation:
Citation:
Si tu as la main sur le serveur, utiliser des crons est une solution précise et simple. Si tu n'as pas la main sur le serveur, tu ne pourras pas faire grand chose : il est peu probable que tu puisses lancer un script illimité. Après on peut aussi considérer la necessité de réaliser les actions en temps réel. Imaginons que je lance la "construction d'un villageois" qui devra se terminer dans 2h ; imaginons qu'aucun joueur ne vienne sur le jeu pendant une semaine : mon villageois aura été créé à la seconde précise ... pour rien. Imaginons maintenant que je ne déclenche mes traitements que quand j'ai besoin de savoir ou ils en sont. Je lance ma construction maintenant. Une heure après un joueur vient dans ma ville : le script regarde s'il y a des actions en cours dans cette ville : un villageois commencé à 16h+2h ... il est 17h, il n'y a rien à faire. Deux heures après un joueur vient dans ma ville : le script regarde s'il y a des actions en cours dans cette ville : un villageois commencé à 16h+2h ... il est 19h, c'est fini ; il mets a jour la ville avec +1 villageois et il supprime l'évènement. |
||
|
|
|
|
|
#5 | ||
|
Membre éprouvé
![]() Date d'inscription: juin 2007
Localisation: Bordeaux
Messages: 408
|
Citation:
Citation:
|
||
|
|
|
|
|
#6 |
|
Futur Membre du Club
![]() Nom : Nours Moreau
Date d'inscription: janvier 2010
Messages: 32
|
Ouais, pour rejoindre l'idée de Sabotage, dans cestyle nous avions monté un début de Jeu dans le style de celui sur lequel tu semble bosser et on a monter des actions imbriquées assez complexe par cet intermédiaire !...
tu vas me dire si je me trompe, mais ce qui te gènes le plus avec cette méthode, c'est pas le fait de savoir si le villageois est créer, mais plutôt le volume des ressources présentes à l'instant ou un adversaire visite ton village, ressources dépendantes du nombre de villageois présents avec un rapport Prod/Heure ... Une fois entrée les 200 paramètres qui définissent toutes les actions possibles et inimaginable, la gestion des actions à venir, avec un script qui s'exécute toutes les secondes semble être la meilleur solution !... mais ça prend Vite Beaucoup de ressources serveur. Nous avons opté pour une jolie classe recherchant à tous les Joueurs imbriqués lorsqu'un utilisateur se connecte ... c'est un peu lourd si il y a une vingtaine d'utilisateurs qui s'échange des données régulièrement ... et qu'aucun ne se connecte durant 15 jours ... mais sinon, c'est assez pratique ! BonCourage |
|
|
|
|
|
#7 |
|
Membre éprouvé
![]() Date d'inscription: juin 2007
Localisation: Bordeaux
Messages: 408
|
Merci
Oui en effet, c'est un peu plus complexe que ce qu'il n'y parait lorsque l'on se plonge dans le code mais ca avance Je vais méditer sur vos remarques Thx ! |
|
|
|
|
|
#8 | |
![]() Date d'inscription: juillet 2005
Messages: 10 075
|
Citation:
Tu remarqueras que je parle bien "d'un joueur" : que ce soit moi, un allié, un ennemi j'ai besoin de lui montrer l'état réel de ma ville ; je produis donc à la demande l'état réel. Il lance une attaque, le script commence par regarder si des evenements sont terminés. Le script lancé toute les secondes non seulement est lourd mais en plus, je pense, casse gueule : que se passe t'il s'il met plus d'une seconde à s'executer. |
|
|
|
|
|
|
#9 | |
|
Membre éprouvé
![]() Date d'inscription: juin 2007
Localisation: Bordeaux
Messages: 408
|
Citation:
Non pas toutes les secondes, je voyais ca de cette manière : vu que le délai le plus court d'un événement sera un espionnage d'un joueur vers un autre joueur (disons 90s) le script sera lancé toutes les 90s et scannera alors la table des evenements. S'il trouve une échéance d'événement arrivant à terme avant 90s alors il se relance entre 2. Par exemple sur ma table events (id_event, id_joueur, type_event, date_event_start, date_event_end) sin j'ai les enregistrements suivants : 1 1 ES 1265400000 1265400090 2 1 ES 1265400005 1265400095 3 2 CB 1265400011 1265403057 4 3 DT 1265400500 1265405005 (ou ES=espionnage, CB=construction batiment, DT=dev technologie) alors si la script scanne à 1265399990 aucun evenement fini à moins de 90s donc il rescanne 90s plus tard (1265400080) et un evenement se fini dans 10s donc il scanne 10s plus tard etc... |
|
|
|
|
|
|
#10 | |
![]() Date d'inscription: juillet 2005
Messages: 10 075
|
Citation:
Le script se lance à 14:00:00, 14:01:30, 14:03:00, etc. Si je lance mon espionnage à 14:01:00, il n'aura lieu qu'a 14:03:00 au lieu de 14:02:30. |
|
|
|
|
|
|
#11 |
|
Membre éprouvé
![]() Date d'inscription: juin 2007
Localisation: Bordeaux
Messages: 408
|
Non tu as mal compris le but de mon script. Ce script sert uniquement à réaliser des événement (requetes) qui sont DEJA dans ma table events. Lorsqu'un joueur lance un espionnage, il est immédiatement stocké dans ma table events qui elle est scannée par intervalle de temps de 1s à 90s max en fonction des événements déjà insérés
|
|
|
|
|
|
#12 |
![]() Date d'inscription: juillet 2005
Messages: 10 075
|
Ba c'est bien ce que je dis : si le joueur vérifie à 14:02:40 son evenement "espionnage demarré à 14:01:00 durée 90s" ne sera toujours pas traité.
|
|
|
|
|
|
#13 | ||
|
Membre éprouvé
![]() Date d'inscription: juin 2007
Localisation: Bordeaux
Messages: 408
|
Citation:
Citation:
|
||
|
|
|
|
|
#14 |
![]() Date d'inscription: juillet 2005
Messages: 10 075
|
ah d'accord pardon je n'avais pas bien lu.
si tu pars sur du temps réel, ca peut etre effectivement une manière intelligente de gérer les cycles de traitement. |
|
|
|
|
|
#15 |
|
Membre éprouvé
![]() Date d'inscription: juin 2007
Localisation: Bordeaux
Messages: 408
|
Rien n'est encore totalement décidé sur ce point là, mon but initial était de faire une sorte de procédure stockée sql qui s'execute dynamiquement quand un evenement arrive à échéance mais je pense pas que cela soit possible (j'avoue que mes comptences en proc stockées MySQL sont proches du néant...)
|
|
|
|
|
|
#16 |
![]() Date d'inscription: juillet 2005
Messages: 10 075
|
Une "procédure stockée c'est juste une requête pré-enregistrée.
Si on parle de mysql : Un "trigger" c'est une action qui est automatiquement lancée lorsqu'un evenement se produit ... mais les evenements sont des INSERT, UPDATE ou DELETE. Un "event" c'est une action programmée dans le temps. |
|
|
|
|
|
#17 |
|
Membre éprouvé
![]() Date d'inscription: juin 2007
Localisation: Bordeaux
Messages: 408
|
Oui je voulais parler de trigger
Mais dans tous les cas, je n'ai pas trouvé de facon d'exécuter un trigger ou autre à une fréquence variable et encore moins à une fréquence variable récupérée d'une table
|
|
|
|
|
|
#18 |
|
Futur Membre du Club
![]() Nom : Nours Moreau
Date d'inscription: janvier 2010
Messages: 32
|
Tout dépends bien de la logique que tu souhaites mettre en place :
1. la solution que tu envisage (à ce que j'en ai compris^^): un script qui se lance à chaque évènement dans le temps ... pour tous les joueurs => 2000 Joueurs ... actions à lancer "par moment" toutes les secondes => durée d'exécution du script, supérieur à une seconde => crash 2. un script qui se lance en fonction des actions liées à l'utilisateur chargeant le script => c'est l'utilisateur qui supporte le temps de chargement => pas de perte réèlles de donnée Soucy : Si un second utilisateur lié appele la page avant la fin du script lié au premier utilisateur ne soit terminé => envisager une vérif "encours d'update" ... A mon avis la seconde solution est la plus adaptée pour ce genre de process ... et c'est pour ça que nous l'avions envisagée, maintenant, je peux me tromper |
|
|
|
|
|
#19 | ||
|
Membre éprouvé
![]() Date d'inscription: juin 2007
Localisation: Bordeaux
Messages: 408
|
Citation:
Citation:
|
||
|
|
|
|
|
#20 |
|
Futur Membre du Club
![]() Nom : Nours Moreau
Date d'inscription: janvier 2010
Messages: 32
|
le principe qu'on a mis en place est qu'à chaque opérations d'un joueur, on fait une recherche sur son Historique et on effectu toutes les opérations lié à cet Historique.
Prenons un cas précis : Je me connecte, Mon village à été attaqué durant mon absence, mais l'attaquant ne s'était pas connecté depuis, donc je lance le script (vu que c'est lié à l'historique de mon village) avant de calculer mes éventuelles pertes, je vérifi l'attaquant et constate que sa troupe à est tombée dnas un piège(embuscade) lié à un troisième joueur (lui non plus ne ct pas connecté) ... Pour connetre la troupe m'attaquant, je dois donc effectuer le calcul des pertes sur cette embuscade (précédente à l'attaque de mon village) Je met donc à jour les joueurs 2 et 3 avant de calculer l'attaque subie par mon village, c'est fait, l'attaquant à 2 unités survivantes et j'ai calculer mes pertes ... J'ai mis à jour les productions précédents l'offensive, celles perdues durant l'attaque (pillage), mis à Jour mon volume d'unité présent dans le village, mes nouvelles productions et suit pret à passer à l'evennement suivant J'ai une troupe qui est rentrée de pillage (avant ma connexion, toujours), j'effectue la mise à jour du village attaqué à l'instant de l'attaque, calcule la battaille mes pertes et butins met à jour le profil du 4eme Joueur Jusqu'à la fin de la battaille; Puis je calcul mes ressources précédent leur arrivée, les troupes inactives, ... mes nouvelles vitesses de productions, ... Et depuis, plus rien !... je rentre donc dans l'historique la mise à jour du stock à cet instant T ... 2 min après, le joueur 2 se connecte, je ne fais pas le calcule de l'attaque, il a été fait et validé par le joueur 1, par contre, je valid les prod jusqu'au retour des troupes (les 2 survivants), et celle précédent ma connexion ! met à jour les stocks Joueur 2 à l'instant T ... Tout ceci pour dire, que le joueur qui se connecte lance le script permettant la mise à jour des données de tous les Joueurs lié à celui qui ce connecte (dans l'ordre de l'historique) ... puis termine la mise à Jour du joueur jusqu'à l'instant T ... ensuite, tant que le joueur est connecté, les mises à jour sont faites en fonction des infos du Joueur seul ... à chaque mise à jour on informe l'instant de la mise à Jour, ... et c'est tout ! Il est tout a fait possible, avec ce système qu'un Joueur mette à jour Tout le serveur (je plein l'internaute en charge de lancer le script ^^) ... tout comme il est possible qu'un internaute arrive et découvre qu'il à été mêlé à une guerre mondiale, mais le serveur à déjà été mis à Jour donc il ne se rend pas compte du lancement du script !.... Voilà la trame que l'on avait mis en place !... une jolie petite classe avec 3/4 tables ... rien de bien méchant, mais la conception n'a pas été bien simple ^^ @++ |
|
|
|
|
|
![]() |
||
Conseil sur création de jeu php/MySQL
|
||
| Outils de la discussion | |
|
|