谁能帮我理解 lua 中的这个动画二维码?

can anybody help me to understand this animation 2d code in lua?

如您所见,我是初学者,从那以后我一直在关注 defold 的视频教程 lua 关于 2D 动画,我一直在问我一些关于这段代码的问题,为什么本地变量 currentAnimation 在代码上等于 0 a 然后等于 1,然后大约 self.currentAnimation,据我了解,currentAnimation 是一种方法,因为它是通过自身调用的动作,因此对象可以向右移动?

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

结束

我应该遵循什么步骤,以便我可以以某种方式更改代码,这样当我从关键字按下右箭头时,"hero" 移动,当我停止按下时,"hero" 停止移动,因为使用这段代码它不会停止移动,直到我再次按下同一个按钮,顺便说一句,第二段代码是在第一段之后自己完成的。

现在我有另一个问题,我想让它在按下指定按钮时跳转:

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

使用此代码它不会跳转,我已经尝试过其他代码但就像一个循环使跳转动画结束,我只想让它在每次按下指定按钮时跳转。

currentAnimation肯定不是方法,它是table的一个字段,恰好被命名为self

有人猜测 local currentAnimation = 0 行的目的是什么,之后就再也没有用过。

显然,您提供的代码似乎用于描述对象的行为(实际上,lua table)。根据 defold 框架中的 manual,您可以使用不同对象之间的消息传递以及通过为侦听器订阅与您的对象相关的事件来实现行为。 initfinalupdateon_message 以及重要的 on_input 都是您为特定事件定义的事件处理程序。然后,游戏引擎会在决定这样做时调用它们。

在处理按下按钮的事件时,您的对象使用行

msg.post("#sprite", "play_animation", {id = hash("runRight")})

向引擎发送消息,指示它应该绘制某些内容并可能执行其他地方定义的某些行为。

以上代码将字符实现为一个简单的 finite state automatacurrentAnimation是表示当前状态的变量,1表示静止,0表示运行。 if 运算符中的代码处理状态之间的转换。按照您目前的操作方式,需要两次按键才能改变 运行.

的方向

您的 on_input 事件处理程序接收 action table,它描述了该事件,然后它过滤仅处理按下右键 if action_id == hash("right") and action.pressed == true then 的事件(以及您添加的检查左键)。根据documentation, you can also check for button being released by checking field action.released. If you want the character to stop, you should add corresponding branch in the event handler. They have a bunch of examples那里。您可以将它们结合起来以实现您想要的行为。