Quel format de fichier de configuration permet l'inclusion d'autres fichiers et l'héritage de paramètres?

StackOverflow https://stackoverflow.com/questions/1228545

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

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top