Зачем вам 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
love.event.quit()
? Или вызовlove.event.quit()
ничего не делает? - person Etan Reisner   schedule 22.10.2015love.event.quit()
, поэтому я не знаю, откуда вы знаете, что оно возвращает. Вы имеете в виду, что это просто не выход из вашей игры? Является лиlove.event.quit()
функцией, которую вы написали? Если это так, включите его в свой пост. - person Etan Reisner   schedule 22.10.2015if
выполняется? Можете ли вы вывести значениеbutton
,ins
иv.action
в случае сбоя? - person Etan Reisner   schedule 22.10.2015reading the "quit" as nil
? Вы нигде не используете возвращаемое значениеlove.event.quit()
, поэтому вы не можете видеть его, чтобы знать, что это былоnil
. Вы имеете в виду, что вы получаете сообщение об ошибке дляattempt to call nil
? Что точно вы видите, что заставляет вас сказать"quit" as nil
? - person Etan Reisner   schedule 22.10.2015love.event
в свой код, чтобы это работало? Вы случайно перезаписали где-тоlove
илиlove.event
в своем коде? - person Etan Reisner   schedule 23.10.2015love.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.2015love.event.quit()
, он сказал, что эта строка, вероятно, не виновата. В показанном коде нет ничего, что индексировало бы переменную с именемquit
, поэтому проблема, вероятно, где-то еще. Если вы получаете сообщение об ошибке, включите это в свое сообщение, включая всю трассировку стека, и убедитесь, что соответствующий код есть в сообщении. Сказать, что он возвращает nil, объективно неправильно, это не проблема, с которой вы столкнулись, и кому-либо очень трудно вам помочь. - person Mud   schedule 23.10.2015