Frank
Frank

Reputation: 19

error bad argument #1 to draw (drawable expected, got table), trying to animate a sprite for the main character

new to Lua and love. I'm trying to animate a character for my platform game. I know my key binds and all work but I have never animated before, so I don't even know if I'm going in the right direction or not. I've tried looking up guides so I can compare my code to someone else's but it seems that most of them are outdated. Originally my player was just a white rectangle but now im trying to actually give it a sprite.

Here's my 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, 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, b, collision)
end

function endContact(a, b, collision)
   mc:endContact(a, b, collision)
end

I don't believe that there is anything wrong with my main but i think it's necessary to recreate the problem (sorry if it makes this too long). Now my mc.lua is where I'm having the problem since im trying to animate the player themselves by giving them a jump idle and walk animation, I think i will give them a damaged and death animation later.

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, 32, spr_mc_idle:getWidth(), spr_mc_idle:getHeight())
idle = anim8.newAnimation(i('1-4', 1), 0.1)

spr_mc_jump = love.graphics.newImage("assets/mc sprites/1 Pink_Monster/Pink_Monster_Jump_8.png")
local j = anim8.newGrid(32, 32, spr_mc_jump:getWidth(), spr_mc_jump:getHeight())
jump = anim8.newAnimation(j('1-8', 1), 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.x, self.y)
end

This is most of my mc or player function, except for movement and such but this has all the code that I'm confused with. I'm pretty sure I wrote the code right I'm just confused on how to actually implement it now that I have it written down. I thought just doing the draw function would actually draw the idle version of the character but then there's where I get the error. If you need anymore code or anymore details just let me know. The error that this is happening at is

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'

Upvotes: 0

Views: 631

Answers (1)

Doyousketch2
Doyousketch2

Reputation: 2145

I haven't done any of that for a while, but I believe obj_mc, in this case, is a table of the frames. You need to loop through them during update.

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

They may have a built-in function that accomplishes some of that, so look for anything that resembles this in the Love2D forum.

Upvotes: 1

Related Questions