【问题标题】:one click animations with lua in LOVE一键动画与 lua in LOVE
【发布时间】:2020-09-24 17:23:21
【问题描述】:

我最近熟悉了 LOVE 2D 中的 lua 并观看了一些教程,现在正在尝试制作一个简单的游戏。游戏将展示一个可以奔跑的角色,当按下“空格”时,攻击(用他的剑攻击)。当按下“空格”时,它应该通过攻击动画的所有帧/精灵。但是角色并没有遍历所有帧,并且它们之间的间隔似乎非常快,即使我将其保持在最低限度。

这是我用来说明按键的代码。

self.animations = {
        ['idle'] = Animation{
            frames = {
                self.frames[1]
            },
            interval = 1
        },
        ['attack'] = Animation{
            frames = {
                self.frames[1], self.frames[2], self.frames[3], self.frames[4], self.frames[5], self.frames[6], self.frames[3]
            },
            interval = 0.25
        }
    }

    self.animation = self.animations['idle']
    self.currentFrame = self.animation:getCurrentFrame()

    self.behaviors = {
        ['idle'] = function(dt)

            if love.keyboard.wasPressed('space') then
                self.dy = 0
                self.state = 'attack'
                self.animation = self.animations['attack']
            elseif love.keyboard.wasPressed('up') then
                self.dy = -MOVE_DIST
            elseif love.keyboard.wasPressed('down') then
                self.dy = MOVE_DIST
            else
                self.dy = 0
            end
        end,
        ['attack'] = function(dt)
            self.animation = self.animations['attack']
            if love.keyboard.wasPressed('up') then
                self.dy = -MOVE_DIST
            elseif love.keyboard.wasPressed('down') then
                self.dy = MOVE_DIST
            else
                self.dy = 0
                self.state = 'idle'
                self.animation = self.animations['idle']
            end
        end

这是我负责过渡效果的动画类

Animation = Class{}

function Animation:init(params)
    --self.texture = params.texture
    self.frames = params.frames
    self.interval = params.interval or 0.05
    self.timer = 0
    self.currentFrame = 1


end

function Animation:getCurrentFrame()
    return self.frames[self.currentFrame]
end

function Animation:restart()
    self.timer = 0
    self.currentFrame = 1
end

function Animation:update(dt)
    self.timer = self.timer + dt

    if #self.frames == 1 then
        return self.currentFrame

    else
        while self.timer > self.interval do
            self.timer = self.timer - self.interval

            self.currentFrame = (self.currentFrame + 1) % (#self.frames + 1)

            if self.currentFrame == 0 then
                self.currentFrame = 1
            end
        end
    end
end

请帮忙。我希望我正确地问了这个问题。提前致谢。

【问题讨论】:

    标签: animation lua love2d


    【解决方案1】:

    真的不知道您如何处理按键代码中的状态,但这也可能是问题的一部分。 无论如何,您的 Animation:update 对我来说看起来很奇怪,我真的认为这是问题的中心。您可以使用一个简单的功能来代替它,它应该可以完美运行(如果您对此有任何疑问,请随时提出)。 如果您对调试器不太满意,您可以使用 love.graphics.print 将一些值打印到屏幕上(例如 self.currentFrame 或 self.timer 在这种情况下)以实时查看这些值的情况。

    function Animation:update(dt)
        self.timer = self.timer + dt/self.interval
    
        if self.timer >= #self.frames then
            self.timer = 0
        end
    
        self.currentFrame = Math.floor(self.timer)+1
    end
    

    还要注意 "Math.floor(self.timer)+1" 不能被 "Math.ceil(self.timer)" 替换,因为如果 self.timer == 0 它将返回 0(并且 lua 的数组从一)

    编辑: 它可能来自这里:

    
    ['attack'] = function(dt)
        self.animation = self.animations['attack']
        if love.keyboard.wasPressed('up') then
            self.dy = -MOVE_DIST
        elseif love.keyboard.wasPressed('down') then
            self.dy = MOVE_DIST
        else
            self.dy = 0
            self.state = 'idle'
            self.animation = self.animations['idle']
        end
    end
    
    

    我不知道你是如何处理你的输入的idle'和动画到animations['idle']

    如果没有更多代码,我无法为您做更多事情。

    【讨论】:

    • DeramMath 你的动画:更新更干净,谢谢你。但这并没有解决我的问题。
    • @prbiswas 我刚才编辑了我的答案,但显然我没有发布通知您的评论。希望编辑对您有所帮助,或者您找到了解决方案。
    猜你喜欢
    • 2013-09-17
    • 2014-02-20
    • 2016-12-15
    • 1970-01-01
    • 2023-04-01
    • 2020-09-08
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    相关资源
    最近更新 更多