From 3f413bbe8a042cdd15028971fb400f1f4fde38bc Mon Sep 17 00:00:00 2001 From: Wilson Silva Date: Mon, 23 Oct 2023 14:33:03 +0700 Subject: [PATCH] Add the text font loading example --- examples/README.md | 10 + examples/text/resources/LICENSE.md | 3 + examples/text/resources/fonts/pixantiqua.png | Bin 0 -> 2653 bytes examples/text/resources/pixantiqua.fnt | 188 +++++++++++++++++++ examples/text/resources/pixantiqua.png | Bin 0 -> 4531 bytes examples/text/resources/pixantiqua.ttf | Bin 0 -> 35408 bytes examples/text/text_font_loading.png | Bin 0 -> 20086 bytes examples/text/text_font_loading.rb | 81 ++++++++ 8 files changed, 282 insertions(+) create mode 100644 examples/text/resources/fonts/pixantiqua.png create mode 100644 examples/text/resources/pixantiqua.fnt create mode 100644 examples/text/resources/pixantiqua.png create mode 100644 examples/text/resources/pixantiqua.ttf create mode 100644 examples/text/text_font_loading.png create mode 100644 examples/text/text_font_loading.rb diff --git a/examples/README.md b/examples/README.md index e5613a0..a160470 100644 --- a/examples/README.md +++ b/examples/README.md @@ -44,3 +44,13 @@ Examples using raylib audio functionality, including sound/music loading and pla | 120 | [audio_sound_loading](audio/audio_sound_loading.rb) | audio_sound_loading | ⭐️☆☆☆ | 1.1 | 3.5 | [Ray](https://github.com/raysan5) | As always contributions are welcome, feel free to send new examples! Here it is an [examples template](examples_template.rb) to start with! + +## Text + +Examples using raylib text functionality, including sprite fonts loading/generation and text drawing. + +| ## | example | image | difficulty
level | version
created | last version
updated | original
developer | +|----|------------------------------------------------------|--------|:-------------------:|:------------------:|:------------------:|:----------| +| 71 | [text_font_filters](text/text_font_filters.rb) | text_font_filters | ⭐️⭐️☆☆ | 1.3 | **4.2** | [Ray](https://github.com/raysan5) | +| 72 | [text_font_loading](text/text_font_loading.rb) | text_font_loading | ⭐️☆☆☆ | 1.4 | 3.0 | [Ray](https://github.com/raysan5) | + diff --git a/examples/text/resources/LICENSE.md b/examples/text/resources/LICENSE.md index dbb244d..0202fde 100644 --- a/examples/text/resources/LICENSE.md +++ b/examples/text/resources/LICENSE.md @@ -1,3 +1,6 @@ | resource | author | licence | notes | | :----------------------------- | :---------: | :------ | :---- | +| fonts/pixantiqua.ttf | Gerhard Großmann | [Freeware](https://www.dafont.com/es/pixantiqua.font) | Atlas created by [@raysan5](https://github.com/raysan5) | | KAISG.ttf | [Dieter Steffmann](http://www.steffmann.de/wordpress/) | [Freeware](https://www.1001fonts.com/users/steffmann/) | [Kaiserzeit Gotisch](https://www.dafont.com/es/kaiserzeit-gotisch.font) font | +| pixantiqua.fnt, pixantiqua.png | Gerhard Großmann | [Freeware](https://www.dafont.com/es/pixantiqua.font) | Atlas made with [BMFont](https://www.angelcode.com/products/bmfont/) by [@raysan5](https://github.com/raysan5) | +| pixantiqua.ttf | Gerhard Großmann | [Freeware](https://www.dafont.com/es/pixantiqua.font) | - | diff --git a/examples/text/resources/fonts/pixantiqua.png b/examples/text/resources/fonts/pixantiqua.png new file mode 100644 index 0000000000000000000000000000000000000000..d9d3dfa5cc31573fe80bba656efaedba30636f06 GIT binary patch literal 2653 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 E1I+QH8~^|S literal 0 HcmV?d00001 diff --git a/examples/text/resources/pixantiqua.ttf b/examples/text/resources/pixantiqua.ttf new file mode 100644 index 0000000000000000000000000000000000000000..e012875da0aeb2a662409ca5f2ae12cbab2213d0 GIT binary patch literal 35408 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 literal 0 HcmV?d00001 diff --git a/examples/text/text_font_loading.rb b/examples/text/text_font_loading.rb new file mode 100644 index 0000000..d568d5a --- /dev/null +++ b/examples/text/text_font_loading.rb @@ -0,0 +1,81 @@ +# ****************************************************************************************** +# +# raylib [text] example - Font loading +# +# NOTE: raylib can load fonts from multiple input file formats: +# +# - TTF/OTF > Sprite font atlas is generated on loading, user can configure +# some of the generation parameters (size, characters to include) +# - BMFonts > Angel code font fileformat, sprite font image must be provided +# together with the .fnt file, font generation cannot be configured +# - XNA Spritefont > Sprite font image, following XNA Spritefont conventions, +# Characters in image must follow some spacing and order rules +# +# Example ported to Ruby by Wilson Silva (@wilsonsilva). Works with Raylib 4.5 +# +# Example licensed under an unmodified zlib/libpng license, which is an OSI-certified, +# BSD-like license that allows static linking with closed source software +# +# Copyright (c) 2016-2023 Ramon Santamaria (@raysan5) +# +# ****************************************************************************************** + +require 'bundler/setup' +require 'raylib' + +# Initialization +# -------------------------------------------------------------------------------------- +SCREEN_WIDTH = 800 +SCREEN_HEIGHT = 450 + +Raylib.init_window(SCREEN_WIDTH, SCREEN_HEIGHT, "raylib [text] example - font loading") + +# Define characters to draw +# NOTE: raylib supports UTF-8 encoding, following list is actually codified as UTF8 internally +msg = "!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHI\nJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmn\no" \ + "pqrstuvwxyz{|}~¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓ\nÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷\nøùúûüýþÿ" + +# NOTE: Textures/Fonts MUST be loaded after Window initialization (OpenGL context is required) + +# BMFont (AngelCode) : Font data and image atlas have been generated using external program +font_bm = Raylib.load_font(File.join(__dir__, "resources/pixantiqua.fnt")) + +# TTF font : Font data and atlas are generated directly from TTF +# NOTE: We define a font base size of 32 pixels tall and up-to 250 characters +font_ttf = Raylib.load_font_ex(File.join(__dir__, "resources/pixantiqua.ttf"), 32, nil, 250) + +Raylib.set_target_fps(60) # Set our game to run at 60 frames-per-second +# -------------------------------------------------------------------------------------- + +# Main game loop +until Raylib.window_should_close # Detect window close button or ESC key + # Update + # ---------------------------------------------------------------------------------- + use_ttf = Raylib.is_key_down(Raylib::KEY_SPACE) + # ---------------------------------------------------------------------------------- + + # Draw + # ---------------------------------------------------------------------------------- + Raylib.begin_drawing + Raylib.clear_background(Raylib::RAYWHITE) + Raylib.draw_text("Hold SPACE to use TTF generated font", 20, 20, 20, Raylib::LIGHTGRAY) + + if use_ttf + Raylib.draw_text_ex(font_ttf, msg, Raylib::Vector2.create(20.0, 100.0), font_ttf.base_size.to_f, 2, Raylib::LIME) + Raylib.draw_text("Using TTF font generated", 20, Raylib.get_screen_height - 30, 20, Raylib::GRAY) + else + Raylib.draw_text_ex(font_bm, msg, Raylib::Vector2.create(20.0, 100.0), font_bm.base_size.to_f, 2, Raylib::MAROON) + Raylib.draw_text("Using BMFont (Angelcode) imported", 20, Raylib.get_screen_height - 30, 20, Raylib::GRAY) + end + + Raylib.end_drawing + # ---------------------------------------------------------------------------------- +end + +# De-Initialization +# -------------------------------------------------------------------------------------- +Raylib.unload_font(font_bm) # AngelCode Font unloading +Raylib.unload_font(font_ttf) # TTF Font unloading + +Raylib.close_window # Close window and OpenGL context +# --------------------------------------------------------------------------------------