Log In  
Follow
Chronosv2

I'm a visually impaired gamer and aspiring game developer. I started out with QBasic, and have gradually grown to coding with Unity. I've been tinkering with PICO-8 for awhile and decided to start my game development journey over using it. Most of what I've learned is completely self-taught.

[ :: Read More :: ]

Hey there! I wrote a small library to make drawing numbers using sprites quick and easy using the output from string.format.
It can technically be used for non-integer values but any symbol that can't be drawn as a number will just be skipped over and a digit-wide space will be left. I wrote it this way so that you can draw a number with either leading zeroes or leading spaces.

There's also a version that allows you to have leading zeroes displayed as sprites too.

--sprite_num.lua
--[[
Description: Implements a function for drawing numbers out of sprites.
    Useful for non-text numbers, like scores for arcade games.
    Best used with numbers formatted with 'string.format'
Requirements:
    Number sprites need to be stored in contiguous order from 0-9 (0123456789)
Optional:
    A 'const' table containing the following:
    const.sprite_0 : Integer value holding the sprite ID of the 0 digit.
    const.number_width : Integer value holding the width of each number sprite.
    const.lz_sprite : Integer value holding the "Leading Zero" sprite for
        sprite_number_lz
    If the const table isn't used, this function call requires its optional arguments.
Usage: sprite_number(input,x,y,[sprite_0,sprite_w])
       sprite_number_lz(input,x,y,lz_sprite,[sprite_0,sprite_w])
    input : String of numbers.
    x : Integer providing the horizontal location of the top-left pixel of the first digit
    y : Integer providing the vertical location of the top-left pixel of the first digit
    sprite_0 : Integer providing the sprite ID of the 0 digit.
        (Required if not using const.sprite_0, or if using the sprite_w argument)
    sprite_w : Integer providing the width of each number sprite.
        (Required if not using const.number_width)
For sprite_number_lz:
    lz_sprite : Integer providing the "leading zero" sprite.
Example:
    const = {
        sprite_0=8,
        number_width=14,
    }
    sprite_number(string.format("%09i",score),352,7)  
    Draws a 9-digit zero-padded variable 'score' starting at 352,7, with the zero sprite
        at sprite 8 and the numbers 14 pixels wide.

    sprite_number(string.format("%9i",score),352,7,8,14)
    Draws a 9-digit space-padded variable 'score' starting at 352,7 but defines the zero
        sprite and width manually.  

    sprite_number_lz(string.format("%9i",score),352,7)
    Draws a 9-digit zero-padded variable 'score' using leading zero sprites.
]]

function sprite_number(input,x,y,sprite_0,sprite_w)
    --If 'input' can't be converted into a number, we can't operate on it.
    assert(tonumber(input) != nil,"Input "..input.." can't be converted into a number.")
    --Get the location for the 0 sprite in the graphics table
    if sprite_0 == nil then sprite_0 = const.sprite_0 end
    --Get the digit width
    if sprite_w == nil then sprite_w = const.number_width end
    --If sprite_0 is nil after trying to get its value, it wasn't set in const.sprite_0 or as an argument.
    assert(sprite_0 != nil,"Missing const.sprite_0 or sprite_0 argument. See documentation for details.")
    --If sprite_w is nil after trying to get its value, it wasn't set in const.number_width or as an argument.
    assert(sprite_w != nil,"Missing const.number_width or sprite_w argument. See documentation for details.")
    for i=1,#input do --Parse the number string
        local number = tonumber(sub(input,i,i)) --Convert a digit in the string to a number
        if number != nil then --If the value in 'number' is a number (not a space or some other symbol
            spr(sprite_0+number,x+((i-1)*sprite_w),y) --Draw it to the screen with the number sprite
        end
    end
end

function sprite_number_lz(input,x,y,lz_sprite,sprite_0,sprite_w)
    --If 'input' can't be converted into a number, we can't operate on it.
    assert(tonumber(input) != nil,"Input "..input.." can't be converted into a number.")
    --Get the leading zero sprite number
    if lz_sprite == nil then lz_sprite = const.lz_sprite end
    --Get the location for the 0 sprite in the graphics table
    if sprite_0 == nil then sprite_0 = const.sprite_0 end
    --Get the digit width
    if sprite_w == nil then sprite_w = const.number_width end
    --If sprite_0 is nil after trying to get its value, it wasn't set in const.sprite_0 or as an argument.
    assert(sprite_0 != nil,"Missing const.sprite_0 or sprite_0 argument. See documentation for details.")
    --If sprite_w is nil after trying to get its value, it wasn't set in const.number_width or as an argument.
    assert(sprite_w != nil,"Missing const.number_width or sprite_w argument. See documentation for details.")
    --If lz_sprite is nil after trying to get its value, it wasn't set in const.lz_sprite or as an argument.
    assert(lz_sprite != nil,"Missing const.lz_sprite or lz_sprite argument. See documentation for details.")
    local nz_reached = false
    for i=1,#input do --Parse the number string
        local number = tonumber(sub(input,i,i)) --Convert a digit in the string to a number
        if nz_reached then
            if number != nil then --If the value in 'number' is a number (not a space or some other symbol
                spr(sprite_0+number,x+((i-1)*sprite_w),y) --Draw it to the screen with the number sprite
                nz_reached = true --Non-zero digit reached
            end     
        else
            if number != nil then --If the value in 'number' is a number (not a space or some other symbol
                if number != 0 or i==#input then --If the number is non-zero or the last digi
                    spr(sprite_0+number,x+((i-1)*sprite_w),y) --Draw it to the screen with the number sprite
                    nz_reached = true --Non-zero digit reached
                else
                    spr(lz_sprite,x+((i-1)*sprite_w),y) --Draw it to the screen with the number sprite

                end
            end     
        end
    end
end

While I was fixing the "leading zeroes separate sprite" version I decided to make a second font to see how it looked.

P#144069 2024-03-21 20:57 ( Edited 2024-03-21 22:22)

Follow Lexaloffle:          
Generated 2024-04-19 17:10:30 | 0.105s | Q:5