Кто-нибудь может помочь мне понять этот анимационный 2d код в lua?
Я новичок, как вы можете видеть, и я следил за видео-учебником по развёртыванию с lua о 2D анимации с тех пор, как я задал мне вопрос об этом коде, почему локальная переменная currentAnimation равна 0, а затем 1 в коде, затем о self.currentAnimation, как я понимаю, currentAnimation - это метод, потому что это действие, которое вызывается через self, чтобы объект мог двигаться правильно?
local currentAnimation = 0
function init(self)
msg.post(".", "acquire_input_focus")
end
function final(self)
end
function update(self, dt)
end
function on_message(self, message_id, message, sender)
end
function on_input(self, action_id, action)
if action_id == hash("right") and action.pressed == true then
if self.currentAnimation == 1 then
msg.post("#sprite", "play_animation", {id = hash("runRight")})
self.currentAnimation = 0
else
msg.post("#sprite", "play_animation", {id = hash("idle")})
self.currentAnimation = 1
end
end
if action_id == hash("left") and action.pressed == true then
if self.currentAnimation == 1 then
msg.post("#sprite", "play_animation", {id = hash("runLeft")})
self.currentAnimation = 0
else
msg.post("sprite", "play_animation", {id = hash("idle")})
self.currentAnimation = 1
end
end
конец
Какие шаги я должен выполнить, чтобы я мог изменить код таким образом, чтобы, нажимая стрелку вправо от ключевого слова, перемещался "герой", а когда я прекращал нажимать, "герой" прекращал двигаться, потому что с этим кодом он не прекращал двигаться пока я снова не нажму ту же кнопку, кстати, второй кусок кода делал это сам, следуя за первым.
Теперь у меня есть другой вопрос, я хочу, чтобы он прыгнул, когда я нажал назначенную кнопку:
if action_id == hash("jump") then
if action.pressed then
msg.post("#sprite", "play_animation", {id = hash("heroJump")})
self.currentAnimation = 0
else
msg.post("#sprite", "play_animation", {id = hash("idle")})
end
end
С этим кодом он не прыгает, я пробовал другой код, но действовал как цикл, делающий анимацию прыжка через овер, я просто хочу, чтобы он прыгал каждый раз, когда я нажимал назначенную кнопку.
1 ответ
currentAnimation
это, конечно, не метод, это поле таблицы с именем self
,
Кто-то может догадаться, какая цель достигается с помощью линии local currentAnimation = 0
, это никогда не используется впоследствии.
Похоже, что предоставленный вами код используется для описания поведения объекта (на самом деле, таблица lua). Согласно руководству в рамках defold, вы реализуете поведение, используя передачу сообщений между различными объектами и подписывая слушателей на событие, относящееся к вашему объекту. init
, final
,update
, on_message
и, что важно, on_input
все обработчики событий, которые вы определяете для определенных событий. Затем игровой движок вызывает их всякий раз, когда решает это сделать.
При обработке события нажатой кнопки ваш объект использует линию
msg.post("#sprite", "play_animation", {id = hash("runRight")})
отправить сообщение движку, указывающее, что он должен что-то нарисовать и, вероятно, выполнить некоторые действия, определенные в другом месте.
Приведенный выше код реализует символ как простой конечный автомат. currentAnimation
переменная, указывающая текущее состояние, 1
стоит на месте, 0
для бега. Код внутри if
Оператор обрабатывает переход между состояниями. То, как вы сейчас это делаете, потребует двух нажатий клавиш, чтобы изменить направление движения.
Ваш on_input
обработчик событий получает action
таблица, которая описывает событие, затем фильтрует события, обрабатывая только правую кнопку, нажатую if action_id == hash("right") and action.pressed == true then
(и ваше дополнение проверяет левую кнопку). Согласно документации, вы также можете проверить, была ли кнопка отпущена, проверив поле action.released
, Если вы хотите, чтобы символ остановился, вы должны добавить соответствующую ветвь в обработчик событий. Там есть куча примеров. Вы можете комбинировать их для реализации желаемого поведения.