bevy_image_font enables rendering fonts stored as single images (e.g., PNG), with each letter at a predefined position. This crate focuses specifically on image-based fonts, often called "pixel fonts," used in game development. The term "image font" was chosen for precision, as bitmap fonts in formats like OTB might also be referred to as "pixel fonts."
- Unicode (single codepoints)
- Defining character coordinates via strings (see example asset)
- Manual specification of rectangles (including non-uniform sizes)
- Padding and offsets for texture layouts
- Inline newlines in strings
- Rendering from traditional bitmap fonts
- Automatic line wrapping
- Space characters require a blank texture region.
- Newlines are currently unsupported.
Add the following to your Cargo.toml:
[dependencies]
bevy = "0.16"
bevy_image_font = "0.9"Add an ImageFontText component to an entity along with:
- A
Spriteand aImageFontPreRenderedTextcomponents to render the text onto the associatedSprite, or - A
ImageNodeandImageFontPreRenderedUiTextcomponents to render the text onto the associatedImageNode, or - A
ImageFontSpriteTextcomponent for atlas-based text rendering.
Here's a minimal example of using bevy_image_font to render text.1 :
use bevy::prelude::*;
use bevy_image_font::{ImageFontPlugin, ImageFontText};
#[cfg(feature = "atlas_sprites")]
use bevy_image_font::atlas_sprites::ImageFontSpriteText;
fn main() {
App::new()
.add_plugins((DefaultPlugins, ImageFontPlugin))
.add_systems(Startup, setup)
.run();
}
fn setup(mut commands: Commands, asset_server: Res<AssetServer>) {
let font_handle = asset_server.load("path/to/font_layout.image_font.ron");
commands.spawn((
#[cfg(feature = "atlas_sprites")]
ImageFontSpriteText::default(),
ImageFontText::default()
.text("Hello, world!")
.font(font_handle.clone()),
));
}This example sets up a simple Bevy application with an ImageFontText component, rendering "Hello, world!" using a specified font image and layout.
See examples for more details:
- Rendered sprite example: Using pixel fonts for in-world text like damage numbers.
- Rendered UI example: Using
bevy_asset_loaderfor texture and font handling. - Atlased Sprite Example: Demonstrates rendering text with a texture atlas, including animations for dynamic text display and changing colors.
Bevy anchors sprites at the center by default, which may cause odd-dimensioned sprites to appear blurry. To avoid this, use non-Center anchors like Anchor::TopLeft or adjust sprite translations. Refer to the rendered sprite example for details.
- You can disable the default
atlas_spritesfeature if you don't useImageFontSpriteText. - You can disable the default
renderedfeature if you don't useImageFontPreRenderedTextorImageFontPreRenderedUiText. This removes the dependency on theimagecrate. - You can disable the default
uifeature if you don't useImageFontPreRenderedUiTextto remove a dependency on thebevy/bevy_uifeature. - If your project depends on this crate and you need support for non-PNG formats, add your own dependency on the same version of
imageand enable the relevant features.
| Bevy Version | Crate Version |
|---|---|
| 0.16 | 0.9 |
| 0.15 | 0.6, 0.7, 0.8 |
| 0.14 | 0.5 |
For detailed changes across versions, see the Changelog. Each GitHub Release which is created each time the crate is published also includes the relevant section of the changelog in its release notes for easy reference.
- Configure Git hooks after cloning:
git config --local core.hooksPath .githooks
- Install required tools:
cargo install cargo-hack --locked
PRs to support the latest Bevy releases are welcome!
example_fontby gnsh.example_variable_width_fontby Clint Bellanger.
Licensed under either of
- Apache License, Version 2.0, (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT)
at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.
Footnotes
-
Ignore the
#[cfg(feature = "...")]lines in the example; they're only there to satisfy the compiler when running it as a doc test for this README. ↩