diff options
Diffstat (limited to 'pixel-client/src')
-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 |
6 files changed, 96 insertions, 28 deletions
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); } |