Quale formato di file di configurazione consente le inclusioni di altri file e l'ereditarietà delle impostazioni?
-
22-07-2019 - |
Domanda
Sto scrivendo un gioco basato su C ++ multiplayer.
Ho bisogno di un formato di file flessibile per archiviare informazioni sui personaggi del gioco.
I personaggi del gioco spesso non condividono gli stessi attributi o usano un basew
Ad esempio:
Un formato che mi consentirebbe di fare qualcosa del genere:
#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
Ho cercato un formato preesistente che fa tutto questo, o è simile, ma senza fortuna. Sono impaziente di non reinventare la ruota a meno che non sia necessario, quindi mi chiedevo se qualcuno conosce dei buoni formati di file di configurazione che supportano queste funzionalità
Soluzione 4
Dopo molte ricerche ho trovato una soluzione abbastanza buona usando Lua
Lua ho scoperto che originariamente era progettato come un linguaggio di file di configurazione, ma poi si è evoluto in un linguaggio di programmazione completo.
Esempio
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
Utilizzando la funzione di stampa in Lua è anche facile testare le impostazioni se sono corrette. La sintassi non è così bella come mi piacerebbe, ma è così vicina a ciò che voglio, non mi dispiacerà scrivere un po 'di più.
L'uso del codice qui http: // windrealm.com/tutorials/reading-a-lua-configuration-file-from-c.php Riesco a leggere le impostazioni nel mio programma C ++
Altri suggerimenti
JSON riguarda il formato di file più semplice in circolazione, ha librerie mature e puoi interpretarlo per fare tutto quello che vuoi.
{
"FastSpaceship" : {
"Speed" : 10,
"Rotation" : 5
},
"MotherShip" : {
"Inherits" : "FastSpaceship",
"ShieldRecharge" : 4,
"WeaponA": {
"Power": 10,
"Range": 20,
"style": "fireball"
}
},
"SlowMotherShip": {
"Inherits": "MotherShip",
"Speed": 4
}
}
YAML ? È come JSON senza virgole e virgolette.
Potresti voler dare un'occhiata a una sorta di basata su frame , poiché sembra questo è esattamente ciò di cui stai parlando. Quella pagina di Wikipedia si collega ad alcune implementazioni esistenti che forse potresti usare o creare le tue.