2009-08-04 5 views
1

Я пишу многопользовательскую игру на C++.Какой формат конфигурационного файла допускает включение других файлов и наследование настроек?

Мне нужен гибкий формат файла для хранения информации об игровых характеристиках.

Игра charactors часто не разделяют одни и те же атрибуты, или использовать basew

Например:

А формат, который позволил бы мне сделать что-то вроде этого:

#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 

I мы искали уже существующий формат, который делает все это, или похож, но не везет. Я стараюсь не изобретать колесо, если только мне это не нужно, поэтому мне было интересно, знают ли какие-либо хорошие форматы конфигурационных файлов, которые поддерживают эти функции.

ответ

-1

После много поиска я нашел довольно хорошее решение с использованием Lua

Lua я узнал, был первоначально разработан как язык файла конфигурации, но затем превратилась в полноценный язык программирования.

Пример

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 

Используя функцию печати в Lua его также легко проверитьесли они верны. Синтаксис не такой приятный, как хотелось бы, но его так близко к тому, что я хочу, я не собираюсь писать немного больше.

используя код здесь http://windrealm.com/tutorials/reading-a-lua-configuration-file-from-c.php я могу прочитать настройки в моей C++ программы

+1

Если вы собираетесь это сделать, вы можете просто включить в свою программу Python, Ruby, Javascript или любой другой интерпретатор. Будьте осторожны с безопасностью, если язык имеет функцию execute(), которую вы не хотите создавать файлы конфигурации, которые могут форматировать c: –

+0

Это правда, думая об этом, язык сценариев начинает приобретать больше внимания, а не статическую библиотеку, поскольку это используется для проектирования уровня. Проблема с безопасностью - это то, о чем я не думал, я слышал, что ее можно запустить в режиме песочницы, я посмотрю на это. – Kingsley

0

Возможно, вы захотите проверить какое-то представление frame-based, так как кажется, что это именно о чем вы говорите. Эта страница wikipedia ссылается на несколько существующих реализаций, которые, возможно, вы можете использовать, или создать свои собственные.

1

JSON - это простейший формат файла, имеющий зрелые библиотеки, и вы можете интерпретировать его, чтобы делать все, что хотите.

{ 
    "FastSpaceship" : { 
     "Speed" : 10, 
     "Rotation" : 5 
    }, 
    "MotherShip" : { 
     "Inherits" : "FastSpaceship", 
     "ShieldRecharge" : 4, 
     "WeaponA": { 
      "Power": 10, 
      "Range": 20, 
      "style": "fireball" 
     } 
    }, 
    "SlowMotherShip": { 
     "Inherits": "MotherShip", 
     "Speed": 4 
    } 
} 
+0

Как это будет работать с включением других файлов. Я хочу что-то вроде CSS, я думаю. На самом деле я не хочу, чтобы все это включало в себя наследование кода пользователя (я бы хотел, чтобы библиотека выполняла эту работу) Следовательно, я мог бы набрать что-то вроде: rotation = lookup ("SlowMotherShip.Rotation"); и получилось бы, что значение Rotation равно 5. – Kingsley

+0

Думаю, у меня нет хорошего ответа для вас. Я не знаю ни одной библиотеки форматов файлов, которая знает об иерархических отношениях между объектами.Это не значит, что этого не существует (мир с открытым исходным кодом намного больше, чем мой опыт). Я написал что-то подобное раньше. Формат был простым JSON, и парсер просто знал, как иметь дело с несколькими «ключевыми словами», такими как «наследует» (IIRC, мы использовали ключевое слово «super»). – moswald

+0

А я вижу, все кажется близким к тому, что я хочу, но недостаточно близко. Я предполагаю, что мне придется писать свою собственную библиотеку или адаптировать существующую; – Kingsley