Хорошо, подумайте о разработке игр.
Допустим, вы делаете кат-сцену или, возможно, учебник.В любом случае, у вас есть упорядоченная последовательность команд, отправленных некоторому количеству объектов.Сущность перемещается в какое-то место, разговаривает с парнем, а затем уходит в другое место.И так далее.Некоторые команды не могут быть запущены, пока другие не закончили.
Теперь посмотрим, как работает ваша игра.Каждый кадр должен обрабатывать AI, тесты на столкновение, анимацию, рендеринг и звук, а также, возможно, другие вещи.Вы можете думать только каждый кадр.Итак, как вы помещаете такой код, где вам нужно дождаться завершения какого-либо действия, прежде чем выполнять следующее?
Если вы построите систему на C ++, у вас будет что-то, что выполнялось раньшеAI.Это будет иметь последовательность команд для обработки.Некоторые из этих команд могут быть мгновенными, например, «сообщить сущности X, чтобы они шли сюда» или «создать сущность Y здесь».Другим придется подождать, например: «Скажите объекту Z перейти сюда и больше не обрабатывать команды, пока он не перейдет сюда».Командный процессор должен вызываться каждый кадр, и он должен понимать сложные условия, такие как «объект находится в местоположении» и т. Д.
В Lua это будет выглядеть так:
local entityX = game:GetEntity("entityX");
entityX:GoToLocation(locX);
local entityY = game:SpawnEntity("entityY", locY);
local entityZ = game:GetEntity("entityZ");
entityZ:GoToLocation(locZ);
do
coroutine.yield();
until (entityZ:isAtLocation(locZ));
return;
Для размера C ++ этот сценарий будет возобновляться один раз за кадр, пока он не будет завершен.Как только он возвращается, вы знаете, что ролик завершен, и вы можете вернуть управление пользователю.
Посмотрите, насколько проста эта логика Lua.Он делает именно то, что говорит.Это ясно, очевидно, и поэтому очень трудно ошибиться.
Сила сопрограмм заключается в возможности частично выполнить какую-то задачу, подождать, пока условие выполнится, а затем перейти к следующей задаче.