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

Язык 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
Ссылка на комментарий

Artos,

  Цитата
Каковы возможности в LUA (применительно к Сталкеру) по работе из скриптов со стеком?

 

В мануале по LUA достаточно куцая информация и практически только для внешнего использования (применительно к С/С+) ...

Как мне помнится, не такая уж и куцая. Работа со стеком там в пространстве имён debug. По причине отсутствия этого пространства имён в версии сталкера этих возможностей там нет.

 

Название языка Lua пишется именно так, с большой буквы. Это не аббревиатура, а имя собственное, означает на бразильском "Луна". Разработчики языка особенно настаивают именно на таком написании названия.

 

Теоретически, поскольку Lua в составе сталкера сделан в виде динамической библиотеки, то можно пересобрать эту библиотеку из исходников и добавить туда то, чего не хватает.

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

Вопрос: Возможно ли по аналогии с перловыми методами из языка Perl составить патерн в Lua для парсинга по нескольким кускам слов?

 

Т.е. имеем несколько масок: Masks = ("one", "two", "three")

Возможно ли составить единый патерн, а не использовать три:

 

if string.match(s,"one") or string.match(s,"two") or string.match(s,"three") then --/< 's' - исходная строка

 

 

P.S. По стеку - ясно, что практических возможностей никаких.

(хорошо, раз бразильцы-разработчики настаивают - уважим, буду употреблять Lua, хотя и не всегда соответствует многим источника, откуда черпаю ... ;-))

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

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

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

Artos,

  Цитата
Возможно ли по аналогии с перловыми методами из языка Perl составить патерн в Lua для парсинга по нескольким кускам слов?

 

Т.е. имеем несколько масок: Masks = ("one", "two", "three")

Возможно ли составить единый патерн, а не использовать три:

 

if string.match(s,"one") or string.match(s,"two") or string.match(s,"three") then --/< 's' - исходная строка

 

Вроде в общем случае никак. То что в Perl - это регулярные выражения, там возможностей гораздо больше. Была бы возможность заменить библиотеку в сталкере, можно было бы и регулярные выражения прикрутить. Библиотеки для Lua уже есть.

 

С другой стороны есть ограниченная возможность делать такое в string.gsub. Там можно производить замену на один из вариантов, перечисленных в таблице. В этом случае найденный по шаблону элемент используется как ключ в таблице для получения значения, на которое заменяем. Не совсем то, что надо было, но именно при замене можно получить похожий эффект.

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

malandrinus, задаю вопросы не из теоретический изысканий иль любопытства ради, а все же с учетом практического применения.

Мне не столь нужны вариации, что можно сделать иначе, а результат, т.е. оптимизиция как самого кода так и/или времени (второе первично).

Просто при своих познаниях и навыках могу чего-то не знать, чего-то упустить/забыть, вот и задаю вопрос к тем, кто может быть нашел/знает решение или наоборот, знает что иначе невозможно.

 

P.S. (подумав) Хотя ... ответ то не только мне предназначен, его и другие читают.

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

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

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

Artos

Можно написать свою функцию.

Например (прототип)

function string.pegexp(s, ...)
    local t = {...}
    for i = 1, #t do
        if s:match(t[i]) then return true end
    end
end

str=bla-bla
w = str:regexp('one', 'two')

 

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

Это для Сталкера. Для luа ещё проще, через родную таблицу аrg :

function string.pegexp(s, ...)
    for i = 1, arg.n do
        if s:match(arg[i]) then return true end
    end
end

 

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

Вопрос из категории "не очевидно, но факт":

 

Возвращаясь в вопросу по способу определения типа таблицы: список или нет (#2765)

 

Имеем две таблицы:

local t1 = {[2]="222",[3]="333",[4]="444"}

и вторую получаем из сторонней:

local t0 = {[1]="111",[2]="222",[3]="333",[4]="444"} --/ сторонняя таблица
local t2 = {} --/ заготовка 2-ой таблицаы

for idx,v in ipairs(t0) do
  if idx ~= 1 then --/ пропускаем 1-й индекс
    t2[idx] = v --/ в таблицу запоминаются 2, 3 и 4
  end
end

Распечатка обеих таблиц одинакова (по сути, хотя и различается порядком):

2=222

3=333

4=444

Собственно вопрос(!): Чем различаются t1 и t2 ?

(попробуйте найти различие/ответ не заглядывая под спойлер)

  причина вопроса и доп.инфа (Показать)
Изменено пользователем Artos

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

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

Оказалась не лишней в единственном случае.

Измени

for idx, v in ipairs(t0) do

if k~=2 then

...

Или другое число, и твоя проверка становится бесполезной.

В общем это не панацея.

Оператор # вообще ведет себя странно.

Скорее всего это связано с тем, что luа (как заявлено) старается любыми путями до последнего сохранять таблицу именно как список а не хэш.

Хотя и тут встречаются аномалии.

Так что на этот оператор в принципе не стоит делать ставку.

Корректно работает только iраirs.

Или же писать свой "определитель длины"

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

Gun12

Чтобы не углубляться, в вопросе не привел все иные варианты, когда оператор # возвращает не нулевую длину для таблиц с пустыми индексами.

  Цитата
Скорее всего это связано с тем, что luа (как заявлено) старается любыми путями до последнего сохранять таблицу именно как список а не хэш

В том то и дело, и с чем и связан вопрос выше - ведь заведомо таблица создается НЕ как список, а как хеш. Ведь начальный первый индекс с самого рождения таблицы не ракен единице.

Ну а для исключения любых подобных неочевидностей сделал подстраховку так:

    iCntIdx = #tTbl --/ длина индексированной части таблицы
    bList = iCntIdx > 0 and not next(tTbl,iCntIdx) --/ флаг списка (true|false)
    if bList then
      for i=1,iCntIdx do --/ цикл проверки на отсутствие 'пустых' индексов
        if tTbl[i] == nil then --/ пустышка?
          bList = false --/ не список
          break --/ прерываем по первой пустышке
        end
      end
    end

А оператор # возвращает номер последнего индекса в таблице, за которым отсутствуют как минимум два следующих индекса подряд.

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

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

Ссылка на комментарий
  Artos писал(а):
...оператор # возвращает номер последнего индекса в таблице, за которым отсутствуют как минимум два следующих индекса подряд.

 

Казалось бы это условие подходит, но...

t = {[1] = "111",[2] = "222",
[3] = "333",
[4] = "444",
[5] = "555"}
t[4]=nil
print(#t)

Темное это дело. Когда-то пытался понять закономерность, да плюнул.

Наверное стоит признаться. Я знал о казусах с оператором # по отношению к таблицам, но промолчал. Думал пронесет. Не пронесло.

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

Итого, с точки зрения гарантированности, достаточности и оптимальности по производительности (по времени) и строк кода, похоже этот вариант наилучший?

  функция: проверка типа таблицы:'список' или нет? (Показать)
Изменено пользователем Artos

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

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

Gun12,

  Цитата
при наборе выскочит окошко с возможным макросом, который вставляется по нажатию клавиши Enter/

Имея привычку пользоваться данным инструментом можно не беспокоится о "забытом" end-е

Я всё пытался понять, что же именно мне не нравится. После этого поста мысль наконец-то оформилась. Дело в том, что существенная часть подобных фишек создана и продвигается исходя из абсолютно ложной предпосылки, будто программисту нужна помощь при наборе программы. Отсюда появляются что-то вроде вставки даты или автозавершение блоковой синтаксической конструкции.

 

Между тем, в реальной жизни программист проводит 9/10 времени отнюдь не создавая новый текст. Основное время занимает поиск ошибок, отладка, внесение изменений любого рода и с самыми разными целями: исправление, оптимизация, расширение возможностей и т.п. Часть "созидательных" фишек при этом бесполезны, часть - попросту будут мешать (в том числе и загромождая рабочее пространство).

 

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

 

Пока искал автоматический форматировщик текста Lua (так и не нашел, кстати) вдосталь начитался мнений типа "научись пользоваться табом и ентером, кретин, и не будет проблем с отступами". Примерно так и пишут, я не преувеличиваю. Между тем, я могу назвать как минимум три причины для использования такого инструмента:

1. Потеря форматирования при изменениях. Код может остаться корректным, но ручное проставление табуляций в километровом тексте может быть утомительно.

2. Возможность искать ошибки потерянных/отсутствующих скобок/завершителей. Такие ошибки легко вносятся при изменениях. Никакие инструменты этого не в состоянии предотвратить, а уже отформатированный код при этом даже в каком-то смысле скрывает ошибку.

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

 

Исходя из сказанного, могу сформулировать перечень жизненно важных для программисткого редактора фишек:

1. Моноширинный шрифт

2. Подсветка синтаксиса

3. Поддержание текущей позиции табуляции

4. Изменение уровня табуляции фрагментов текста

5. Блоковое выделение (это обычно с зажатым Alt-ом) и операции с блоками - удаление, перемещение и пр.

6. Outlining (сворачивание текста)

7. Авторазметка (автоформатирование) текста по запросу

 

Из этого перечня разве только п.3 относится к первичному набиванию текста и то имеет применение также и при редактировании. Остальное предназначено в основном для удобства работы с уже существующим кодом, в частности для лучшего его понимания. Вот этим программист и пользуется 90% всего времени. Остальное - вторично и стоит при первом знакомстве оставить за кадром.

 

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

Artos,

  Цитата
оператор # возвращает номер последнего индекса в таблице, за которым отсутствуют как минимум два следующих индекса подряд.

Почему два? Возвращает индекс n, такой что "t[n] не равен nil, а t[n+1] равно nil". Т.е. такой, за которым идёт "дырка" в значениях. Одной вполне хватит.

 

Однако, выходит так, что это правило не соблюдается для "таблиц, рождённых массивами". Т.е. к примеру в этом случае

t = {1, 2, nil, 4}

мы получим 4 в качестве длины. В принципе, это можно понять, если рассмотреть реализацию таблиц, описанную автором в статье The implementation of Lua 5.0. В каждой таблице есть часть "линейный массив" и часть"хэш-массив". При создании с помощью конструкции {a, b, c, d, e} очевидно всё попадает в часть линейного массива, а оператор длины видимо в этом случае оптимизирован и вместо перебора просто берёт длину массива.

Если же создавать массив вразнобой, типа такого:

t = {}

t[4] = 4

t[2] = 2

t[1] = 1

то в этом случае элементы попадут в хэш-таблицу. Оператор длины сначала посмотрит линейную часть, ничего там не найдёт и затем уже начнёт перебирать оставшиеся элементы из хэш-части, а там уже чёстно найдёт разрыв в значениях и до индекса 4 не дойдёт. В общем всё логично, хотя и выглядит как недокументированная фича. Причём именно фича, а не баг, поскольку это даёт возможность таки перебирать элементы массива пусть и со значениями nil.

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

malandrinus

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

Считаю главной фичей этого редактора саму возможность что-то изменять во внутренних настройках.

Р.S. Поверь, не хотел и больше не хочу упоминать запрещенную тобой тему редакторов. Если кому что то нужно, ссылка уже есть. Достаточно.

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

malandrinus

В отличии от модераторов/кураторов у обычных пользователей отсутствует возможность вносить правки (редактировать) в свои посты спустя 15 мин после его опубликования.

Моя фраза была уже опровергнута постом #30 Gun12, и то, что я не отреагировал на нее в своем ответном посте - означает согласие (молчание знак согласия). Там же, в моем ответе приведен вариант, качающийся исходного вопроса с учетом всех особенностей (включая и тобою упомянутых познее) применения оператора # в общем алгоритме. Вот критика всего конечного алгоритма способа опредеоения типа таблицы была бы полезна.

Вероятно не стОит задаваться вопросом "Почему два?" по поводу некорректности/неправильности фразы, как уже один раз опровергнутой. Иначе придется каждый раз писать поправки/подтверждения/опровержения ранее сказанному по каждому поводу.

 

По редактору: В самом начале мною было высказано мнение, что каждый выбирает себе инструмент "по руке и по задаче". Можно много на эту оффтопную тему высказывать мнений и пр., но ... большей частью все это будет в пустоту, потому что каждому из нас, твоими же словами, "как-то лениво" съезжать с насиженного и переезжать на малоизвестное и пока неудобное.

Единственное все же хотелось бы тут упомянуть в дополнение к перечисленному тобою "перечню жизненно важных для программисткого редактора фишек":

Достоинство SciTE для данного раздела "Школа модинга" в том, что он имеет встроенный русский мануал по Lua, который неплохо иметь под рукою любому модмейкеру и то, что не теряя времени на запуски/перезапуски целевой программы (той же игры), т.е. непосредственно в редакторе и даже не записывая чего-либо на диск, можно писать и перепроверять локальные небольшие куски функций/формул, чего не дают иные редакторы.

 

====================================================

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

Вопрос: Нет ли каких "подводных камней" или иных "недокументированных фич" в применяемых ниже операторах/методах, которые могут повлиять не корректность результата?

local Number = 9 --/ 10,16,100, ...
local abs = Number == math.modf(Number) and math.abs(Number) --/ модуль целочисленного числа

if abs then --/ целочисленное?
  local n = math.floor( math.log10( abs + 1) ) --/ степень ближайшего к модулю бОльшего числа кратного 10-ти
  if abs >= 10^n and abs < 2^(4*n) then
    return true --/> кол-во разрядов 'dec' > 'hex'
  end
end

Пояснение: Требуется определить, что десятичное число (любое - целое/дробное/отриыательное) лежит в диапазонах 10...15, 100...255, 1000...4095 и т.д.

т.е. тогда, когда количество разрядов десятичного значения числа 'Number' больше кол-ва разрядов этого же числа в шестнадцатиричной форме.

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

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

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

В рубордовской версии SciTE так и не нашёл возможности ставить точки останова. Непонятно, как отлаживать программу. Кто-нибудь знает?

 

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

Artos,

  Цитата
Моя фраза была уже опровергнута постом #30 Gun12

Извиняюсь, невнимательно читал.

 

  Цитата
Достоинство SciTE для данного раздела "Школа модинга" в том, что он имеет встроенный русский мануал по Lua, который неплохо иметь под рукою любому модмейкеру и то, что не теряя времени на запуски/перезапуски целевой программы (той же игры)

Я себе давно наладил тестовый полигон для запуска скриптов в игре без перезгарузки. Запуск в игре имеет свою ценность, поскольку скрипт тестируется именно там, где будет реально применяться.

 

Gun12,

  Цитата
запрещенную тобой тему редакторов

Ощущаю себя исчадием модераторского ада :shok: ... Я не запрещал. Во-первых, я не могу ничего запретить, поскольку всего лишь куратор. Во-вторых, я сказал, что буду тереть бессмысленный флуд. То, что навалили здесь в самом начале, не содержало ни грамма информации, сплошное меряние ... редакторами.

 

 

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

Artos,

  Цитата
Требуется определить, что десятичное число (любое - целое/дробное/отриыательное) лежит в диапазонах 10...15, 100...255, 1000...4095 и т.д.

А почему не хочешь сделать по-простому, с перебором диапазонов и проверкой на вхождение в них? На мой взгляд, это даже будет быстрее работать.

Изменено пользователем malandrinus
  Полезный утиль (Показать)
Ссылка на комментарий
  Цитата
malandrinus: А почему не хочешь сделать по-простому, с перебором диапазонов и проверкой на вхождение в них?
Потому что:

- этот вопрос в первую очередь преследует цель получить информацию по применяемым функциям/операторам и возможным их 'закидонам' (по аналогии с оператором #) ...

- в данном случае, даже если и имеется потеря некоторой доли скорости выполнения, то а) вычисления в игре производятся в моменты (в основном создание сэйвов), когда лишняя пара милисекунд не важны, и б) компактность кода и универсальность формул также немаловажные критерии. Учитывая диапазон разрядов применяемых в игре (float -> 10 разрядов), то использование проверок 2х9-ти диапазонов (считая отрицательные) далеко не всегда будет выигрышным по скорости;

Вот это полная функция:

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

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

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

Artos,

  Цитата
1. Что мешает поделиться опытом, а не поверхностной 'частной' информацией? ;-)

Эээ... два года как это уже сделал

 

  Цитата
4. В данном топике мы говорим с ориентиром на Lua, а игра вторична или ... наоборот? ;-)

игра - это предметная область, которая даёт реальные задачи, решение которых и побуждает изучать Lua.

 

Gun12,

у меня просьба. Не мог бы ты завершить свой введение в SciTE и дополнить его краткой информацией о том, как можно запустить написанный скрипт. Вот ты написал:

  Цитата
После этого запустить SciTE, написать - print('Hello Word')

В открывшейся консоли должно напечатать - Hello Word

Написать где, в тексте документа? А почему консоль должна открыться? Что-то надо нажать? Попробуй представить себе, что аудитория нулевая и никаким сторонним багажом не обладает.

 

И, если знаешь, то не мог бы подсказать уже для меня, как в рубордовской версии поставить точку останова?

  Полезный утиль (Показать)
Ссылка на комментарий
  malandrinus писал(а):
...точку останова

Извини, никак не пойму что это за точка такая?:blush:

Может я и знаю что это такое, но по-своему.

P.S. Попробую дописать про SciTE.

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

malandrinus

По п.4: Это все же НЕ ответ координатора (ИМХО).

- или Lua первичен, остальное вторично - в этом случае дефолтно в вопросах/ответах подразумеваются общее именно для Lua контента и уже потом для конкретной частности;

- или Игра первична - в этом случае вопрос/ответ подразумевает в первую очередь именно контент и особенности Игры, а не всевозможности/извраты/недоступности всего/чистого Lua;

- или 'демократия' - каждый говорит о своем, кто про чистый Lua, кто про портированный кусок квази-Lua в Игре, кто просто про игру ...

Каков ответ координатора о первичности? :-)

 

По полигону: Для Игры (и то с тобою же высказанными ограничениями и частностями) вариант вполне возможен, но ... для вероятно 70% игроков/модмейкеров неприемлем/затруднителен (ЧН/ЗП, нет второго компа, коды именно 3-й категории ошибок, ...). Для изучения Lua - практически не пригоден (более схожь с "чесать ногою ухо"). ИМХО.

 

Пока Gun12 не написал введение по SciTE, отвечу для тех, кто пока не понял:

- Писать код (print('Hello Word')) нужно конечно же в документе. Однако, дефолтно открытое первичное окно ("Безымянный") не имеет расширения, что не дает интерпретировать какие команды допустимы ... Следует этот дефолтно открытый документ сохранить с требуемым расширением и тогда - доступны все свойства данного документа/файла.

- Консоль открывается автоматически при наличии информации предназначенной для вывода из кодов в консоль.

 

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

malandrinus

Из твоего описания "полигона":

  Цитата
Путём экспериментов я выяснил, что текущим каталогом Lua считает папку bin

Вероятно да. Однако, в том же NLC6 (использован Lua-перехватчик by aplet), фокус передается в корень игровой папки (т.е. на верхний уровень относительно 'bin').

Вопросы: (касательно Lua в игре Сталкер)

Есть ли способ определить текущий каталог для Lua однозначно и быстро, т.е. не экспериментально?

Есть ли способ изменять текущий каталог Lua и/или хотя бы организовать типа удобного линка на него?

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

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

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

Собственно к ответу Artos-а остаётся только добавить.

 

При выполнении файла с расширением .lua, в SciTE выполняется команда из lua.properties :

command.go.*.lua=lua "$(FilePath)"

Т.е. запускается командная консоль lua, находящаяся по адресу, например, C:\Program Files\Lua\5.1\lua.exe

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

Например при выполнении команды "Поиск в файлах" в ней выводятся все файлы с найденным вхождением.

Двойной клик на найденном результате открывает файл, содержащий искомую строку.

Консоль можно открывать/закрывать принудительно "горячей" клавишей F8.

 

Вы можете открыть и сам файл C:\Program Files\Lua\5.1\lua.exe. Появится окно, аналог CMD. Набирать код и получать результат можно и в этом окне.

SciTE как бы разделяет эти операции. Код пишется в окне текстового (скриптового) редактора, а результат в описанном выше окне консоли.

Удобство работы с кодом CMD и тем же кодом в SciTE не подлежит сравнению.

Благодаря этой возможности, любители работы в CMD могут вызвать оную, и работать в окне консоли в режиме обычного текстового редактора.

Напишите в файле *.lua :

os.execute('cmd')

И нажмите F5.

 

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

 

Чуть не забыл. Если Вы работаете в CMD, или Ваш скрипт "завис" можно принудительно остановить его выполнение комбинацией Ctrl+Break.

 

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

  malandrinus писал(а):
И ещё. Это всё работает для ТЧ. Для ЧН мне наладить такой же полигон не удалось. Что-то там изменено в движке, что вызывает у него аллергию на функцию pcall.

А на хpcall тоже?

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

Gun12,

  Цитата
Извини, никак не пойму что это за точка такая?:blush:

Может я и знаю что это такое, но по-своему.

Точка останова для отладчика, иначе breakpoint. Это чтобы остановить в нужном месте программу, посмотреть что и как, затем продолжить дальше. Также при наличии отладчика обычно имеется возможность выполнять программу по шагам. В том SciTE, что идёт вместе с Lua, эти команды вынесены прямо на тулбар. А есть отладчик в рубордовском варианте или вообще нет, пока не понял.

 

Artos,

  Цитата
Каков ответ координатора о первичности? :-)

Зачем так усложнять? Первично то, что будет поддерживать интерес к этой теме.

 

  Цитата
Есть ли способ определить текущий каталог для Lua однозначно и быстро, т.е. не экспериментально?

Есть ли способ изменять текущий каталог Lua и/или хотя бы организовать типа удобного линка на него?

по большому счёту, кроме как применительно к пространству имён io понятие текущего каталога больше никак и не использовать. Кроме того, в стандартной библиотеке Lua такого и понятия не вводится явно, как нет и средств управления текущим каталогом. Я бы старался избегать использования каталога "по умолчанию" хотя бы в силу того, что он именно в игре неизвестно какой. Вместо этого, лучше использовать явно заданные абсолютные пути. В движке есть класс FS, который позволяет узнать все пути к каталогам игры.

 

В полигоне я использовал текущий каталог, но мог бы вместо этого использовать класс FS, выяснить каталог со скриптами и использовать его полный путь вместо текущего пути "." (точка - текущий каталог). На тот момент использовать текущий путь казалось проще, кроме того на тот момент я вполне возможно не знал ещё, как пользоваться классом FS в полной мере, только и всего =)

 

Gun12,

  Цитата
Собственно к ответу Artos-а остаётся только добавить.

т.е. для запуска надо нажать F5 или такую зелёную кнопочку со стрелочкой вправо на тулбаре, или из меню "Tools" выполнить команду "Go". Я правильно понял? =)

 

  Цитата
А на хpcall тоже?

а, с тех пор много воды утекло, и я уже выяснил, в чём была проблема. Вылет вызывало использование техники выдачи сообщения в лог get_console:execute("text"). Причём, что самое неприятное, вылет происходил не сразу, а позже, и иногда его не было. Поэтому я долго думал, что проблема в чём-то другом. Так что в общем проблемы нет, надо просто использовать вывод в произвольный файл через пространство имён io (благо в ЧН/ЗП оно уже есть). Это в общем и удобнее намного, поскольку можно выводить в разные файлы и в логе нет мусора.

 

В модифицированном движке можно добавить нормальный вывод в лог (а не как побочную реакцию на ошибочную команду). Тоже будет работать.

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

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

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

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

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

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

Войти

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

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

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