выйти читать как нулевое поле?

Я делаю файл меню для своей игры, и он не может вызвать «выход» как поле. Он всегда возвращает ноль. Кто-нибудь может сказать мне, почему это происходит? Обратите внимание, что она объявлена ​​ранее в коде, а другая функция кнопки работает. Спасибо!

function love.mousepressed( x, y, button )
  if button == "l" then
    for k, v in pairs(buttons) do
      local ins = insideBox( x, y, v.x - (v.w/2), v.y - (v.h/2), v.w, v.h)

      if ins then
        if v.action == "play" then
          loadState("game")
        end
      end
      if ins then
        if v.action == "quit" then
          love.event.quit()
        end
      end
    end
  end
end

person Taylor Brown    schedule 22.10.2015    source источник
comment
Что именно не работает? Вы не можете инициировать вызов love.event.quit()? Или вызов love.event.quit() ничего не делает?   -  person Etan Reisner    schedule 22.10.2015
comment
love.event.quit() срабатывает, но поле quit возвращается как nil. Я думал, что это может быть часть v.action == quit, но она вызывается ранее в коде.   -  person Taylor Brown    schedule 22.10.2015
comment
Вы ничего не делаете с возвращаемым значением love.event.quit(), поэтому я не знаю, откуда вы знаете, что оно возвращает. Вы имеете в виду, что это просто не выход из вашей игры? Является ли love.event.quit() функцией, которую вы написали? Если это так, включите его в свой пост.   -  person Etan Reisner    schedule 22.10.2015
comment
love.event.quit() встроен в движок love2d, и я считаю, что он не принимает аргументы и ничего не возвращает, и он должен работать так, как есть. Я заставил его работать с функцией love.keypressed, но mousepressed никогда не работает для меня.   -  person Taylor Brown    schedule 22.10.2015
comment
Вы уверены, что блок if выполняется? Можете ли вы вывести значение button, ins и v.action в случае сбоя?   -  person Etan Reisner    schedule 22.10.2015
comment
Я совершенно уверен, что и функция Start работает. Это просто чтение выхода как ноль, вот что мне интересно   -  person Taylor Brown    schedule 22.10.2015
comment
Что означает reading the "quit" as nil? Вы нигде не используете возвращаемое значение love.event.quit(), поэтому вы не можете видеть его, чтобы знать, что это было nil. Вы имеете в виду, что вы получаете сообщение об ошибке для attempt to call nil? Что точно вы видите, что заставляет вас сказать "quit" as nil?   -  person Etan Reisner    schedule 22.10.2015
comment
Точное сообщение Попытка выхода из поля индекса (нулевое значение). Я использовал love.event.quit() раньше, и он должен работать без возврата или без необходимости передавать ему аргументы. По какой-то причине он индексирует поле.   -  person Taylor Brown    schedule 23.10.2015
comment
Вы можете использовать эту функцию в другом коде, который вы сказали? Какая версия любви? Вам нужно вручную загружать love.event в свой код, чтобы это работало? Вы случайно перезаписали где-то love или love.event в своем коде?   -  person Etan Reisner    schedule 23.10.2015
comment
Я заставил его работать в другой игре, используя функцию love.keypressed и тот же самый love.event.quit(), и он также работал с love.event.push('quit') в функции love.keypressed . Это только терпит неудачу, когда я начал использовать мышь.   -  person Taylor Brown    schedule 23.10.2015
comment
Подождите, Попытка выйти из поля индекса (нулевое значение)? Вы уверены, что использовали love.event.quit() Вы уверены, что это код, который выдает эту ошибку? Потому что попытка проиндексировать означает, что вы пытались сделать love.event.quit.something или love.event.quit['something'] или что-то подобное, а не то, что вы использовали love.event.quit(), поскольку это будет означать что-то вроде attempt to call field 'quit' (a nil value).   -  person Etan Reisner    schedule 23.10.2015
comment
Я, конечно, использую love.event.quit(), я могу попробовать что-то еще, если это не сработает, спасибо за помощь на данный момент   -  person Taylor Brown    schedule 23.10.2015
comment
Проверьте наличие необычных символов в этом коде. Затем абсолютно убедитесь, что именно эта строка вызывает эту ошибку, потому что, по крайней мере, со стандартным lua, эта ошибка не должна возникать из-за такого использования.   -  person Etan Reisner    schedule 23.10.2015
comment
@TaylorBrown Он не сказал, что вы не используете love.event.quit(), он сказал, что эта строка, вероятно, не виновата. В показанном коде нет ничего, что индексировало бы переменную с именем quit, поэтому проблема, вероятно, где-то еще. Если вы получаете сообщение об ошибке, включите это в свое сообщение, включая всю трассировку стека, и убедитесь, что соответствующий код есть в сообщении. Сказать, что он возвращает nil, объективно неправильно, это не проблема, с которой вы столкнулись, и кому-либо очень трудно вам помочь.   -  person Mud    schedule 23.10.2015


Ответы (1)


Зачем вам play и quit привязывать к одной и той же кнопке? о.О

Кроме того, нет необходимости дважды проверять ins. Дублирующийся код должен быть красным флажком:

  if ins then
    if v.action == "play" then
      loadState("game")
    end
  end
  if ins then
    if v.action == "quit" then
      love.event.quit()
    end
  end

Это может быть:

  if ins then
    if v.action == "play" then
      loadState("game")
    elseif v.action == "quit" then
      love.event.quit()
    end
  end

Но если не использовать отладчик, вот как вы отслеживаете такие проблемы:

1. Создайте файл с именем conf.lua в папке вашего проекта.

2. В нем должно быть как минимум столько, чтобы прикрепить консоль к вашему приложению:

function love.conf(t)
    t.console = true  -- Attach a console (Windows only)
end

3. Добавьте выходные данные отладки в свою функцию mousepressed, чтобы вы могли видеть, что происходит.

Сначала определите это где-то в начале выполнения вашего приложения. Удобная функция печати:

 function printf(...) print(string.format(...)) end

Затем добавьте некоторые отладочные материалы в свою функцию:

 function love.mousepressed(x, y, button)
     print('mouse button %d pressed at %d, %d', button, x, y)
     if button == "l" then
         printf('checking %d buttons', #buttons)
         for k, v in pairs(buttons) do
             local ins = insideBox( x, y, v.x - (v.w/2), v.y - (v.h/2), v.w, v.h)
             printf('%d, %d is%sinside button %s (%d, %d, %d, %d)',
                 ins and ' ' or ' not ', k, x, y, v.x, v.y, v.w, v.h)
             if ins then
                 print('executing action', v.action)
                 if v.action == "play" then
                     loadState("game")
                 elseif v.action == "quit" then
                     love.event.quit()
                 end
             end
         end
     end
 end

Вы также должны использовать осмысленные имена переменных. v может быть button. Что такое k? Индекс? Тогда, возможно, i или index. Это имя? Затем name. Так далее и тому подобное. k ничего нам не говорит.

person Mud    schedule 23.10.2015