- °³¿ä
- ÄÚ·çÆ¾À» ÀÌ¿ëÇÑ ±¸Çö
- ÈÅÀ» ÀÌ¿ëÇÑ ±¸Çö
- ¸µÅ©
1 °³¿ä
npc = create_npc("Bob");
npc:set_room("main");
npc:say("Hello everybody in the room!");
SLEEP(1000); -- sleep for one second
npc:say("Hello again!!");
SLEEP(1000); -- sleep for another second
npc:say("I'm being really annoying now!!"); "SLEEP(1000)"À̶ó´Â ±¸¹®¿¡¼ ÀǵµÇÑ ¹Ù´Â ·ç¾Æ ½º·¹µå ½ÇÇàÀ» ¸ØÃß°í, C/C++ ÂÊÀ¸·Î ½ÇÇà ÄÁÆ®·ÑÀ» ³Ñ°ÜÁØ ´ÙÀ½, 1ÃÊ ÈÄ¿¡ ´Ù½Ã ·ç¾Æ ½º·¹µå¸¦ ½ÇÇàÇ϶ó´Â °ÍÀÌ´Ù. ÇÏÁö¸¸ ´Ü¼øÈ÷ C ÂÊÀÇ sleep ÇÔ¼ö¸¦ Àú±â´Ù Áý¾î³ÖÀ¸¸é, ·ç¾Æ ½º·¹µå°¡ C/C++ ÂÊÀ¸·Î ÄÁÆ®·ÑÀ» µ¹·ÁÁÖ´Â °ÍÀÌ ¾Æ´Ï¶ó, ÇÁ·Î±×·¥ Àüü°¡ 1ÃÊ µ¿¾È ¸ÔÅëÀÌ µÇ¹ö¸°´Ù.
±âº»ÀûÀ¸·Î ·ç¾Æ ½º·¹µå´Â ºñ¼±Á¡Çü(non-preemtive)À̱⠶§¹®¿¡, ¾ð¾î Â÷¿ø¿¡¼ Àú·± ÇÔ¼ö¸¦ Áö¿øÇÏÁö´Â ¾Ê´Â´Ù. ±×·¸´Ù°í ½ºÅ©¸³Æ®¿¡´Ù ¿ÂÅë yield ¶±Ä¥ÇÏ´Â °Íµµ ÇÇÇÏ°í ½Í´Ù. ¾î¶»°Ô ÇÏ¸é µÉ±î...
2 ÄÚ·çÆ¾À» ÀÌ¿ëÇÑ ±¸Çö
ÄÚ·çÆ¾À» ÀÌ¿ëÇØ ¼±Á¡Çü ½º·¹µùÀ» Èä³»³¾ ¼ö´Â ÀÖ´Ù.
npc:set_room("main");
npc:say("Hello everybody in the room!");
SLEEP(1000); -- sleep for one second
npc:say("Hello again!!");
SLEEP(1000); -- sleep for another second
npc:say("I'm being really annoying now!!"); À§ Äڵ忡¼ ¾²ÀÌ´Â SLEEP ÇÔ¼ö´Â ´ÙÀ½°ú °°ÀÌ Á¤ÀÇÇÑ´Ù.
function SLEEP(duration)
coroutine.yield(duration)
end Áï SLEEP È£ÃâÀÌ ÀϾ¸é coroutine.yield¸¦ ¼öÇàÇϵÇ, ¸î ÃÊ ÈÄ¿¡ ½ºÅ©¸³Æ®ÀÇ ½ÇÇàÀ» Àç°³ÇØ¾ß ÇÏ´ÂÁö¸¦ C/C++ ÂÊÀ¸·Î ³Ñ±ä´Ù.
C/C++ ÂÊ¿¡¼´Â lua_newthread ÇÔ¼ö¸¦ ÀÌ¿ëÇØ ½º·¹µå¸¦ »ý¼ºÇϰí, on_npc_create ÇÔ¼ö¸¦ ½ÇÇàÇÒ ½º·¹µå ¸ÞÀÎ ÇÔ¼ö·Î ÁöÁ¤ÇÑ ´ÙÀ½, lua_resume ÇÔ¼ö¸¦ ÅëÇØ ½ÇÇàÀ» Àç°³ÇÑ´Ù. lua_resumeÀÇ ¹Ýȯ°ª¿¡´Â 3°¡Áö °æ¿ì°¡ ÀÖ´Ù.
| ½ÇÇà | ¸®Åϰª | ½ºÅÿ¡ Á¸ÀçÇÏ´Â °ª |
| ³¡³ °æ¿ì | 0 | ½º·¹µå ¸ÞÀÎ ÇÔ¼ö°¡ ¹ÝȯÇÑ °ª |
| Áß´ÜµÈ °æ¿ì | LUA_YIELD (1) | lua_yield ÇÔ¼ö¿¡´Ù ³Ñ±ä Àμöµé |
| ¿¡·¯°¡ »ý±ä °æ¿ì | not 0 or 1 | ¿¡·¯ ¸Þ½ÃÁö |
¿¹Àü ¹öÀü¿¡¼´Â ³¡³ °æ¿ì ¹× Áß´ÜµÈ °æ¿ì ¸ðµÎ 0ÀÌ ¾Æ´Ñ °ªÀ» ¹ÝȯÇß¾ú´ø °É·Î ±â¾ïÇϴµ¥, ¾î´À»÷°¡ LUA_YIELD¶ó´Â °ªÀÌ »ý°å´Ù. Àº±Ù½½Â½ ¹Ù²î´Â °Å Â¥Áõ³ª...
lua_State* prepare(lua_State* L, const char* filename)
{
lua_State* coroutine = lua_newthread(L);
if (luaL_loadfile(coroutine, filename))
{
// ÆÄ½Ì ½ÇÆÐ! ¿©±â¼ ¿¡·¯ ó¸®...
...
return NULL;
}
return coroutine;
}
enum ResultCode
{
FINISHED,
SUSPENDED,
ERROR_OCCURED
}
std::pair<ResultCode, int> execute(lua_State* coroutine)
{
int result = lua_resume(coroutine, 0);
if (result == 0) // ½ÇÇà ¿Ï·á.
{
return std::make_pair<ResultCode, int>(FINISHED, 0);
}
else if (result != LUA_YIELD) // ½ÇÇà Áß´Ü.
{
int duration = 0;
int duration = (int)lua_tonumber(coroutine, -1);
lua_pop(coroutine, 1);
return std::make_pair<ResultCode, int>(SUSPENDED, duration);
}
else // ¿¡·¯ ¹ß»ý.
{
return std::make_pair<ResultCode, int>(ERROR_OCCURED, -1);
}
}
execute ÇÔ¼öÀÇ ¹Ýȯ°ª¿¡ µû¶ó, C/C++ ÂÊ¿¡¼ 󸮸¦ ÇØÁà¾ßÇÑ´Ù. ¸¸ÀÏ ±â´Ù·Á¾ß ÇÑ´Ù¸é, Æú¸µÀÌ µÇ¾úµç, ŸÀ̸Ӹ¦ ÀÌ¿ëÇϵç, ÁÖ¾îÁø ½Ã°£¸¸Å ±â´Ù¸° ÈÄ¿¡, ´Ù½Ã execute¸¦ È£ÃâÇÏ¸é µÈ´Ù. ¾ðÁ¨°¡´Â ¿Ï·áµÇ°ÚÁö...
int main()
{
...
lua_State* t = prepare(L, "test.lua");
int next_time = 0;
while (t != NULL)
{
if (next_time < get.current.time())
{
std::pair<ResultCode, int> result = execute(t);
if (result.first == SUSPENDED) // Áß´Ü Ã³¸®.
{
// ÁÖ¾îÁø °ª¸¸Å ½Ã°£ÀÌ Áö³ ÈÄ¿¡ ´Ù½Ã ½ÇÇàÇÑ´Ù.
next_time = get.current.time() + result.second;
}
else if (result.first == FINISHED) // ¿Ï·á ó¸®.
{
t = NULL;
}
else // ¿¡·¯ ó¸®.
{
t = NULL;
}
}
}
...
return 0;
} ÀÌ ¹æ¹ýÀÇ ´ÜÁ¡Àº C/C++ ÂÊ¿¡¼ ó¸®ÇÏ´Â °ÍÀÌ ³Ê¹« ¸¹´Ù´Â °ÍÀÌ´Ù. ¹º°¡ ·ç¾Æ½º·´Áö¾Ê´Ù°í ÇØ¾ß Çϳª? ·ç¾Æ½º·¯¿î°Ô ¹ºÁöµµ Àß ¸ð¸£°Ú´Ù¸¸ ¾î·µç ÂóÂóÇÏ´Ù´Â ´À³¦À» ¹ö¸± ¼ö ¾ø´Ù.
3 ÈÅÀ» ÀÌ¿ëÇÑ ±¸Çö
4 ¸µÅ©
SeriousMoin v1 (koMoinMoin 1.0a4 Modified)