当前位置: 首页 > 知识库问答 >
问题:

在LOVE中使用lua的一键动画

芮安顺
2023-03-14

我最近已经熟悉了LOVE2D中的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

请帮忙。我希望我问的问题是正确的。提前谢谢。

共有1个答案

薛烈
2023-03-14

我真的不知道你是如何处理按键代码中的状态的,但这也可能是问题的一部分。无论如何,你的动画:更新对我来说看起来很奇怪,我真的认为这是问题的中心。有一个简单的函数,你可以用它来代替,它应该可以完美地工作(如果你有任何问题,请随时问)。如果你对调试器不太满意,你可以使用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,它将返回0。timer==0(lua的数组从1开始)

编辑:它可能来自这里:


['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

我不知道你如何处理你的输入,因为‘love . keyboard . was pressed’如果不是一个love函数,但是如果‘up’和‘down’在最后一帧没有被按下,状态将回到‘idle ’,动画将回到动画[‘idle ’]

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

 类似资料:
  • Love 是 HTML5 开发的手机网页版的投票点赞系统。 前台用了 HTML5 技术。 后台使用了 JFinal。 love是客户端web工程。可以直接用浏览器运行。 在js目录里有config.js。这个是配置访问服务端的地址。 love_war是服务端。

  • Laravel Love Introduction Laravel Love is emotional part of the application. It let people express how they feel about the content.Make any model reactable in a minutes! There are many implementations

  • Love-Ethereum If winter comes , can spring be far behind ? ( P. B. Shelley , British poet ) 区块链最大的问题就是人们理解区块链需要时间 | 版本说明 | 区块链 | 以太坊 | 区块链开源学习项目 | 补充资料| 参与贡献| Progress 版本说明 Frontier 简单的介绍区块链基础知识,通过阅读此

  • 本文向大家介绍在Lua程序中使用SQLite的教程,包括了在Lua程序中使用SQLite的教程的使用技巧和注意事项,需要的朋友参考一下  SQLite导入 我们可以用一个简单语句导入SQLite库,假设Lua中正确实现并已完成。在安装过程中,文件夹libsql包含数据库相关的文件。   变量sqlite3将提供通过参照主sqlite3表访问该功能。 建立连接 我们成立了发起sqlite环境,然后创

  • 本文向大家介绍在Lua程序中使用MySQL的教程,包括了在Lua程序中使用MySQL的教程的使用技巧和注意事项,需要的朋友参考一下  导入MySQL 我们可以用一个简单语句导入SQLite库,假设Lua中正确实现并已完成。在安装过程中,文件夹libsql包含数据库相关的文件。   可变的MySQL将提供通过参照主MySQL表访问该功能。 建立连接 我们可以设立一个启动MySQL的环境,然后创建环境

  • 我有一个名为“DisplayPanel”的类(它扩展了JPanel),我在那里画了一个正方形,它来自一个名为“square”的类(它扩展了JComponent)。如何使用键在JPanel中移动矩形? 正方形类有通常的绘制方法: “squarishThing”是一个普通矩形: 问题是:与“游戏库”不同,尝试“手动”做这样的事情是相当令人困惑的。我不知道“while循环”去哪里了。我试图在显示面板中放