#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