ошибка неверный аргумент #1 для рисования (ожидаемая рисовка, полученная таблица), попытка анимировать спрайт для главного героя

#animation #lua #love2d

Вопрос:

новичок в Луа и любви. Я пытаюсь оживить персонажа для своей игры на платформе. Я знаю, что мои связки ключей и все остальное работают, но я никогда раньше не анимировался, поэтому я даже не знаю, иду ли я в правильном направлении или нет. Я пытался найти руководства, чтобы сравнить свой код с чьим-то другим, но, похоже, большинство из них устарели. Первоначально мой плеер был просто белым прямоугольником, но теперь я пытаюсь на самом деле придать ему спрайт.

Вот мой главный.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
 

Я не верю, что с моим основным что-то не так, но я думаю, что необходимо воссоздать проблему (извините, если это займет слишком много времени). Теперь у меня проблема с 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, 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
 

Это большая часть моей функции mc или плеера, за исключением движения и тому подобного, но в этом есть весь код, с которым я путаюсь. Я почти уверен, что написал код правильно, я просто не понимаю, как его на самом деле реализовать теперь, когда он у меня записан. Я думал, что просто выполнение функции рисования на самом деле нарисует простаивающую версию персонажа, но тут я получаю ошибку. Если вам понадобится еще код или какие-либо подробности, просто дайте мне знать.
Ошибка, из-за которой это происходит, заключается в

 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'
 

Комментарии:

1. В какой строке# возникла ошибка?

2. Мои извинения, я думал, что добавил, что ошибка происходит в строке 41 mc.lua

3. Ошибка заключается в том, что walk (переменная, содержащая анимацию) не может быть отображена на экране. Попробуйте убедиться, что вызовы API, которые вы вызываете, возвращают «рисоваемый» объект-или объект вообще.

4. Я немного запутался в том, что вы имеете в виду, разве я не говорю ему возвращать изображения, которые, по моему мнению, являются самими объектами? Или я что-то пропустил?

Ответ №1:

Я не делал ничего из этого некоторое время, но я считаю 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.

Комментарии:

1. В функции anim8, которую я использую, уже встроен цикл.

2. Вы бы так подумали, но, очевидно, нет. obj_mc-это таблица. Error MC.lua:41: bad argument #1 to 'draw' (Drawable expected, got table) Вы не можете рисовать таблицы. Для начала попытайтесь понять, что там внутри. for i=1, #obj_mc do print( type( obj_mc[i] ) end