bmfont
and tileset
Serializable::inspect
to show more useful information
more_collections :: more_collections
Highly specific, but useful, collections-related classes.performance_analysis :: performance_analysis
Services to gather information on the performance of events by categoriesserialization :: serialization_core
Abstract services to serialize Nit objects to different formatscore :: union_find
union–find algorithm using an efficient disjoint-set data structureEulerCamera
and App::frame_core_draw
to get a stereoscopic view
# Abstract font drawing services, implemented by `bmfont` and `tileset`
module font
import gamnit::flat_core
# Abstract font, drawn by a `TextSprites`
abstract class Font
# Line spacing modifier for `pld` and `plu`
#
# This value acts as multiplier to the standard line height.
# Defaults to 0.4, so a `pld` moves chars down by about half a line.
var partial_line_mod: Numeric = 0.4 is writable
# Backend writing service, clients should use `TextSprites.text=`
protected fun write_into(text_sprites: TextSprites, text: Text) is abstract
end
# Manage a set of sprites to display some text
class TextSprites
# Font used to draw text
var font: Font
# Reference coordinates of this block of text
#
# When left aligned, the default at `align == 0.0`, the anchor is the
# left coordinate of the first character of the first line.
# When right aligned, at `align == 1.0`, the anchor is the right
# coordinate of the last character.
# When centered, at `align == 0.5`, the anchor is at the center.
#
# When top aligned, the default at `valign == 0.0`, the anchor is at the
# top of this block of text.
# When bottom aligned, at `valign == 1.0`, the anchor is at the bottom.
var anchor: Point3d[Float]
# Last set of sprites generated to display `text=`
var sprites = new Array[Sprite]
# Sprite set where to put created sprites
#
# Defaults to `app::ui_sprites`, but it could also be set to a
# `app::sprites` or a custom collection.
var target_sprite_set: Set[Sprite] = app.ui_sprites is lazy, writable
private var cached_text: nullable Text = null
private var init_complete = false
# Last text drawn
fun text: nullable Text do return cached_text
# Update the text displayed by inserting new sprites into `app.ui_sprites`
#
# Does not redraw if `text` has not changed.
fun text=(text: nullable Text)
is autoinit do
# Don't redraw if text hasn't changed
if text == cached_text then return
cached_text = text
if not init_complete then return
# Clean up last used sprites
for s in sprites do if target_sprite_set.has(s) then target_sprite_set.remove s
sprites.clear
if text == null then return
font.write_into(self, text)
# Register sprites to be drawn by `app.ui_camera`
target_sprite_set.add_all sprites
end
# Horizontal text alignment
#
# Use 0.0 to align left (the default), 0.5 to align in the center or
# 1.0 to align on the right.
#
# See: `valign`
var align = 0.0 is optional, writable
# Vertical text alignment
#
# Use 0.0 for top alignment (the default) where the text is under the `anchor`,
# 0.5 to vertically center the text on the `anchor` or
# or 1.0 to bottom align the text above the `anchor`.
#
# See: `align`
var valign = 0.0 is optional, writable
# Maximum width of each line of text
#
# The first word of each line is exempt and may overflow.
#
# The behavior when a line overflow depends on `wrap`.
var max_width: nullable Float is writable
# Maximum height of this block of text
#
# The first line is exempt and may overflow.
# Overflowing lines are cut.
var max_height: nullable Float is writable
# Should overflowing lines wrap to the next line?
#
# If `true`, the default, overflowing lines continue on the next line.
# Otherwise, lines are cut before overflowing.
var wrap = true is optional, writable
# Scale applied to all sprites and spacing
#
# Defaults to 1.0.
var scale = 1.0 is optional, writable
# Links in the currently displayed text
#
# Links are declared in a Markdown-like format:
#
# * `[my link]` creates a link with the name `my link`.
# * `[pretty name](internal name)` creates a link with the
# name `internal_name` while showing the text `pretty name`.
#
# This `Map` lists the sprites composing each link.
# These sprites can be modified as desired by the clients,
# by changing their tints or anything else.
var links = new Map[String, Array[Sprite]] is lazy
# Width of the currently displayed text
var width = 0.0
# Height of the currently displayed text
var height = 0.0
# Force drawing of the text sprites
#
# This method may be called after changing a setting (`align`, `wrap`, etc.)
# to update the displayed text.
fun force_redraw
do
var t = cached_text
cached_text = null
text = t
end
init
do
init_complete = true
force_redraw
end
end
# Partial line forward (U+008B)
fun pld: Char do return ''
# Partial line backward (U+008C)
fun plu: Char do return ''
lib/gamnit/font.nit:15,1--173,27