Перейти к контенту

Язык Lua. Общие вопросы программирования


Рекомендуемые сообщения

С чего начинать и где взять.

 

Установка Lua:
http://www.amk-team.ru/forum/index.php?showtopic=11584&p=629106

 

Руководство «Программирование на языке Lua», третье издание:
http://www.amk-team.ru/forum/index.php?showtopic=11584&p=905308

Изменено пользователем Kirgudu
Ссылка на комментарий

Gun12,

type(tonumber(time)) == 'number'

Хм. А это что за покемон? В чем сакральный смысл?

  Цитата
Я просто в восторге. Аж дух захватывает.

Это здорово. Что сам думаешь про такой подход вместо createTimer(xxx,xxx,xxx)?

На самом деле, тоже въехала в код, в который раз ЛУА меня удивил своими возможностями. Финты ушами такие можно делать, что мама не горюй. У тебя практически уже около ООП что-то: есть "описание класса" timer, и есть "конструктор" __call. И работаешь с инстансами. Круто. Чуть-чуть доработать и будет почти тот же функционал, что дает луабинд :)

Изменено пользователем xStream

Все, кто стоит на моем пути: идите нахрен и там погибните! ©

Ссылка на комментарий

Сакральный смысл?

Не хочу, чтобы сюда попали другие данные, кроме числа. Как такового, так и в виде строки. Для вычислений же не имеет значения. Конечно не абсолютная защита, но всё же. Об этом я подумаю позже :)

 

Добавлено через 33 мин.:

А насчет того, что я думаю по этому поводу - мыслей нет. Одни эмоции :)

Ссылка на комментарий
  Цитата
Не хочу, чтобы сюда попали другие данные, кроме числа.

А ты посмотри, что ты делаешь :) Сначала приводишь параметр к числу и проверяешь, число ли у тебя... Ну конечно число! Ты же только что приведение типа сделал :) Не нужен там tonumber, он тебе всю твою задумку ломает. Ибо type(tonгmber(x)) всегда 'number'

Двойка мне за знание матчасти. Все верно у тебя. Вот еще один нюанс луа с приведением типов обнаружился...

Изменено пользователем xStream

Все, кто стоит на моем пути: идите нахрен и там погибните! ©

Ссылка на комментарий

У меня сначала и было без tоnumbеr. А потом подумал что вдруг буду вычитывать из файла. И попадет строка.

Это только у меня сервер так тяжело идет?

 

Добавлено через 169 мин.:

xStream

Извини, перенесу нашу беседу в топик, т.к. назревает полезная информация.

Думаю что интересующимся понадобиться.

 

Я делаю для частного случая. Поэтому сам и создаю и прицепляю метатаблицы.

И вроде как незачем создавать подклассы.

На самом деле всё о чём ты говорошь не проблема. Есть стандартное описание создания подобного.

ИМХО, такое нужно применять для чего-то более масштабного чем таймеры в моей интерпритации :

  ... (Показать)
Изменено пользователем Gun12
Ссылка на комментарий

Это немного отличается от того, как сделано в луабинде. Там все намного более семантично сделано.

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

Суть в ЛУА не меняется. Эта информация так, для общего развития. Лично мне просто привычнее работать именно так, после С++, Java, Питона, ПХП. В Javascript используется прототипирование, там вообще все по-другому, как раз больше похоже на то, что ты описал.

Может оффтоп, а может информация для общего развития :)

  Цитата
ИМХО, такое нужно применять для чего-то более масштабного чем таймеры в моей интерпритации :

Лично мне такой способ объявления "дочерних классов" очень неудобен. Но это именно мое имхо и мои привычки. Но ООП на этом действительно можно спокойно реализовывать. И вообще, я где-то говорила, что это проблема? :) Луабинд все это реализовывает именно таким вот хитрым путем. Принцип его работы очень легко повторить.

Изменено пользователем xStream

Все, кто стоит на моем пути: идите нахрен и там погибните! ©

Ссылка на комментарий

xStream

Конечно это отличается от луабинда, т.к. это только всего лишь чистый lua :)

Эдак получится что нужно снова написать luabind. Так он уже есть...

Ссылка на комментарий

Попрошу не путать :) Луабинд ничего не добавляет к луа. Он реализует, образно говоря, некий функционал, используя только возможности самого луа. Если очень приспичит, я могу написать обертку, которая будет делать практически то же самое, что и луабинд - предоставлять возмжность создавать "классы" и реализовывать "наследование". Там всего-то две функции, а остальное игра с метатаблицами. Смысла только не вижу. Если хочется обсудить принцип реализации луабиндом этой фишки - прошу в личку. Еще раз - луабинд НИКАК не расширяет синтаксис ЛУА, а просто имеет "встроенный" дополнительный функционал. Вот что главное.

------------------------

Вывод всего этого - метатблицы и переопределение операторов - рулез.

 

Добавлено через 5 мин.:

А вообще, понятие "чистый ЛУА" смысла не имеет. Если вспомнить, что можно к интерпретатору подключать различные библиотеки, "базовая" комплектация содержит только самое основное. Никто не гнушается подключать библиотеки к интерпретатору. Потому мне кажется, что твое желание "изучить чистый ЛУА" не сильно логично. Лучше уж знать максимум, исопльзовать что нужно для своих целей исходя из задач.

Все, кто стоит на моем пути: идите нахрен и там погибните! ©

Ссылка на комментарий

xStream

Ты совершенно права. Постараюсь больше не путать.

Тем более что сторонними библиотеками совсем не гнушаюсь пользоваться.

 

Обсудить принцип реализации луабинда очень хочется. Только закончу таймеры.

Ссылка на комментарий

Если есть возможность, то попрошу вас обсуждать принцип реализации луабинд в этом топике, мне интересно почитать)

 

Добавлено через 73 мин.:

Вопрос, в том лаунчере функций(таймере), что я выкладывал, на апдейте висит "голый цикл"(ну или вот код функции апдейта лаунчера), это может повлиять на игру?, в смысле не будет ли лагов/фризов/подтормаживаний изза него? Информация в догонку: обычно в массиве self.aLauncher 1 постоянный таймер(сна, скоро добавится еще 1 постоянный таймер) и иногда разовые таймера запускаются...

  Раскрывающийся текст (Показать)
Изменено пользователем Viнt@rь
Ссылка на комментарий

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

 

Вариант универсального хранилища 'xs_stor' свободного от некоторых ограничений.

 

Отличия от исходного варианта:

1. Собственно хранилище (массив storage) доступен с момента инициализации модуля (вместе с хелпером);

2. Хранилище заполняется по мере спавна в игру объектов хранения (custom_storage), что позволяет получать данные из хранилища еще до спавна актора.

Все ранее записанные данные доступны до момента подключения к серверу (см. в логе "Сервер: Соединяемся...");

3. Запись данных из хранилища осуществляется как и ранее по событию сохранения данных актора, что является единственной зависимостью модуля от сторонних событий;

4. Никаких внешних модулей работы с нет-пакетами не требуется. Объекты хранения (custom_storage) не метятся метками.

Чтение/запись данных производятся в штатных рабочих циклах объектов хранения (custom_storage) с одной копией доп.нет-пакета (stor-packet).

  код (Показать)
Изменено пользователем Artos

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Artos, будь дружественным пожалуйста :) - выложи файлом с нормальным форматированием...

 

ЗЫ:

Конечно если таковой есть...

Изменено пользователем 7.9

всё легко

Ссылка на комментарий

Gun12, Viнt@rь, вот для общего развития. Реализация "классов", подобная реализации луабинд. Можно "наследовать" классы, форма записи - такая же (определение классов).

Как видно из кода - реализация примитивнейшая средствами ЛУА, но результат...

  код (Показать)
Изменено пользователем xStream

Все, кто стоит на моем пути: идите нахрен и там погибните! ©

Ссылка на комментарий

Наконец прорвало сервер.

Пока получились такие таймеры :

  ... (Показать)
Ссылка на комментарий

Перечитав тему, примерно так представляются требования для универсального хранилища:

1. У каждого bindable объекта есть метод save(…). Метод знает как проверять и сохранять данные в зависимости от типа (number, table, etc…).

2. Данные сохраняются в специально созданный объект хранилище. Pstor не используется (оставим для оригинального функционала)

3. По мере надобности (лимит 8К?) создаются дополнительный(е) хранилища (transparent to end user) и присоединяются к родительскому объекту наравне с уже созданным

4. Объект хранилище содержит информацию про тот объект которому принадлежит (parent object)

5. Данные можно получить методом obj:read() который пройдет по всем созданным хранилищам данного объекта и считает нужную информацию.

6. Есть некий универсальный (ни кому не принадлежащий) объект с методами save() and read() который можно использовать в случаях когда нет логического родителя – примерно то что сделала xStream, как я понял.

 

Если что не так выразил поправьте и дополните - пытаюсь разобраться с хранилищами

 

П.С. Сервер глючит не по детски

 

 

 

Изменено пользователем Andrey07071977
Ссылка на комментарий

Gun12

Что-то как-то громоздко. И я не понимаю интерфейса (имхо, тоже перегружен - мне кажется, геттеры и сеттеры в чистом виде не нужны. В "методы" обернуть бы более комплексную логику). Зачем ограничение, что таймер нельзя сохранять в переменной? Это не удобно, всегда присваивать имя. Это аналогично безымянным функциям - они есть, работают, можно передавать, но имени нет. ИМХО.

Изменено пользователем xStream

Все, кто стоит на моем пути: идите нахрен и там погибните! ©

Ссылка на комментарий

Доработанный вариант универсального хранилища 'xs_stor' свободного от некоторых ограничений.

1. Упрощен/оптимизирован процесс записи/чтения нет-пакетов объектов хранения. Никаких лишних операций.

2. Операция по сериализации хранимых в хранилище таблиц оставлена только непосредственно при сохранении таблий в объекты хранения., что дало возможность оптимизировать оперции чтеия/записи в собственно хранилище.

 

Ссылка на народ.ру (~6.97 кБ).

В архиве два скрипта, второй (se_stor) - проверенный в работе вариант от Симбиона с некоторыми нюансами (дан для сравнения).

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Предлагаю взглянуть на мою реализацию системы событий, хранилища и таймеров, которую я делал в рамках OGSE. Реализация независимая, возможно кому-то покажется интересной.

http://rghost.net/35846466

Здесь привожу только описание использования, детали смотри внутри.

 

Система событий

Названа по аналогии с boost "сигналы и слоты". Подписчики - это слоты, их соответственно дёргают сигналы. Подписывать можно функции, функциональные объекты и методы объектов. Слот можно подписать для вызова как обычный (или высокоприоритетный) и очерёдный (низкоприоритетный) вызов. Обычные вызываются все разом при срабатывании сигнала, очерёдные - по очереди, по одному на срабатывание сигнала. Всё это используется в таймерах. Имеется сервис автоподключения модулей.

  Работа с системой сигналов (Показать)
Изменено пользователем malandrinus
  Полезный утиль (Показать)
Ссылка на комментарий

Вчера так и не смог толком пробиться на сайт. Ошибка 504 и всё тут. Отправлял сообщение наобум. Получился даблпост. Сорри.

xStream

По поводу луабинда. Конечно шикарно. Высший пилотаж. Код профессионала заметно отличается от любительского.

 

По поводу сетНэйм.

Если бы не нужно было сохранять и загружать то я бы и не придумал её.

И если бы имена таймеров задавались только глобально, то парсил бы _G (ну или _М) и получал имя переменной. А если локально? Где брать имя для загрузки? Например :

-- В какой-то функции на апдейте
local t
-- условие, которое выполняется один раз
if условие then
t = timer():setTime(x)
end
if t and t:action() then
...действие
end

При загрузке получится что таймер то есть, но 't' будет nil. Как получить имя переменной в таком случае ума не приложу. Вот и не стал мучаться. Лучше других помучать :)

Ссылка на комментарий
Gun12, да никакого высшего пилотажа там нет :) Только синтаксис ЛУА. Класс - таблица-прототип, хранящая логику. Объект класса - тоже таблица, но хранящая данные. По метаметоду __index ссылается на таблицу-прототип. Наследование реализуется тоже с помощью __index - таблица-прототип ссылается на другу (другой класс) получая оттуда другую логику. Элементарно.

Все, кто стоит на моем пути: идите нахрен и там погибните! ©

Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...