Mise à jour le 12/11/06 : modif pour avoir toujours la dernière carte générée à l'écran et pas une vielle qui se trouverai dans le cache du navigateur. Pour ca on nomme chaque image de carte avec le 'time' du passage du cron, afin d'avoir des noms d'image uniques à chaque mise à jour. Et bien sur on vide le repertoire des cartes avant à chaque fois pour pas accumuler 50.000 images inutiles.
------
Le but de ce script est de créer un fichier, qui appelé par un cron, générera toutes les cartes de l'univers de jeu, avec, dans le cas précis présenté, les 'domaines' découverts et les 'domaines' inconnus', le relief et les routes pour chacun des domaines connus, pour chaque région.
Le cahier des charges :
Pour avoir un script le plus léger et le plus rapide possible (afin de ne pas avoir un timeout du cron qui ne générerait pas toutes les cartes des régions) on ne va chercher dans la base de données les infos des régions pour lesquelles on est sur qu'au moins un domaine a été découvert.
Les autres régions, les cartes donc vides, seront évitées (bien qu'une carte vide soit généré).
Voici déjà un aperçu du résultat, la carte générée pour 1 région :
La région de l'Agora fait 15*15 soit 255 domaines.
L'univers :
Dans le cadre de ce script, l'univers de jeu est divisé en pays/région/domaine. Cela aurait pu être galaxie/systeme/planete ou n'importe quoi d'autre...
Pré-requis dans l'exemple précis de ce tuto :
Les pays et les régions sont définis à la base par le créateur du jeu, mais les domaines sont générées automtiquement lorsque qu'un joueur y passe ou l'aperçoit (domaines qui s'affichent autour du domaine où se trouve le joueur, sur la page situation, qui sont donc générés mais pas marqués comme 'connu' tant qu'un joueur n'y passe pas vraiment).
nous, on veut donc générer les cartes de toutes les régions, avec seulement les domaines CONNUS, et marqués comme tel dans la base.
Voici la structure des bases de données (simplifiées pour ce tuto) dont on a besoin :
Base "xp_conf" :
Base contenant les infos de configuration générale du jeu. Elle contient des données clef/valeur dans lesquelles on peut stocker ce que l'on veut.
Ici on va y mettre l'heure du dernier passage du cron, pour informer par exemple les joueurs de la dernière mise à jour.
Base "xp_region" :
Cette base contient les données pour chaque région :
- id : vous savez ce que c'est
- nom : le nom de la région...
- id_pays : l'id du pays dont cette région dépends (ici on ne se servira pas de cette info puisqu'on génère les cartes pour toutes les régions, peu importe le pays.
- max_x : la largeur de la région, soit le nombre de domaine pour la largeur
- max_y : la hauteur de la région, soit le nombre de domaine pour la hauteur
Base "xp_dom" :
Cette base contient les données pour chaque domaine :
- id : vous savez ce que c'est
- p : id du pays
- r : id de la région
- x : position X de ce domaine dans la région mère
- y : position X de ce domaine dans la région mère
- relief : type de relief de ce domaine
- route : type de route de ce domaine
- connu : si ce domaine est connu (1 si le domaine a été visité au moins une fois, 0 si il a juste été apercu)
Images :
Voici un exemple des graphismes que nous allons utiliser, elles font toutes 100px * 100px.
Le nom des images n'est pas stocké dans la base (inutile à mon gout) mais dans un repertoire, nommés par numéro. Dans la base, pour la valeur de relief 5 on saaura qu'il faudra afficher l'image $relief.'.gif'
PS : merci de ne pas se moquer de mes images... C'est du provisoir :$
Le relief :
1.gif : desert :
2.gif : plaine :
3.gif : forêt :
Etc.
Les routes (gifs transparents) :
0.gif : aucune route :
1.gif : verticale :
3.gif : virage bas/droite :
etc.
Classe 'region' :
Enfin, j'utilise bcp les classes pour simplifier le travail, et éviter de recopier 50 fois le même code.
Dans notre fichier cron, nous utiliserons la classe 'region' qui reprends les valeur de la base region, ainsi que des fonctions pour sauvegarder/insérer/supprimer dont on ne se servira pas ici puisque dans ce tuto on ira chercher que les valeurs 'max_x', 'max_y' et 'nom' des regions, mais je donne la classe entière (bien que simplifiée).
Vous trouverez la classe 'region' tout à la fin du tuto.
Fichier "cron.php" :
Bon, les prérequis sont en place, la suite va être très simple maintenant.
Quand on programme une tâche cron, on doit indiquer le fichier qui sera exécuté, par exemple toutes les heures.
Créons donc le fichier "cron.php" ! :wow:
J'essai de commenter un maximum le code pour que tout soit clair.
On commence par les include/require dont on a besoin. Perso, j'inclu une fichier "fonctions.inc.php" qui contient mes fonctions de connexion et deconnexion à la base de données (connecter() et fermer()).
------
Le but de ce script est de créer un fichier, qui appelé par un cron, générera toutes les cartes de l'univers de jeu, avec, dans le cas précis présenté, les 'domaines' découverts et les 'domaines' inconnus', le relief et les routes pour chacun des domaines connus, pour chaque région.
Le cahier des charges :
Pour avoir un script le plus léger et le plus rapide possible (afin de ne pas avoir un timeout du cron qui ne générerait pas toutes les cartes des régions) on ne va chercher dans la base de données les infos des régions pour lesquelles on est sur qu'au moins un domaine a été découvert.
Les autres régions, les cartes donc vides, seront évitées (bien qu'une carte vide soit généré).
Voici déjà un aperçu du résultat, la carte générée pour 1 région :
La région de l'Agora fait 15*15 soit 255 domaines.
L'univers :
Dans le cadre de ce script, l'univers de jeu est divisé en pays/région/domaine. Cela aurait pu être galaxie/systeme/planete ou n'importe quoi d'autre...
Pré-requis dans l'exemple précis de ce tuto :
Les pays et les régions sont définis à la base par le créateur du jeu, mais les domaines sont générées automtiquement lorsque qu'un joueur y passe ou l'aperçoit (domaines qui s'affichent autour du domaine où se trouve le joueur, sur la page situation, qui sont donc générés mais pas marqués comme 'connu' tant qu'un joueur n'y passe pas vraiment).
nous, on veut donc générer les cartes de toutes les régions, avec seulement les domaines CONNUS, et marqués comme tel dans la base.
Voici la structure des bases de données (simplifiées pour ce tuto) dont on a besoin :
Base "xp_conf" :
Base contenant les infos de configuration générale du jeu. Elle contient des données clef/valeur dans lesquelles on peut stocker ce que l'on veut.
Ici on va y mettre l'heure du dernier passage du cron, pour informer par exemple les joueurs de la dernière mise à jour.
Code :
--
-- Structure de la table `xp_conf`
--
CREATE TABLE xp_conf (
id int(11) unsigned NOT NULL auto_increment,
clef varchar(30) collate latin1_general_ci NOT NULL,
valeur varchar(255) collate latin1_general_ci NOT NULL,
)
Base "xp_region" :
Cette base contient les données pour chaque région :
- id : vous savez ce que c'est
- nom : le nom de la région...
- id_pays : l'id du pays dont cette région dépends (ici on ne se servira pas de cette info puisqu'on génère les cartes pour toutes les régions, peu importe le pays.
- max_x : la largeur de la région, soit le nombre de domaine pour la largeur
- max_y : la hauteur de la région, soit le nombre de domaine pour la hauteur
Code :
--
-- Structure de la table `xp_region`
--
CREATE TABLE `xp_region` (
`id` int(11) unsigned NOT NULL auto_increment,
`nom` varchar(30) collate latin1_general_ci NOT NULL,
`id_pays` int(11) unsigned NOT NULL,
`max_x` tinyint(3) unsigned NOT NULL,
`max_y` tinyint(3) unsigned NOT NULL,
)
Base "xp_dom" :
Cette base contient les données pour chaque domaine :
- id : vous savez ce que c'est
- p : id du pays
- r : id de la région
- x : position X de ce domaine dans la région mère
- y : position X de ce domaine dans la région mère
- relief : type de relief de ce domaine
- route : type de route de ce domaine
- connu : si ce domaine est connu (1 si le domaine a été visité au moins une fois, 0 si il a juste été apercu)
Code :
--
-- Structure de la table `xp_dom`
--
CREATE TABLE `xp_dom` (
`id` int(11) unsigned NOT NULL auto_increment,
`p` int(11) unsigned NOT NULL,
`r` int(11) unsigned NOT NULL,
`x` tinyint(3) unsigned NOT NULL,
`y` tinyint(3) unsigned NOT NULL,
`relief` tinyint(2) unsigned NOT NULL,
`route` tinyint(1) unsigned NOT NULL,
`connu` tinyint(1) unsigned NOT NULL,
)
Images :
Voici un exemple des graphismes que nous allons utiliser, elles font toutes 100px * 100px.
Le nom des images n'est pas stocké dans la base (inutile à mon gout) mais dans un repertoire, nommés par numéro. Dans la base, pour la valeur de relief 5 on saaura qu'il faudra afficher l'image $relief.'.gif'
PS : merci de ne pas se moquer de mes images... C'est du provisoir :$
Le relief :
1.gif : desert :
2.gif : plaine :
3.gif : forêt :
Etc.
Les routes (gifs transparents) :
0.gif : aucune route :
1.gif : verticale :
3.gif : virage bas/droite :
etc.
Classe 'region' :
Enfin, j'utilise bcp les classes pour simplifier le travail, et éviter de recopier 50 fois le même code.
Dans notre fichier cron, nous utiliserons la classe 'region' qui reprends les valeur de la base region, ainsi que des fonctions pour sauvegarder/insérer/supprimer dont on ne se servira pas ici puisque dans ce tuto on ira chercher que les valeurs 'max_x', 'max_y' et 'nom' des regions, mais je donne la classe entière (bien que simplifiée).
Vous trouverez la classe 'region' tout à la fin du tuto.
Fichier "cron.php" :
Bon, les prérequis sont en place, la suite va être très simple maintenant.
Quand on programme une tâche cron, on doit indiquer le fichier qui sera exécuté, par exemple toutes les heures.
Créons donc le fichier "cron.php" ! :wow:
J'essai de commenter un maximum le code pour que tout soit clair.
On commence par les include/require dont on a besoin. Perso, j'inclu une fichier "fonctions.inc.php" qui contient mes fonctions de connexion et deconnexion à la base de données (connecter() et fermer()).
Code PHP :
<?
// ***** taches CRON *****
// --- includes générals
require_once("inc/fonctions.inc.php");
Ensuite, pour préparer le travail, on va créer 2 tableaux contenant les chemins vers nos images de relief et de route :
Code PHP :
<?php
// --- Création des tableaux d'images relief/route ---
// tableau des 12 images de relief :
for ($i=0;$i<13;$i++) {
$rfic='img/relief/'.$i.'.gif';
$relief_img[$i] = imagecreatefromgif($rfic);
}
// tableau des 7 images de route :
for ($i=0;$i<8;$i++) {
$rfic='img/route/route_'.$i.'.gif';
$route_img[$i] = imagecreatefromgif($rfic);
}