2014-09-12 1 views
1

Я пытаюсь реализовать такой же дизайн, как и любой, кто успешно выполнил сценарий игры, не используя lua в качестве файла конфигурации/обратного вызова. Я хотел бы функциональность следующим образом:Что такое шаблон дизайна для того, чтобы файл lua работал как скрипт в игровом движке, а не как файл конфигурации?

в «EventIncountered.lua»

1 moveToPoint(500, 500) 
2 --returns here when moving is done. 
3 
4 dance() 
5 --return here when done dancing etc... 

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

+0

Похоже, что вы хотите запускать каждый скрипт в виде сопрограммы и выполнять эти функции внутри, а затем их можно возобновить и вернуться, когда «закончены», но я не знаю, действительно ли это хорошая идея или нет. –

+0

вы вызывали бы определенную функцию в скрипте, например update, которая запускает каждый кадр и выполняет действия lua. Пример, который показывает ypur, обычно оценивается во время загрузки и транскрибируется на код родного языка - это означает, что сам скрипт не выполняет многократно и просто действует как файл конфигурации – LearnCocos2D

ответ

0

Я нашел достойное решение этой проблемы, которая использует идею нашла в Game Coding Complete Fourth Edition

Он описывает класс ProccessManager, что позволяет организацию очередей процессов, которые имели тенденцию к каждому кадру, пока этот процесс не будет завершен. Объект Process, который находится в очереди, должен иметь некоторый способ сигнализировать, что он является полным, и указатель на функцию, который будет вызван, чтобы склоняться к этому процессу для этого кадра.

Хотя я больше не хочу эту функциональность, потому что я узнал намного больше о том, как работает скриптинг в игровых движках, можно выставить функции для lua, которые позволяют вашим скриптам создавать и обрабатывать очереди.

При создании этих процессов может быть указан способ привязки к этому процессу (функция в другом скрипте или что-то подобное), способ определить, завершен ли этот процесс, а также зависимости от остальных процессов ,

Сценарий будет в конечном итоге выглядеть примерно так:

----- ----- queue_processes.lua

-- queueProcess(fileName, functionName, dependencies) 
-- the lua function that corresponds to these processes would then 
-- need to return a special value to signal that it is done. 

queueProcess("basic_processes.lua", "moveToRock", 0) 
queueProcess("basic_processes.lua", "waitTenSeconds", moveToRock) 
queueProcess("basic_processes.lua", "sayHi", waitTenSeconds) 

-- the cool part about doing things this way is that 
-- it wouldn't be hard to add logic to this file 
-- and just keep queuing processes when others 
-- finish or certain conditions have been met. 

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

EDIT: Это хороший ответ на вопрос, который занял несколько абзацев. Таким образом, он не должен был быть закрыт. По крайней мере, я смог оставить это здесь , чтобы кто-то с подобными проблемами мог найти ответ.