2010-08-29 4 views
4

Я действительно хочу добавить Lua Scripting в свой игровой движок. Я работаю с Lua и привязал его к C++, используя luabind, но мне нужна помощь в разработке того, как я буду строить свои игровые объекты с помощью Lua.Интеграция Lua для создания моих GameEntities в моей игровой машине?

Информация Двигатель:

компонент ориентированной, в основном каждый GameEntity список components, которые обновляются в дельта Т интервала. В основном Game Scenes состоят из коллекций Game Entities.

Итак, вот дилемма:

Скажем, у меня есть этот Lua файл, чтобы определить GameEntity и его компоненты:

GameEntity = 
{ 
-- Entity Name 
"ZombieFighter", 

-- All the components that make the entity. 
Components = 
{ 
    -- Component to define the health of the entity 
    health = 
    { 
    "compHealth", -- Component In-Engine Name 
    100, -- total health 
    0.1, -- regeneration rate 
    }, 

    -- Component to define the Animations of the entity 
    compAnimation = 
    { 
    "compAnimatedSprite", 

    spritesheet = 
    { 
    "spritesheet.gif", -- Spritesheet file name. 
    80,  -- Spritesheet frame width. 
    80,  -- Spritesheet frame height. 
    }, 

    animations = 
    { 
    -- Animation name, Animation spritesheet coords, Animation frame duration. 
    {"stand", {0,0,1,0,2,0,3,0}, 0.10}, 
    {"walk", {4,0,5,0,6,0,7,0}, 0.10}, 
    {"attack",{8,0,9,0,10,0}, 0.08}, 
    }, 
    }, 
}, 
} 

Как вы можете видеть, это GameEntity определяется 2-х компонентов, " compHealth "и" compAnimatedSprite ". Эти две совершенно разные компоненты требуют совершенно разных параметров инициализации. Здравоохранение, требующее целого числа и поплавка (общее количество и регенерация), а с другой стороны - анимации, требующие имя листа спрайта, и определение всех анимаций (кадров, продолжительности и т. Д.).

Я хотел бы сделать какой-то абстрактный класс с помощью некоторого виртуального метода инициализатора, который может использоваться всеми моими компонентами, которые требуют связывания Lua, чтобы облегчить инициализацию Lua, но это кажется трудным, поскольку виртуальный класс не является будет иметь один виртуальный метод init. Это связано с тем, что для всех инициализаторов компонентов (или большинства из них) требуются разные параметры инициализации (компоненту здоровья требуется другой init, чем компонент Animated Sprite или компонент AI).

Что вы предлагаете упростить привязки Lua к конструкторам этих компонентов? или как вы это сделаете?

PS: Я должен использовать C++ для этого проекта.

ответ

5

Я бы предложил использовать вместо composite structure для ваших игровых объектов. Добавьте объекты, наследуемые от общего компонента сущности игры, к каждому игровому объекту, когда вы сталкиваетесь с ними, при анализе таблицы конфигурации Lua. Эта задача является идеальным кандидатом для factory method. Обратите внимание, что составление ваших объектов таким образом по-прежнему требует, чтобы все методы были реализованы в классе GameEntity, если вы не используете альтернативный метод отправки, например, передачу сообщений (см. visitor pattern)

На стороне Lua я считаю, что удобнее используйте функцию обратного вызова с единственным аргументом таблицы вместо того, чтобы перемещаться по сложной структуре таблицы в C/C++. Вот чистый пример Lua того, что я имею в виду, используя ваши данные.

-- factory functions 
function Health(t) return { total = t[1], regeneration = t[2] } end 
function Animation(t) return { spritesheet = t[1], animations = t[2] } end 
function Spritesheet(t) 
    return { filename = t[1], width = t[2], height = t[3] } 
end 
function Animations(t) 
    return { name = t[1], coords = t[2], duration = t[3] } 
end 

-- game entity class prototype and constructor 
GameEntity = {} 
setmetatable(GameEntity, { 
    __call = function(self, t) 
     setmetatable(t, self) 
     self.__index = self 
     return t 
    end, 
}) 

-- example game entity definition 
entity = GameEntity{ 
    "ZombieFighter", 
    Components = { 
     Health{ 100, 0.1, }, 
     Animation{ 
      Spritesheet{ "spritesheet.gif", 80, 80 }, 
      Animations{ 
       {"stand", {0,0,1,0,2,0,3,0}, 0.10}, 
       {"walk", {4,0,5,0,6,0,7,0}, 0.10}, 
       {"attack", {8,0,9,0,10,0}, 0.08}, 
      }, 
     }, 
    } 
} 

-- recursively walk the resulting table and print all key-value pairs 
function print_table(t, prefix) 
    prefix = prefix or '' 
    for k, v in pairs(t) do 
     print(prefix, k, v) 
     if 'table' == type(v) then 
      print_table(v, prefix..'\t') 
     end 
    end 
end  
print_table(entity) 

 Смежные вопросы

  • Нет связанных вопросов^_^