diff options
author | metamuffin <metamuffin@disroot.org> | 2024-07-21 18:45:11 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2024-07-21 22:17:54 +0200 |
commit | 64e00aad013da92d29851d3e8109a006b4dff8c5 (patch) | |
tree | 081e9a2829f3c247d48bf6468030f35c85b2db4f | |
parent | b1eba76afaf7a506ff912634da6220db15d0023e (diff) | |
download | hurrycurry-64e00aad013da92d29851d3e8109a006b4dff8c5.tar hurrycurry-64e00aad013da92d29851d3e8109a006b4dff8c5.tar.bz2 hurrycurry-64e00aad013da92d29851d3e8109a006b4dff8c5.tar.zst |
pc: draw text
-rw-r--r-- | pixel-client/assets/font.ini | 96 | ||||
-rw-r--r-- | pixel-client/makefile | 2 | ||||
-rw-r--r-- | pixel-client/src/game.rs | 10 | ||||
-rw-r--r-- | pixel-client/src/main.rs | 5 | ||||
-rw-r--r-- | pixel-client/src/menu.rs | 7 | ||||
-rw-r--r-- | pixel-client/src/render/font.rs | 43 | ||||
-rw-r--r-- | pixel-client/src/render/mod.rs | 55 | ||||
-rw-r--r-- | pixel-client/src/tilemap.rs | 4 |
8 files changed, 193 insertions, 29 deletions
diff --git a/pixel-client/assets/font.ini b/pixel-client/assets/font.ini new file mode 100644 index 00000000..f033334f --- /dev/null +++ b/pixel-client/assets/font.ini @@ -0,0 +1,96 @@ +letter_32=font/letter_32 +letter_33=font/letter_33 +letter_34=font/letter_34 +letter_35=font/letter_35 +letter_36=font/letter_36 +letter_37=font/letter_37 +letter_38=font/letter_38 +letter_39=font/letter_39 +letter_40=font/letter_40 +letter_41=font/letter_41 +letter_42=font/letter_42 +letter_43=font/letter_43 +letter_44=font/letter_44 +letter_45=font/letter_45 +letter_46=font/letter_46 +letter_47=font/letter_47 +letter_48=font/letter_48 +letter_49=font/letter_49 +letter_50=font/letter_50 +letter_51=font/letter_51 +letter_52=font/letter_52 +letter_53=font/letter_53 +letter_54=font/letter_54 +letter_55=font/letter_55 +letter_56=font/letter_56 +letter_57=font/letter_57 +letter_58=font/letter_58 +letter_59=font/letter_59 +letter_60=font/letter_60 +letter_61=font/letter_61 +letter_62=font/letter_62 +letter_63=font/letter_63 +letter_64=font/letter_64 +letter_65=font/letter_65 +letter_66=font/letter_66 +letter_67=font/letter_67 +letter_68=font/letter_68 +letter_69=font/letter_69 +letter_70=font/letter_70 +letter_71=font/letter_71 +letter_72=font/letter_72 +letter_73=font/letter_73 +letter_74=font/letter_74 +letter_75=font/letter_75 +letter_76=font/letter_76 +letter_77=font/letter_77 +letter_78=font/letter_78 +letter_79=font/letter_79 +letter_80=font/letter_80 +letter_81=font/letter_81 +letter_82=font/letter_82 +letter_83=font/letter_83 +letter_84=font/letter_84 +letter_85=font/letter_85 +letter_86=font/letter_86 +letter_87=font/letter_87 +letter_88=font/letter_88 +letter_89=font/letter_89 +letter_90=font/letter_90 +letter_91=font/letter_91 +letter_92=font/letter_92 +letter_93=font/letter_93 +letter_94=font/letter_94 +letter_95=font/letter_95 +letter_96=font/letter_96 +letter_97=font/letter_97 +letter_98=font/letter_98 +letter_99=font/letter_99 +letter_100=font/letter_100 +letter_101=font/letter_101 +letter_102=font/letter_102 +letter_103=font/letter_103 +letter_104=font/letter_104 +letter_105=font/letter_105 +letter_106=font/letter_106 +letter_107=font/letter_107 +letter_108=font/letter_108 +letter_109=font/letter_109 +letter_110=font/letter_110 +letter_111=font/letter_111 +letter_112=font/letter_112 +letter_113=font/letter_113 +letter_114=font/letter_114 +letter_115=font/letter_115 +letter_116=font/letter_116 +letter_117=font/letter_117 +letter_118=font/letter_118 +letter_119=font/letter_119 +letter_120=font/letter_120 +letter_121=font/letter_121 +letter_122=font/letter_122 +letter_123=font/letter_123 +letter_124=font/letter_124 +letter_125=font/letter_125 +letter_126=font/letter_126 +letter_127=font/letter_127 diff --git a/pixel-client/makefile b/pixel-client/makefile index 08bc46bc..764a4564 100644 --- a/pixel-client/makefile +++ b/pixel-client/makefile @@ -58,6 +58,6 @@ assets/sprites/%/all: assets/%.ini $(TEXTURES) $(COMPOSE) $(COMPOSE) $< assets/textures $(shell dirname $@) @touch $@ -assets/atlas.ta assets/atlas.meta.csv: assets/sprites/items/all assets/sprites/tiles/all assets/sprites/misc/all $(PACK) +assets/atlas.ta assets/atlas.meta.csv: assets/sprites/items/all assets/sprites/tiles/all assets/sprites/font/all assets/sprites/misc/all $(PACK) @echo $(PACK) assets/atlas.ta assets/atlas.meta.csv ... @$(PACK) assets/atlas.ta assets/atlas.meta.csv $(SPRITES) diff --git a/pixel-client/src/game.rs b/pixel-client/src/game.rs index 90711c48..c129f991 100644 --- a/pixel-client/src/game.rs +++ b/pixel-client/src/game.rs @@ -21,7 +21,7 @@ use crate::{ render::{ misc::MiscTextures, sprite::{Sprite, SpriteDraw}, - AtlasLayout, SpriteRenderer, + AtlasLayout, Renderer, }, tilemap::Tilemap, }; @@ -342,9 +342,9 @@ impl Game { } } - pub fn draw(&self, ctx: &mut SpriteRenderer) { - ctx.set_view( - -self.camera_center + (ctx.size / ctx.get_scale() / 2.), + pub fn draw(&self, ctx: &mut Renderer) { + ctx.set_world_view( + -self.camera_center + (ctx.size / ctx.get_world_scale() / 2.), ctx.size.min_element() / 32. / 10., ); @@ -381,7 +381,7 @@ impl Item { self.position.exp_to(self.parent_position, dt * 20.); self.alive.exp_to(alive, dt * 20.) } - pub fn draw(&self, ctx: &mut SpriteRenderer, item_sprites: &[Sprite], misc: &MiscTextures) { + pub fn draw(&self, ctx: &mut Renderer, item_sprites: &[Sprite], misc: &MiscTextures) { ctx.draw_world( item_sprites[self.kind.0] .at(self.position) diff --git a/pixel-client/src/main.rs b/pixel-client/src/main.rs index 65de7b15..68c5b66a 100644 --- a/pixel-client/src/main.rs +++ b/pixel-client/src/main.rs @@ -20,7 +20,7 @@ use game::Game; use hurrycurry_protocol::glam::Vec2; use menu::Menu; use network::Network; -use render::SpriteRenderer; +use render::Renderer; use sdl2::{ event::Event, keyboard::{KeyboardState, Keycode}, @@ -85,7 +85,7 @@ fn main() { let texture_creator = canvas.texture_creator(); - let mut renderer = SpriteRenderer::init(&texture_creator); + let mut renderer = Renderer::init(&texture_creator); let mut state = match args.action.unwrap_or_default() { Action::Menu => State::Menu(Menu::new()), @@ -112,6 +112,7 @@ fn main() { last_tick += dt; + renderer.ui_scale = Vec2::new(5., 5.); match &mut state { State::Ingame(x) => x.draw(&mut renderer), State::Menu(x) => x.draw(&mut renderer), diff --git a/pixel-client/src/menu.rs b/pixel-client/src/menu.rs index a3242edb..d9396e49 100644 --- a/pixel-client/src/menu.rs +++ b/pixel-client/src/menu.rs @@ -1,4 +1,5 @@ -use crate::render::{AtlasLayout, SpriteRenderer}; +use crate::render::{AtlasLayout, Renderer}; +use hurrycurry_protocol::glam::Vec2; use sdl2::keyboard::KeyboardState; pub struct Menu {} @@ -14,5 +15,7 @@ impl Menu { Self {} } pub fn tick(&mut self, _dt: f32, _keyboard: &KeyboardState, _layout: &AtlasLayout) {} - pub fn draw(&self, _ctx: &mut SpriteRenderer) {} + pub fn draw(&self, ctx: &mut Renderer) { + ctx.draw_text(Vec2::new(1., 1.), "Hello world!"); + } } diff --git a/pixel-client/src/render/font.rs b/pixel-client/src/render/font.rs new file mode 100644 index 00000000..ff4abade --- /dev/null +++ b/pixel-client/src/render/font.rs @@ -0,0 +1,43 @@ +use super::{sprite::SpriteDraw, AtlasLayout, Renderer}; +use hurrycurry_protocol::glam::Vec2; +use sdl2::rect::Rect; + +pub struct FontTextures { + pub glyphs: [Rect; 128], +} + +impl FontTextures { + pub fn init(layout: &AtlasLayout) -> Self { + FontTextures { + glyphs: (0..128) + .into_iter() + .map(|n| { + layout + .get(&format!("letter_{n}+a")) + .copied() + .unwrap_or(Rect::new(0, 0, 0, 0)) + }) + .collect::<Vec<_>>() + .try_into() + .unwrap(), + } + } +} + +impl<'a> Renderer<'a> { + pub fn draw_text(&mut self, position: Vec2, text: &str) { + let mut cursor = position; + for c in text.chars() { + if (c as u32) < 128 { + let r = self.font_textures.glyphs[c as usize]; + self.draw_ui(SpriteDraw::overlay( + r, + cursor, + Vec2::new(r.width() as f32, r.height() as f32), + None, + )); + cursor.x += r.width() as f32; + } + } + } +} diff --git a/pixel-client/src/render/mod.rs b/pixel-client/src/render/mod.rs index 43e08d61..9b3132f9 100644 --- a/pixel-client/src/render/mod.rs +++ b/pixel-client/src/render/mod.rs @@ -15,9 +15,11 @@ along with this program. If not, see <https://www.gnu.org/licenses/>. */ +pub mod font; pub mod misc; pub mod sprite; +use font::FontTextures; use hurrycurry_protocol::glam::Vec2; use sdl2::{ pixels::PixelFormatEnum, @@ -28,21 +30,24 @@ use sdl2::{ use sprite::SpriteDraw; use std::collections::HashMap; -pub struct SpriteRenderer<'a> { +pub struct Renderer<'a> { metadata: AtlasLayout, + font_textures: FontTextures, + pub size: Vec2, texture: Texture<'a>, - view_scale: Vec2, - view_offset: Vec2, + world_scale: Vec2, + world_offset: Vec2, + pub ui_scale: Vec2, sprites: Vec<SpriteDraw>, } pub type AtlasLayout = HashMap<String, Rect>; -impl<'a> SpriteRenderer<'a> { +impl<'a> Renderer<'a> { pub fn init(texture_creator: &'a TextureCreator<WindowContext>) -> Self { let palette = include_str!("../../assets/palette.csv") .split('\n') @@ -88,7 +93,7 @@ impl<'a> SpriteRenderer<'a> { texture.update(None, &texels, 1024 * 4).unwrap(); texture.set_blend_mode(BlendMode::Blend); - let metadata = include_str!("../../assets/atlas.meta.csv") + let atlas_layout = include_str!("../../assets/atlas.meta.csv") .lines() .filter(|l| !l.is_empty()) .map(|l| { @@ -103,21 +108,23 @@ impl<'a> SpriteRenderer<'a> { .collect::<HashMap<_, _>>(); Self { + ui_scale: Vec2::ZERO, texture, + font_textures: FontTextures::init(&atlas_layout), size: Vec2::ONE, - metadata, + metadata: atlas_layout, sprites: vec![], - view_offset: Vec2::ZERO, - view_scale: Vec2::ZERO, + world_offset: Vec2::ZERO, + world_scale: Vec2::ZERO, } } - pub fn set_view(&mut self, offset: Vec2, scale: f32) { - self.view_offset = offset; - self.view_scale = Vec2::new(32., 24.) * scale; + pub fn set_world_view(&mut self, offset: Vec2, scale: f32) { + self.world_offset = offset; + self.world_scale = Vec2::new(32., 24.) * scale; } - pub fn get_scale(&self) -> Vec2 { - self.view_scale + pub fn get_world_scale(&self) -> Vec2 { + self.world_scale } #[inline] @@ -139,10 +146,24 @@ impl<'a> SpriteRenderer<'a> { z_order: sprite.z_order, src: sprite.src, dst: FRect::new( - (sprite.dst.x + self.view_offset.x) * self.view_scale.x, - (sprite.dst.y + self.view_offset.y) * self.view_scale.y, - sprite.dst.w * self.view_scale.x, - sprite.dst.h * self.view_scale.y, + (sprite.dst.x + self.world_offset.x) * self.world_scale.x, + (sprite.dst.y + self.world_offset.y) * self.world_scale.y, + sprite.dst.w * self.world_scale.x, + sprite.dst.h * self.world_scale.y, + ), + }) + } + + pub fn draw_ui(&mut self, sprite: SpriteDraw) { + self.sprites.push(SpriteDraw { + tint: sprite.tint, + z_order: sprite.z_order, + src: sprite.src, + dst: FRect::new( + sprite.dst.x * self.ui_scale.x, + sprite.dst.y * self.ui_scale.y, + sprite.dst.w * self.ui_scale.x, + sprite.dst.h * self.ui_scale.y, ), }) } diff --git a/pixel-client/src/tilemap.rs b/pixel-client/src/tilemap.rs index 05f33b4b..f52ffc1c 100644 --- a/pixel-client/src/tilemap.rs +++ b/pixel-client/src/tilemap.rs @@ -22,7 +22,7 @@ use std::collections::{HashMap, HashSet}; use crate::render::{ sprite::{Sprite, SpriteDraw}, - SpriteRenderer, + Renderer, }; #[derive(Default)] @@ -109,7 +109,7 @@ impl Tilemap { .insert(pos, Sprite::new_tile(src).at(pos.as_vec2())); } - pub fn draw(&self, ctx: &mut SpriteRenderer) { + pub fn draw(&self, ctx: &mut Renderer) { for &sprite in self.tiles.values() { ctx.draw_world(sprite); } |