JeuWeb - Crée ton jeu par navigateur

Version complète : Où mettre les variables de configuration
Vous consultez actuellement la version basse qualité d’un document. Voir la version complète avec le bon formatage.
Où mettre les variables de configuration

Souvent dans un jeu, on peut vouloir stocker des éléments de configuration constants. Les identifiants d'accès à la base de données, le nombre de joueurs maximum par univers, le nombre d'invitation que le joueur peut envoyer à des amis, etc.

Passons en revue quelques moyens de stocker ces informations ainsi que les avantages et inconvénients de chacun.

Les exemples de codes sont données pour PHP.

Tableau déclaré à même le code source

Cette solution consiste à créer directement un tableau associatif dans le code source de l'application.

$configuration = array(
'players_per_universe' => 50,
'supported_languages' => array('EN', 'FR'),
'database' => array(
'username' => 'root',
'password' => 'jambon fumé',
'host' => 'localhost',
'database' => 'my_game'
)
);

Avantages
  • Cette solution est la plus performante ;

  • C'est la solution la plus simple ;


Inconvénients
  • C'est sale : il y a des risques de conflits de nommage si une variable $configuration existe ;

  • C'est peu flexible : si vous utilisez des scripts externes(des tâches automatisées, par exemple), elles ne pourront pas utiliser ces éléments.

  • Il faut modifier le code source pour reporter un changement, il est difficile de faire une interface pour gérer ça plus simplement.


Tableau retourné par un fichier inclus

Cela consiste à retourner un tableau associatif depuis un script PHP inclus.

Fichier configuration.include.php :

return array(
'players_per_universe' => 50,
'supported_languages' => array('EN', 'FR'),
'database' => array(
'username' => 'root',
'password' => 'jambon fumé',
'host' => 'localhost',
'database' => 'my_game'
)
);

Dans le code source d'application, on peut écrire :

$configuration = include('configuration.include.php');

Avantages
  • Cette solution est très performante ;

  • Contrairement à la solution précédente, on maîtrise le nommage de la variable, on diminue le risque de conflit ;

  • On peut utiliser le même fichier de configuration pour des scripts externes en PHP ;


Inconvénients
  • Les scripts externes qui incluent ce fichier doivent être des scripts PHP ;

  • Il faut modifier le code source pour reporter un changement, il est difficile de faire une interface pour gérer ça plus simplement.


Utiliser la base de données

Cette solution consiste à créer une table (par exemple “configuration_items”) contenant trois colonnes : un espace de nom, une clé et une valeur.

Avantages
  • Simple à utiliser ;

  • Il est facile de créer une interface pour administrer ces variables ;


Inconvénients
  • Cette solution est moins performante dans le cas où la connexion à la base (coûteuse en ressources) n'est ouverte que pour récupérer des éléments de configuration ;

  • On ne peut pas y stocker les informations de connexion à la base de données puisqu'il est justement nécessaire de se connecter pour récupérer les éléments de configuration ;

  • On ne peut stocker que des variables scalaires en guise de valeurs.


Remarques

Cette solution est utile dans un script amené à être utilisé par d'autres personnes qui n'ont pas forcément de compétences en informatique (pour un CMS, par exemple).

Utiliser un fichier INI

Cette solution consiste à créer un fichier INI (http://fr.wikipedia.org/wiki/Fichier_INI). Ces fichiers sont de simples fichiers texte écrit en respectant une syntaxe particulière.

Fichier configuration.ini :

[global]
players_per_universe = 50
supported_languages[] = "EN"
supported_languages[] = "FR"
 
[database]
username = "root"
password = "jambon fumé"
host = "localhost"
database = "my_game"

Dans le code source PHP :

// Ce fichier ne doit surtout pas être présent dans le dossier public_html/ sous peine d'être accessible à tous ! 
// Le deuxième argument permet de retourner un tableau à plusieurs dimensions.
$configuration = parse_ini_file('../configuration.ini', true);

Avantages
  • Cette solution est performante car la fonction d'interprétation est native à PHP ;

  • On maîtrise le nommage (pas de conflit de noms à craindre) ;

  • Ce fichier est lisible depuis n'importe quel langage ;


Inconvénients
  • La conversion d'un tableau PHP en fichier INI n'est pas triviale ;

  • Le fichier ne peut avoir qu'un seul niveau de profondeur ;


Utiliser un fichier XML

Cette solution consiste à créer un fichier XML (http://fr.wikipedia.org/wiki/XML).

Fichier configuration.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<configuration_items>
<configuration_item>
<key>players_per_universe</key>
<value>50</value>
</configuration_item>
<configuration_item>
<key>players_per_universe</key>
<values>
<value>EN</value>
<value>FR</value>
</values>
</configuration_item>
</configuration_items>
<namespace name="database">
<configuration_items>
<configuration_item>
<key>username</key>
<value>root</value>
</configuration_item>
<configuration_item>
<key>password</key>
<value>jambon fumé</value>
</configuration_item>
<configuration_item>
<key>host</key>
<value>localhost</value>
</configuration_item>
<configuration_item>
<key>database</key>
<value>my_game</value>
</configuration_item>
</configuration_items>
</namespace>
</configuration>

Dans le code source PHP :

function xml2array($filename) {
$ret = array();
 
# Une fermeture avec PHP >= 5.3
$toArray = function ($elt, &$ret) {
foreach ($elt->configuration_items->configuration_item as $item) {
if (isset($item->values)) {
$ret[(string) $item->key] = array();
foreach ($item->values->value as $value) {
array_push($ret[(string) $item->key], (string) $value);
}
} else if (isset($item->value)) {
$ret[(string) $item->key] = (string) $item->value;
}
}
};
# Une lambda pour PHP < 5.3
/*$toArray = create_function('$elt, &$ret', '
foreach ($elt->configuration_items->configuration_item as $item) {
if (isset($item->values)) {
$ret[(string) $item->key] = array();
foreach ($item->values->value as $value) {
array_push($ret[(string) $item->key], (string) $value);
}
} else if (isset($item->value)) {
$ret[(string) $item->key] = (string) $item->value;
}
}
');*/
# (sinon utiliser une classe et en faire une méthode privée)

# /!\ Les chaînes (clés et valeurs) sont en UTF-8 !
libxml_use_internal_errors(TRUE);
$sxml = simplexml_load_file($filename);
if ($sxml) {
if (isset($sxml->configuration_items)) {
$toArray($sxml, $ret);
}
foreach ($sxml->namespace as $namespace) {
$key = (string) $namespace['name'];
$ret[$key] = array();
$toArray($namespace, $ret[$key]);
}
}
 
return $ret;
}
 
$configuration = xml2array('../configuration.xml');

Avantages
  • On maîtrise le nommage (pas de conflit de noms à craindre) ;

  • Ce fichier est lisible depuis n'importe quel langage ;

  • Convertir un tableau en chaîne XML est assez aisé, on peut donc créer une interface d'édition de la configuration ;


Inconvénients
  • Laborieux à interpréter ;


Utiliser un fichier JSON

Cette solution consiste à créer un fichier JSON (http://json.org/).

Fichier configuration.json :

{
players_per_universe: 50,
supported_languages: [ "EN", "FR" ],
database: {
username: "root",
password: "jambon fumé",
host: "localhost",
database: "my_game"
}
}

Dans le code source PHP :

// Ce fichier ne doit surtout pas être présent dans le dossier public_html/ sous peine d'être accessible à tous ! 
// Le deuxième argument permet de retourner un tableau associatif plutôt qu'un objet.
$configuration = json_decode(file_get_contents('../configuration.json'), true);

Avantages
  • Cette solution est performante car la fonction d'interprétation est native à PHP ;

  • On maîtrise le nommage (pas de conflit de noms à craindre) ;

  • Ce fichier est lisible depuis n'importe quel langage ;

  • Le tableau peut-être converti en JSON avec json_encode(), il est donc très simple de créer une interface d'édition de la configuration ;


Inconvénients
  • Aucun ?