Quel format de fichier de configuration permet l'inclusion d'autres fichiers et l'héritage de paramètres?
-
22-07-2019 - |
Question
J'écris un jeu multijoueur basé sur C ++.
J'ai besoin d'un format de fichier flexible pour stocker des informations sur les personnages du jeu.
Les personnages de jeu ne partagent souvent pas les mêmes attributs, ni n'utilisent un basew
Par exemple:
Un format qui me permettrait de faire quelque chose comme ceci:
#include "standardsettings.config"
//include other files which this file
//then changes
FastSpaceship:
Speed: 10 //pixels/sec
Rotation: 5 //deg/sec
MotherShip : FastSpaceship //inherits all the settings of the Spaceship ship
ShieldRecharge: 4
WeaponA [ power:10,
range:20,
style:fireball]
SlowMotherShip : MotherShip //inherits all the settings of the monther ship
Speed: 4 // override speed
J'ai recherché un format préexistant qui fait tout cela, ou qui est similaire, mais sans succès. Je ne souhaite pas réinventer la roue à moins que je ne sois obligé de le faire. Je me demandais donc si quelqu'un connaissait un bon format de fichier de configuration prenant en charge ces fonctionnalités
La solution 4
Après de nombreuses recherches, j'ai trouvé une très bonne solution avec Lua
Lua que j'ai découvert a été conçu à l'origine comme langage de fichier de configuration, mais a ensuite évolué pour devenir un langage de programmation complet.
Exemple
util.lua
-- helper function needed for inheritance
function inherit(t) -- return a deep copy (incudes all subtables) of the table t
local new = {} -- create a new table
local i, v = next(t, nil) -- i is an index of t, v = t[i]
while i do
if type(v)=="table" then v=inherit(v) end -- deep copy
new[i] = v
i, v = next(t, i) -- get next index
end
return new
end
globalsettings.lua
require "util"
SpaceShip = {
speed = 1,
rotation =1
}
myspaceship.lua
require "globalsettings" -- include file
FastSpaceship = inherits(SpaceShip)
FastSpaceship.Speed = 10
FastSpaceship.Rotation = 5
MotherShip = inherits(FastSpaceship)
MotherShip.ShieldRecharge = 4
ShieldRecharge.WeaponA = {
Power = 10,
Range = 20,
Style = "fireball"
SlowMotherShip = inherits(MotherShip)
SlowMotherShip.Speed = 4
Il est également facile de tester les paramètres s’ils sont corrects avec la fonction d’impression de Lua. La syntaxe n’est pas aussi agréable que je l’aimerais, mais c’est tellement proche de ce que je veux, ça ne me dérange pas d’écrire un peu plus.
L’utilisation du code ici http: // windrealm.com/tutorials/reading-a-lua-configuration-file-from-c.php Je peux lire les paramètres de mon programme C ++
Autres conseils
JSON est le format de fichier le plus simple qui soit, il possède des bibliothèques matures et vous pouvez l’interpréter comme vous le souhaitez.
{
"FastSpaceship" : {
"Speed" : 10,
"Rotation" : 5
},
"MotherShip" : {
"Inherits" : "FastSpaceship",
"ShieldRecharge" : 4,
"WeaponA": {
"Power": 10,
"Range": 20,
"style": "fireball"
}
},
"SlowMotherShip": {
"Inherits": "MotherShip",
"Speed": 4
}
}
YAML ? C'est comme JSON sans les virgules et les guillemets.
Vous voudrez peut-être consulter une sorte de représentation basée sur des cadres , car elle semble c'est exactement ce dont vous parlez. Cette page wikipedia contient des liens vers quelques implémentations existantes que vous pourriez peut-être utiliser ou créer vous-même.