Ответы пользователя по тегу Lua
  • Ошибка при запуске скрипта Lua?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Ошибка "bad argument #1 to 'find' (string expected, got nil)" переводится буквально:
    плохой аргумент №1 для функции find (ожидается строка, но вместо неё имеем nil).

    Это значит, что переменная text у вас не задана (содержит значение nil).
    Да, прерывание скрипта происходит конкретно в этом месте, но реальная ошибка где-то в другом месте в соответствии с вашей задумкой, там и нужно будет исправить/дополнить.
    Ответ написан
  • Работа с временем в Lua?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Зависит от того, какие средства работы со временем предоставляются средой исполнения (то есть родительским приложением, куда встроен Lua).

    Например, если родительское приложение постоянно вызывает глобальную функцию Update(), а также доступна функция os.time(), то можно в самом начале засечь время, а потом периодически его считывать заново внутри Update(). Каждый раз сравниваем новое время с начальным. Как только разница будет больше 3 секунд, значит пора двигаться дальше. Как-то так.
    Ответ написан
  • Написал свой первый мини скрипт, но он не работает скажите что не так?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Главное, что не так - не соблюдены отступы.
    Если соблюдать, то все незакрытые end будут чётче видны.
    Ответ написан
  • Как правильно удалять элементы массива в LUA?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Вместо object[#object+1]=x лучше писать table.insert(object, x)
    Это так, к слову.

    А удалять со сдвигом можно через remove:
    table.remove(object, i)
    Это приведёт к удалению элемента с индексом i, а также к смещению всех последующих элементов на 1 влево, чтобы в таблице в итоге не было дырки.

    Считается, что это не самый оптимальный способ работы с массивами. Но так как это встроенная функция, и сам Lua написан на C, то получается довольно быстро в пределах нескольких сотен элементов.

    С учётом того, что игровые объекты у вас будут появляться/удаляться не каждый тик, а очень редко, такой способ вполне хорош.

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

    В зависимости от задачи, можно по-разному оптимизировать её решение.

    Если важен быстрый поиск (по ключу), то лучше использовать уникальный ключ вместо ничего не значащего порядкового номера.
    object[x.id] = x

    Перебор всех объектов будет возможен через pairs. Правда, без гарантии того, в каком порядке будет перебор:
    for k,v in pairs(object) do

    Если при этом нужно где-то считать количество всех объектов, то это можно делать в отдельной переменной. При таком подходе можно даже в случае безликих индексов наращивать их до бесконечности, не парясь о дырках, а перебор через pairs. В любом случае подсчёт количества - не проблема. Есть два варианта, как можно это делать:
    а) Если количество нужно редко, а добавление/удаление происходит часто, то считать можно каждый раз заново:
    local cnt = 0
    for _ in pairs(object) do
      cnt = cnt + 1
    end

    б) Если же количество нужно считать часто, а добавление/удаление объектов происходит редко, то лучше обновлять счетчик при добавлении и удалении:
    objects_cnt = 0 --всегда содержит количество объектов
    
    --добавление
    object[x.id] = x;
    objects_cnt = objects_cnt + 1;
    
     --удаление
    object[x.id] = nil;
    objects_cnt = objects_cnt - 1;
    Ответ написан
  • Как задать Lua ввод от пользователя?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Lua - встраиваемый язык.

    Поэтому нужно смотреть не на сам Lua, а на API, которое ему предоставляет внешняя среда - Coregames, а также на компоненты, которые там присутствуют и которые можно использовать. Эта среда и определяет, как будет выглядеть окно ввода, сколько там будет кнопок, какая функция Lua отвечает за ввод и т.д. Внутренние функции языка Lua могут быть изменены или вообще удалены, в зависимости от способа встраивания, защиты и т.д. Очень часто отключают библиотеки io и os, чтобы ограничить взаимодействия с системой и повысить безопасность.

    Документация по Coregames находится здесь: docs.coregames.com

    Вполне может быть такое, что Coregames вообще никак не предполагает ввод строки пользователем. Тогда придётся делать своё решение. А именно, нарисовать поле ввода, считывать отдельные клавиши, и формировать из них строку. Ещё вариант нарисовать кнопки на экране, чтобы пользователь мог их тыкать мышкой, постепенно формируя строку. Но это лишь предположение, что нет поддержки ввода строк. Точный ответ можно получить после прочтения всей документации.

    Например, в игре Tabletop Simulator тоже есть встроенный язык Lua. Поле ввода, как таковое, там не предусмотрено. Но зато через событие можно "ловить" в чате вводимые игроками сообщения. Также у игроков есть возможность задавать объектам имена и описания - их тоже можно считывать, используя в качестве альтернативы полю ввода. Эти компоненты определяются средой, то есть данной игрой, и язык Lua никак не может их создать из ничего или удалить из игры, но при этом Lua имеет к ним доступ, может получать оттуда значения или записывать новые значения туда. Таким образом, Lua использует те компоненты, которые определяются средой и которые описаны в документации.
    Ответ написан
  • Как сложить два числа в Lua в Coregames?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Не знаком лично с программой coregames (хотя спасибо, что уточнили).

    Однако навскидку могу предположить, что функция UI.PrintToScreen принимает только одну строку и не принимает никакие числа. Поэтому нужно число привести к строке:
    print=UI.PrintToScreen
    b=1;
    c=1;
    a =  b + c ;
    print (tostring(a))

    Того же эффекта можно достичь операцией конкатенации строк из-за автоматического приведения типов в Lua при использовании этой операции:
    print("The result = " .. a)

    Ну а если серьёзно подходить к вопросу, то вот в этом месте:
    сбой и все...

    Вы упускаете важную информацию. Характер сбоя многое говорит о проблеме. Печально, если приложение просто схлопывается или зависает. Но зачастую при ошибке оно выводит подробности ошибки. Например, это может быть что-то типа сообщения: "line 5 - количество и/или типы аргументов у функции неправильные". После этой инфы очень легко догадаться, в чём дело. Даже если вы сами не поняли смысл сообщения, в вопросе следовало бы указать все подробности сбоя, как он происходит и что выводит. Это вам совет на будущее.
    Ответ написан
  • Как реализовать скрипты уровней в Love2d?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Через require:

    require "boss"
    или
    require "boss.lua"
    Ответ написан
  • Как отключить сглаживание в love2d?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Создайте поверхность в 640 пикселей, и выводите всю графику на неё.
    При этом округляйте координаты, чтобы они все были целыми.
    Затем уже растягивайте поверхность на весь экран, используя фильтр nearest.
    Ответ написан
  • Как получать значения массивов из файлов в Love2d?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Для начала нужно определиться с форматом хранения в файле. Так как это Lua, то проще будет использовать какой-то текстовый формат (а не бинарный). Плюс удобство будет в том, что файл легко можно будет просматривать и/или редактировать в текстовом редакторе.

    Далее там определите для себя, какой будет формат в точности. Например, можно так:
    57,49,1|45,60,1|40,30,0
    Где первые две цифры - это X и Y, а последняя указывает на то, вертикальная стена или горизонтальная. Отдельные стены разделены символом |
    У вас будет, естественно, какой-то другой формат, в зависимости от игры.

    Далее необходимо почитать документацию к Love2D о том, как работать с файлами. Попробуйте создать файл, записать, прочитать и т.д., чтобы освоиться. Например, запишите числовую переменную x в файл, а потом прочитайте в переменную - y.

    Затем нужен алгоритм, которые разбивает строку на отдельные элементы таблицы. То есть сначала делит на куски, где разделитель "|". А потом каждый кусок тоже нужно поделить разделителем ",". Ну а дальше строковые кусочки переводим в числа, используя функцию Lua tonumber(). Затем их можно фасовать в любые структуры, какие хотите - любые таблицы, простые или сложно устроенные.
    Ответ написан
  • MTA (Multi Theft Auto) LUA - Почему выдает 0 или false?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Проблема может быть, в чём угодно.

    Незачем гадать и ломать голову. Займитесь отладкой.
    Хотя бы так:
    function playerRegister(login, password)
      outputChatBox('Enter playerRegister...')
      outputChatBox('login=',login,' password=',password)
      local player = source
      outputChatBox('player=',player)
      local mynick getPlayerName(source)
      outputChatBox('mynick=',mynick)
      local mylogin = getAccount(login)
      outputChatBox('mylogin=',mylogin)
      local mypassword = getAccount(password)
      outputChatBox('mypassword=',mypassword)
      if not getAccount(login) then
        outputChatBox('Creatre new account (' .. tostring(login) .. ')...')
        addAccount(login, password)
        outputChatBox('dbQuery:')
        local query = "INSERT INTO users(login, nickname, password, status, hp, money, level) VALUES("
          .. tostring( mylogin ) .. ", " .. tostring( mynick ) .. ", " .. tostring( mypassword ) .. ", 1, 100, 1500, 16)"
        outputChatBox(query)
        dbQuery(db, query)
        outputChatBox('Аккаунт успешно создан.', player)
      else
        outputChatBox('Аккаунт с таким логином существует!', player)
      end
    end
    addEvent('playerRegister', true)
    addEventHandler('playerRegister', root, playerRegister)

    Шанс угадывания - не 100%. Но с помощью отладки в мире программирования можно гарантированно докопаться до причины.
    Ответ написан
  • MTA (Multi Theft Auto) LUA - Что не так с моим запросом в базу данных?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    В Lua можно только цифры склеивать со строками с автоматическим приведением типов.
    Остальные типы нужно вручную приводить к строкам.

    Поэтому вместо:
    ", " .. mypassword .. ", 1, 100, 1500, 16)"
    Нужно:
    ", " .. tostring(mypassword) .. ", 1, 100, 1500, 16)"
    Ответ написан
  • Можете снять обфускацию с кода (lua/glua)?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Видно же, что имена переменных все вырезаны.
    Вот здесь сразу ошибка синтаксиса, что бы ни было до и после:
    local ‪ =

    И glua практически ничем не отличается от lua, кроме дополнительного сишного синтаксического сахара.
    Ответ написан
  • Как сделать процедурную генерацию для 2d рогалика на löve2d?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Двигать их во все стороны до тех пор, пока они не перестанут перекрывать друг друга.

    Чтобы не перебирать всех со всеми, я бы сделал тепловую карту в виде двумерного массива, каждая ячейка которого хранила бы число прямоугольников над ней. Но не факт, что так оптимальнее по скорости будет. Как идея.
    Ответ написан
  • Как сделать прокрутку уровня в love 2d?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    • Хранить горизонтальное смещение в отдельной переменной.
    • Каждый тик прибавлять к нему число, когда scrollLeft = true.
    • Все игровые объекты рисовать с учётом этого смещения.
    Ответ написан
  • Как управлять альфа каналом?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    love.graphics.setBlendMode("alpha")
    love.graphics.setColor(1, 1, 1, 0.5)
    Ответ написан
  • Как проверить является ли игрок богом?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Попробуй так:
    function GM:InitPostEntity()
    	print( LocalPlayer():HasGodMode() )
    end
    Ответ написан
  • Как найти данные в файле?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    for line in f:lines() do
      if line:match(nick) then
        found = true
        print(line)
        break
      end
    end
    if not found then
      print('ошибка')
    end
    Ответ написан
  • Как удалить обекты в corona?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    obj:removeSelf();

    Плюс к этому нужно удалить все ссылки на этот объект, чтобы сборщик мусора мог его вычистить из памяти. Примерно так:
    event.object1:removeSelf();
    event.object1 = nil;

    В общем, зависит от кода игры. То есть если где-то есть списки объектов, то в них тоже нужно удалять. Короче, общий принцип такой - просто присвоение nil переменной:
    obj = nil;
    Ответ написан
  • Какую программу для разработки игр 2d для Android и iOS на языке Lua выбрать?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Unity + MoonSharp

    Кроссплатформенные игры, очевидно, делать лучше на Unity. И важно понимать, зачем вам Lua. Надеюсь, не для галочки и не затем, что вы его просто знаете. В любом случае, Lua прикручивается практически к чему угодно, в том числе к Unity в виде лучшей (имхо) реализации с названием MoonSharp.
    Ответ написан
  • Как на языке Lua сделать POST запрос к сайту?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    В самом языке Lua нет возможности взаимодействовать с Интернетом.

    Чтобы эту возможность добавить, нужно задействовать какое-нибудь расширение. Например, LuaSocket. Или можно написать своё. В любом случае, это будет на стороне ядра приложения, куда встраивается Lua. А в самом языке будет лишь доступ к предоставляемому приложением API.
    Ответ написан