Are you using anim8 for animation?

General discussion about LÖVE, Lua, game development, puns, and unicorns.
Post Reply
Tonmoy Mojumder
Prole
Posts: 12
Joined: Sat Oct 21, 2023 1:33 pm

Are you using anim8 for animation?

Post by Tonmoy Mojumder »

I am learning animation with anim8.I know about grid,animation.I code in a way that it plays infinite loop with true or false value.I want to how how to set in such a way to perform animation for once.Can anyone share sample anim8 frame project with me ?I want to learn the basic of frames and key events
Tonmoy Mojumder
Prole
Posts: 12
Joined: Sat Oct 21, 2023 1:33 pm

Re: Are you using anim8 for animation?

Post by Tonmoy Mojumder »

Here is sample code.I hoping someone to help

_G.love = require("love")

function love.load()
ani8 = require("lib.anim8.anim8")
player = {}
player.x = 100
player.y = 100
player.image = love.graphics.newImage('assets/spritesheet.png')
player.grid = ani8.newGrid(332,275,2656,1925)
-- player.animation = ani8.newAnimation(player.grid('1-8',1),0.2)
player.frame = player.grid('1-7',2)
player.animation = ani8.newAnimation(player.frame ,0.2)
-- 2,656 × 1,925
go = false;

end

function love.update(dt)
player.animation:update(dt)
if love.keyboard.isDown("d") then
go = true
end
end

function love.draw()
if go then
player.animation:draw(player.image,100 ,100)
end
end
User avatar
togFox
Party member
Posts: 779
Joined: Sat Jan 30, 2021 9:46 am
Location: Brisbane, Oztralia

Re: Are you using anim8 for animation?

Post by togFox »

https://github.com/kikito/anim8

local animation = anim8.newAnimation(frames, durations, onLoop)


onLoop is an optional parameter which can be a function or a string representing one of the animation methods. It does nothing by default. If specified, it will be called every time an animation "loops". It will have two parameters: the animation instance, and how many loops have been elapsed. The most usual value (apart from none) is the string 'pauseAtEnd'. It will make the animation loop once and then pause and stop on the last frame.
Current project:
https://togfox.itch.io/backyard-gridiron-manager
American football manager/sim game - build and manage a roster and win season after season
Tonmoy Mojumder
Prole
Posts: 12
Joined: Sat Oct 21, 2023 1:33 pm

Re: Are you using anim8 for animation?

Post by Tonmoy Mojumder »

How do you handle animation?I handle with true or false.But it is not a good way.Because It repeats everytime .
I cloned your strike project:
In the assets
IMAGE[enum.imageSheetBattleshipSinking] = love.graphics.newImage("assets/images/battleshipsinkingsheet.png")
F
The picture is missing.
User avatar
togFox
Party member
Posts: 779
Joined: Sat Jan 30, 2021 9:46 am
Location: Brisbane, Oztralia

Re: Are you using anim8 for animation?

Post by togFox »

I used anim8 for a very long time while learning love. I then realised I could roll my own animations by tracking some very simple properties and quads:

- which frame to show
- how quickly to change frames
- how much time is left on this frame
- how many frames in total
- should this loop?

And then basic draw data you need for normal images: X, y, rotation etc.

Anim8 has limitations (all libraries do) so this wasn't hard and gives me options.

Sorry about that missing image. I'm usually very disciplined that way. For testing purposes just use the file name

destroyersinkingsheet.png
Current project:
https://togfox.itch.io/backyard-gridiron-manager
American football manager/sim game - build and manage a roster and win season after season
User avatar
togFox
Party member
Posts: 779
Joined: Sat Jan 30, 2021 9:46 am
Location: Brisbane, Oztralia

Re: Are you using anim8 for animation?

Post by togFox »

You can see here I create a flame animation and add it to the animation table. Futher down I draw all animations on the animation table in a generic way.

During the update I do two things: reposition the animation because they are sometimes overlaid on top of a moving image and then decrease the timer so I know when to 'kill' the animation by removing it from the animation table.

Simples.


Code: Select all

function functions.addFlameAnimation(x, y, facingrad)
    -- flame animation
    local newanim = {}
    newanim.imageenum = enum.imageSheetSmokeFire        -- only the enum
    newanim.startframe = 9
    newanim.stopframe = 16
    newanim.linkobj = nil
    newanim.x = x
    newanim.y = y
    newanim.speed = 0.25       -- seconds per frame
    newanim.rotation = facingrad        -- radians
    newanim.currentframe = newanim.startframe
    newanim.timeleft = newanim.speed                -- how much time left on this frame
    newanim.kill = false
    table.insert(ANIMATIONS, newanim)
end

function functions.animationsdraw()
    love.graphics.setColor(1,1,1,1)
    for k, anim in pairs(ANIMATIONS) do
        -- calculate the offset
        local xoffset, yoffset
        if anim.xoffset == nil then
            xoffset = FRAMES[anim.imageenum].width / 2
        else
            xoffset = anim.xoffset
        end
        if anim.yoffset == nil then
            yoffset = FRAMES[anim.imageenum].height / 2
        else
            yoffset = anim.yoffset
        end
        love.graphics.draw(IMAGE[anim.imageenum], FRAMES[anim.imageenum][anim.currentframe], anim.x, anim.y, anim.rotation, anim.xscale, anim.yscale, xoffset, yoffset)
    end
end

function functions.animationsupdate(dt)
    -- update all animations

    for i = #ANIMATIONS, 1, -1 do
        if ANIMATIONS[i].kill == true then
            table.remove(ANIMATIONS, i)
        else
            -- update the position of the animation if it is attached to a moving object
            if ANIMATIONS[i].linkobj ~= nil then
                obj = ANIMATIONS[i].linkobj
                if obj.physobj ~= nil then
                    local objfacing = obj.physobj.body:getAngle()           -- rads
                    local x, y = obj.physobj.body:getPosition()
                    ANIMATIONS[i].x = x
                    ANIMATIONS[i].y = y
                    ANIMATIONS[i].rotation = objfacing + math.pi / 2          -- rads. 90 deg = pi / 2
                end
            end

            ANIMATIONS[i].timeleft = ANIMATIONS[i].timeleft - dt
            if ANIMATIONS[i].timeleft <= 0 then      -- advance to the next frame
                ANIMATIONS[i].currentframe = ANIMATIONS[i].currentframe + 1
                ANIMATIONS[i].timeleft = ANIMATIONS[i].speed
                if ANIMATIONS[i].currentframe > ANIMATIONS[i].stopframe then
                    if ANIMATIONS[i].endless then
                        ANIMATIONS[i].currentframe = ANIMATIONS[i].startframe
                    else
                        table.remove(ANIMATIONS, i)
                    end
                end
            end
        end
    end
end

Current project:
https://togfox.itch.io/backyard-gridiron-manager
American football manager/sim game - build and manage a roster and win season after season
Post Reply

Who is online

Users browsing this forum: Ahrefs [Bot] and 53 guests