aboutsummaryrefslogtreecommitdiff
path: root/pixel-client/src
diff options
context:
space:
mode:
Diffstat (limited to 'pixel-client/src')
-rw-r--r--pixel-client/src/game.rs10
-rw-r--r--pixel-client/src/main.rs5
-rw-r--r--pixel-client/src/menu.rs7
-rw-r--r--pixel-client/src/render/font.rs43
-rw-r--r--pixel-client/src/render/mod.rs55
-rw-r--r--pixel-client/src/tilemap.rs4
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);
}