问题描述
Lua 的新手和爱。我正在尝试为我的平台游戏制作角色动画。我知道我的按键绑定和所有工作,但我以前从未动画过,所以我什至不知道我是否朝着正确的方向前进。我曾尝试查找指南,以便将我的代码与其他人的代码进行比较,但似乎其中大多数已经过时。最初我的播放器只是一个白色矩形,但现在我试图给它一个精灵。
这是我的 main.lua
local STI = require("sti")
local anim8 = require('anim8')
require("MC")
function love.load()
map1 = STI("map/map1.lua",{"Box2d"})
Physics = love.physics.newWorld(0,0)
Physics:setCallbacks(beginContact,endContact)
map1:Box2d_init(Physics)
map1.layers.solid.visible = false
background = love.graphics.newImage("assets/Base pack/bg.png")
mc:load()
end
function love.update(dt)
Physics:update(dt)
mc:update(dt)
end
function love.draw()
love.graphics.push()
love.graphics.scale(5,3)
love.graphics.draw(background)
love.graphics.pop()
map1:draw(0,2,2)
love.graphics.push()
love.graphics.scale(2,2)
mc:draw()
love.graphics.pop()
end
function love.keypressed(key)
mc:jump(key)
if keypressed == "escape" then
love.event.quit(0)
end
end
function beginContact(a,b,collision)
mc:beginContact(a,collision)
end
function endContact(a,collision)
mc:endContact(a,collision)
end
我不认为我的主程序有什么问题,但我认为有必要重新创建这个问题(对不起,如果它太长了)。现在我的 mc.lua 是我遇到问题的地方,因为我试图通过给他们一个跳跃空闲和步行动画来为玩家自己设置动画,我想我稍后会给他们一个损坏和死亡的动画。
local anim8 = require('anim8')
mc = {}
spr_mc_walk = love.graphics.newImage("assets/mc sprites/1 Pink_Monster/Pink_Monster_Walk_6.png")
local w = anim8.newGrid(32,32,spr_mc_walk:getWidth(),spr_mc_walk:getHeight())
walk = anim8.newAnimation(w('1-6',1),0.1)
spr_mc_idle = love.graphics.newImage("assets/mc sprites/1 Pink_Monster/Pink_Monster_Idle_4.png")
local i = anim8.newGrid(32,spr_mc_idle:getWidth(),spr_mc_idle:getHeight())
idle = anim8.newAnimation(i('1-4',0.1)
spr_mc_jump = love.graphics.newImage("assets/mc sprites/1 Pink_Monster/Pink_Monster_Jump_8.png")
local j = anim8.newGrid(32,spr_mc_jump:getWidth(),spr_mc_jump:getHeight())
jump = anim8.newAnimation(j('1-8',0.1)
obj_mc = walk
function mc:load()
self.x = 100
self.y = 0
self.width = 20
self.height = 60
self.xvel = 0
self.yvel = 0
self.maxspeed = 200
self.acceleration = 4000 -- max speed
self.friction = 3900 -- how long it takes them to reach max speed
self.gravity = 1000
self.jumpAmount = -500
self.grounded = false
self.physics = {}
self.physics.body = love.physics.newBody(Physics,self.x,self.y,"dynamic")
self.physics.body:setFixedRotation(true)
self.physics.shape = love.physics.newRectangleShape(self.width,self.height)
self.physics.fixture = love.physics.newFixture(self.physics.body,self.physics.shape)
end
function mc:draw()
love.graphics.draw(obj_mc,self.y)
end
这是我的大部分 mc 或播放器功能,除了移动等,但这包含我混淆的所有代码。我很确定我写的代码是对的,我只是对如何实际实现它感到困惑,因为我已经把它写下来了。我以为只是执行 draw 函数实际上会绘制角色的空闲版本,但随后出现错误。如果您需要更多代码或更多详细信息,请告诉我。 发生这种情况的错误是
Error
MC.lua:41: bad argument #1 to 'draw' (Drawable expected,got table)
Traceback
[C]: in function 'draw'
MC.lua:41: in function 'draw'
main.lua:30: in function 'draw'
[C]: in function 'xpcall'
解决方法
我已经有一段时间没有这样做了,但我相信 obj_mc
在这种情况下是一个框架表。您需要在更新期间遍历它们。
local anim8timer = 0
local anim8index = 1
local anim8rate = 0.2 -- pick an animation rate that looks good for your game
function mc:update( dt )
anim8timer = anim8timer +dt -- add delta time
if anim8timer >= anim8rate then
anim8timer = anim8timer -anim8rate -- reset timer
anim8index = anim8index +1 -- next frame
if anim8index > #obj_mc then anim8index = 1 end -- loop frames
end
end
function mc:draw()
love.graphics.draw( obj_mc[ anim8index ],self.x,self.y )
end
它们可能有一个内置函数来完成其中的一些功能,因此请在 Love2D 论坛中查找与此类似的任何内容。