На сайте gamedev.ru уже давно существует раздел, в которых выкладываются логи переписки с лекциями. Не смотря на то, что там собрано все в кучу, практически каждая такая переписка имеет толк. Например из них можно узнать множество вещей, которые невозможно узнать из сухой документации. В связи с тем, что на сайте много новичков, я хотел бы провести ряд таких экспериментальных лекций. Они будет представлять собой голосовой чат в котором будет подниматься какая-либо тема (например логика в игре) и лектор будет о ней рассказывать. Участники могут спрашивать любые вопросы, на которые лектор постарается ответить. По окончанию логи беседы будут выложены в аудио и текстовом формате. На каждую лекцию необходима будет записываться - это нужно для того, чтобы можно было искоренить флудеров и предотвратить переполнение. Формат записи (пример - я):
Quote (me)
Skype: rus_phantom Есть микрофон Буду на лекции.
Если вы записались, но не пришли - никаких проблем.
Правила: 1. Не флудить 2. Уважать участников 3. Уважать русский язык
Если будет адекватная аудитория то я обязательно постараюсь увеличить количество направлений в лекциях, и приглашу знаменитых людей, таких как AlexRos, macron, malandrinus. Не уверен что они все согласятся, но многие не против поделиться опытом.
Так же буду рад если кто нибудь из сильных скриптеров тоже присоединится к нам. Чтобы дополнить или поправить материал.
Наличие микрофона не обязательно, но желательно. Он нужен будет только для того чтобы задавать вопросы. Те у кого нет микрофона, могут задавать вопросы в чате. Голосовая запись будет опубликована в тот же день, в текстовом формате - через несколько дней.
Те, кто записался, приглашу за полчаса до начала к скайп конференцию.
Расписание:
29.06.12 21:00 - Основы скриптов (переменные, условия, циклы, функции, области видимости). Лектор: _Призрак_ 07.07.12 20:00 - Основы скриптов (Повторение). Лектор: _Призрак_ 08.07.12 20:00 - Логику игровых объектов (спавн НПС, установка логики). Лектор: ColR_iT 13.07.12 21:15 - Основы скриптов Лекция 3. Лектор: _Призрак_ 14.07.12 20:00 - Логика игровых объектов (схемы поведения НПС). Лектор: ColR_iT
Объявление
Происходит запись на лекцию по скриптам, а так же на лекцию про логику
Сообщение отредактировал _Призрак_ - Пятница, 13.07.2012, 00:20
Да, будем спанить НПС, убивать их, работать с временем, но главное - напишем свой менеджер новостей, который будет: 1. Писать рандомные сообщения в чат 2. Писать о убитых сталкерах (указывая при этом как умер НПС, почему он умер и где он умер) 3. Писать о тяжелораненых сталкерах, с установкой на них метки
Я надеюсь SkyLoader и ColR_iT присоединятся? В прошлый раз вы очень сильно помогли
Сообщение отредактировал _Призрак_ - Воскресенье, 01.07.2012, 22:24
Итак, как и обещал, хотя и с опозданием, но всё же… Небольшой “тутор” по области видимости переменных.
Переменные в Lua (а значит и в игре) могут быть глобальными и локальными. Что это значит… Глобальные переменные могут быть вызваны из любого места файла и даже из другого файла. Локальные же могут быть вызваны только из блока в котором эта переменная определена. Чтобы объявить локальную переменную, перед её именем необходимо написать зарезервированное слово local. Разберём следующий код:
Code
if true then --# определим локальную переменную внутри блока if lacal actor = db.actor end --# использование локальной переменной за областью её видимости local health = actor.health
Приведённый код вызовет ошибку, с жалобой на то, что в четвёртой строчке (исключая комментарии) actor равен nil, поскольку локальная переменная actor объявлена внутри блока. Блоком может выступать любая управляющая конструкция, например: if, else, while, for, function. Таким образом область видимости локальной переменной начинается там, где эта переменная объявлена и заканчивается в конце управляющего блока, либо в конце файла, в случае, если локальная переменная объявлена не в блоке, т.е. в данном случае блоком выступает сам файл (извиняюсь за тавтологию). Если при объявлении локальной переменной в каком либо блоке, ниже по коду будут присутствовать другие, например, ещё одно условие либо цикл, то область видимости этой переменной распространяется и на них, при условии, что она не переопределена. Т.е. для примера выше, правильный код будет выглядеть так:
Code
--# объявим локальную переменную health local health if true then --# определим локальную переменную actor local actor = db.actor --# присвоим переменной health, значение здоровья ГГ health = actor.health end
НО! Вот такой код:
Code
--# объявим локальную переменную health local health if true then --# определим локальную переменную actor local actor = db.actor --# объявим локальную переменную health и присвоим ей значение здоровья ГГ local health = actor.health end
В дальнейшем приведёт к логической ошибке, а то и к вылету. Поскольку значение переменной health при её использовании в дальнейшем, не в блоке условия if, будет равна nil. Т.е. в данном случае локальных переменных с именем health - две, одна внешняя, другая - внутри блока if. Соответственно количество здоровья ГГ присваивается переменной внутри блока, поэтому и доступно оно будет, лишь до его окончания. Чтобы несколько себя "защитить", можно инициализировать внешнюю переменную health значением ноль, вот так:
Code
local health = 0
Это не обеспечит на 100% правильный результат, но оградит Вас от вылета на рабочий стол. Можно также ставить проверки на то, что переменная не равна nil, либо другому неподходящему значению, но как по мне - вовремя инициализированная переменная смотрится куда достойнее. ИМХО.
Итак, подведём итог: 1. По возможности используйте локальные переменные, причём объявляйте их там, где они необходимы. 2. Инициализируйте переменные при их объявлении предполагаемым типом данным, например, если вы объявляете числовую переменную, то присвойте ей изначальное значение ноль, если переменная в дальнейшем будет хранить в себе строку, присвойте ей пустую строку (""), если логическую, определите её как true либо false, в зависимости от необходимых требований.
P.S. Что касается следующей лекции, выскажу несколько противоречивое для некоторых мнение... Мне кажется нужно повторить то, что было на первой лекции. Учитывая то, что она была первой и все Мы смогли в той или иной мере извлечь из неё пользу, всё же многое осталось не понятным (сужу по вопросам заданным после лекции). А так, Федор уже определил что, а главное как, рассказывать в дальнейшем, посему начать сначала, но начать "правильно", так чтобы это было предельно ясно не только "избранным", но и не программистам, будет наиболее правильным решением. Лично я вижу в этом только плюсы.
P.P.S. Неплохо было бы слушателям придерживаться несложных правил этикета, в частности - не перебивать. Это в достаточной мере сбивает говорящего с мысли. Есть вопросы - запишите их и задайте в конце лекции или хотя бы в конце "предполагаемой её части". Останутся и после этого - пишите их сюда, лично я постараюсь не оставить их безответными, думаю и другие также помогут.