IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Conseil sur création de jeu php/MySQL


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut Conseil sur création de jeu php/MySQL
    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 (http://img99.imageshack.us/img99/4555/gamesi.png)

    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
     
    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. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    je n'ai pas trouvé comment lancer automatiquement une classe lors d'un boot serveur
    tu fais visiblement une confusion : une class est un élément de programmation, elle est donc interne au code PHP.
    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.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut
    Merci de ta réponse

    Citation Envoyé par sabotage Voir le message
    En fait ma classe provient de là (point 6). En fait, pour ce qui est de la planification d'événements, je pense pas que la fréquence d'exécution des requetes soit programmable en fonction d'un valeur d'un champs date d'une table MySQL (j'ai un peu planché dessus sans trouver de réponse) ?

    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 ) mais je pense pas qe cela soit possible en utilisant une méthode "full MySQL"

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    En fait ma classe provient de là (point 6).
    ca parle de classe ?

    je pense pas que la fréquence d'exécution des requetes soit programmable en fonction d'un valeur d'un champs date d'une table MySQL
    L'idée est de regarder à intervalle régulier s'il y a des actions à réaliser ou non.
    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.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut
    Citation Envoyé par sabotage Voir le message

    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.
    Pour cet exemple là, effectivement pas besoin d'avoir une précision d'horloger suisse mais si on considère l'événement d'une attaque lancée à 14h32m18s et arrivant à 16h10m39s il faut que le joueur attaqué s'il se connecte dans l'absolu à 16h10m40s ai perdu ses unités et ses ressources...

    Citation Envoyé par sabotage Voir le message
    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.
    Totalement d'accord pour la "construction" de villageois et de batiment (encore que cela depend si je mets au point une liste de construction pour les batiments => max 2 batiments constructibles en meme temps). Par contre, pour les attaques ton raisonnement ne peut pas marcher puisqu'il impacte un autre joueur qui lui peut très bien etre connecté lors de son attaque sur moi qui suis absent par ex. Merci de tes réponses en tout cas

  6. #6
    Membre confirmé
    Inscrit en
    Janvier 2010
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 34
    Par défaut
    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. #7
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut
    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. #8
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Par contre, pour les attaques ton raisonnement ne peut pas marcher puisqu'il impacte un autre joueur qui lui peut très bien etre connecté lors de son attaque sur moi qui suis absent par ex
    Non.
    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.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

Discussions similaires

  1. [AC-2007] Conseil sur création de tables
    Par manusp dans le forum Modélisation
    Réponses: 9
    Dernier message: 17/01/2011, 17h37
  2. [Mission/Télétravail] Création Site Web php/Mysql
    Par med_anis_dk dans le forum Demandes
    Réponses: 0
    Dernier message: 04/07/2010, 01h06
  3. [MySQL] Aide à la création site en php mysql
    Par nbjr1858 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 03/06/2007, 16h10
  4. conseil sur migration de access vers mysql
    Par jarod71 dans le forum Migration
    Réponses: 1
    Dernier message: 21/01/2007, 20h44
  5. xml - création xml via php(mysql) - manque données
    Par Raiders dans le forum XQUERY/SGBD
    Réponses: 5
    Dernier message: 23/03/2006, 18h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo