RPG Maker XP-VXA Bitmap Number

Version 1.5

This is a very basic script I wrote a while back for VX, then recently dug up and rescued for use in my XP projects. ... and then later on I used it again for VXAce. It's a pretty flexible script. A thing that has always bothered me is coming across a nice font, only to find that the kerning for numbers is inconsistent - seeing things like the play-time or similar jump about when a 1 appears, or worse, other numbers too.

This script allows you to use an image for numbers wherever you please. This isn't plug-and-play. If you want to see your image, you'll have to add the code where necessary.

Sample Bitmap

Huh? Oh fine here you go:

Use

  • Place contents.draw_bitmap_number(value, x, y, align, skin, offset) where you want your number to be, with the stuff between ( ) what you want them to be. Only value, x and y are required. You'll need bit of script understanding to use this.
    • contents.draw_bitmap_number is used in windows, and in non-window elements something like bitmap.draw_bitmap_number may be used.
    • A simple example would be contents.draw_bitmap_number(actor.level, x + width, y, 2), this draws the actor level aligned to the right, with the x origin being the right edge of the level draw area.
  • value is what the number is supposed to be. i.e. actor.hp. Do take note for things like certain actor stats, you'll need another draw_bitmap_number for the maximum.
  • offset is the number of pixels to subtract between digits. You'll probably be using this for any numbers that have drop shadows - that slight overlap makes things look much more natural. (By the way, the offset for the sample image is 4.)
  • x, y, align, and skin all should be clear. The skin location can be changed by altering Cache.system.

The defaults can be changed by editing the definition in the code. It's really not that big a script, so it shouldn't be hard.

Script

The code below is formatted for VX/Ace. To use in XP, replace Cache.system with RPG::Cache.windowskin, or whichever line you need to use for wherever you have your number image.

#==============================================================================
# ■ Bitmap
#==============================================================================

class Bitmap
  #--------------------------------------------------------------------------
  # ● Draw Bitmap Number
  #--------------------------------------------------------------------------
  def draw_bitmap_number(value, x, y, align = 0, skin = "numbers/nwh", offset = 2)
    # Get image
    numerals = Cache.system(skin) # for XP: numerals = RPG::Cache.windowskin(skin)
    digit = (numerals.width / 10)
    text = value.to_s
    value = value.to_i if value.is_a?(String)
    char = 0
    # Get number size
    tx = ((digit-offset) * text.length) + offset
    # Offset x
    case align
    when 1
      x -= (tx / 2)
    when 2
      x -= tx
    end
    while ((c = text.slice!(/./)) != nil)
      n = digit * c.to_i
      src = Rect.new(n, 0, digit, numerals.height)
      # If the number is a negative, we need to draw the negative sign!
      # You'll need to adjust this according to your graphics.
      self.draw_text(x, y, digit, src.height, "-") if c == "-"
      self.blt(x + char, y, numerals, src)
      char += digit - offset
    end
  end
end

Credit

Credits should go to myself, Aether.

Advanced Notes

This script should work fine with numbers that have leading zeros, like playtime.

hour = sprintf("%02d", time / 60 / 60)
min = sprintf("%02d", time / 60 % 60)
sec = sprintf("%02d", time % 60)

  • Wednesday, 16th August 02023