The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"вопрос по LUA"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Shell скрипты)
Изначальное сообщение [ Отслеживать ]

"вопрос по LUA"  +/
Сообщение от Andrey (??) on 14-Сен-12, 12:55 
хочу перевести часть АИ (самописанной игрушки) на LUA, вопрос вот в чем у меня много игровых объектов описаны через enum. как с этим LUA  работает?
Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "вопрос по LUA"  +/
Сообщение от ANonymous on 16-Сен-12, 13:43 
Общепринято енумы пробрасывать как строки (все строки интернятся, так что на стороне Луа в скорости потерь нет). Со стороны сей лучше их заранее положить в таблицу и сравнивать через lua_rawequal. Таблицу можно хранить в LUA_REGISTRY или вообще обойтись без нее, создав на каждый тип енума конвертирующее замыкание и сравнивать upvalue со входящим параметром строкой, или, если это число, то наоборот возвращать строку-upvalue.
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "вопрос по LUA"  +/
Сообщение от ANonymous on 16-Сен-12, 14:04 
Замыкание создается так: пушишь N строк, вызываешь lua_pushcclosure(L, N, conv_func). В conv_func в цикле от 1 до N: lua_pushvalue(L, lua_upvalueindex(n)), lua_rawequal(L, -1, -2), если совпали - оно, если нет, lua_pop(L, 1) и идем дальше. Если lua_type(L, 1) == LUA_TNUMBER, то просто lua_pushvalue(L, lua_upvalueindex(lua_toint(L, 1))), return 1 -- возвращаем строку по числу. Ну и проверки границ не забываем, Луа их не делает, можно попасть на сегфолт.
Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

3. "вопрос по LUA"  +/
Сообщение от Andrey (??) on 29-Сен-12, 19:05 
> Замыкание создается так: пушишь N строк, вызываешь lua_pushcclosure(L, N, conv_func).
> В conv_func в цикле от 1 до N: lua_pushvalue(L, lua_upvalueindex(n)), lua_rawequal(L,
> -1, -2), если совпали - оно, если нет, lua_pop(L, 1) и
> идем дальше. Если lua_type(L, 1) == LUA_TNUMBER, то просто lua_pushvalue(L, lua_upvalueindex(lua_toint(L,
> 1))), return 1 -- возвращаем строку по числу. Ну и проверки
> границ не забываем, Луа их не делает, можно попасть на сегфолт.

Жестко. ;)

ЗЫ enum - это просто гарантированно уникальные целые. Можно вручную, можно через самый примитивнейший препроцессор (строчек 20 на Луа), можно через строки - они интернируются, то есть те же целые, только вразброс.

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру