commit bbd1c094e4d8b48036a58d4178494afcc7b69733
parent 122859620d858760d081b09e990abaea4b2be3da
Author: Bradley Gannon <bradley@bradleygannon.com>
Date: Tue, 18 Aug 2026 21:04:42 -0400
Center player on screen
Diffstat:
2 files changed, 33 insertions(+), 13 deletions(-)
diff --git a/client/src/main.rs b/client/src/main.rs
@@ -6,7 +6,7 @@ use macroquad::prelude::*;
use crate::{
game::handle_input,
net::handle_connection,
- render::{Camera, follow_local_player, load_sprites, render},
+ render::{Camera, Spritesheet, follow_local_player, render},
};
pub mod game;
@@ -16,7 +16,7 @@ pub mod render;
#[macroquad::main("Library")]
async fn main() {
request_new_screen_size(1280., 720.);
- let spritesheet = load_sprites();
+ let spritesheet = Spritesheet::load();
let (client_to_server_tx, client_to_server_rx) = channel();
let (server_to_client_tx, server_to_client_rx) = channel();
@@ -89,7 +89,7 @@ async fn main() {
unresponded_actions.push_back(action);
sequence_number = sequence_number.wrapping_add(1);
}
- follow_local_player(&mut camera, &game_state, &id);
+ follow_local_player(&mut camera, &game_state, &spritesheet, &id);
}
let interpolated_game_state = GameState::interpolate(
&old_game_state,
diff --git a/client/src/render.rs b/client/src/render.rs
@@ -1,3 +1,5 @@
+use std::ops::Index;
+
use common::game::{GameState, SpriteIndex};
use macroquad::prelude::*;
use uuid::Uuid;
@@ -45,14 +47,26 @@ impl From<Image> for Sprite {
}
}
-pub(crate) fn load_sprites() -> Spritesheet {
- Spritesheet {
- meeple: Image::from_file_with_format(
- include_bytes!("../assets/meeple.png"),
- Some(ImageFormat::Png),
- )
- .unwrap()
- .into(),
+impl Spritesheet {
+ pub(crate) fn load() -> Spritesheet {
+ Spritesheet {
+ meeple: Image::from_file_with_format(
+ include_bytes!("../assets/meeple.png"),
+ Some(ImageFormat::Png),
+ )
+ .unwrap()
+ .into(),
+ }
+ }
+}
+
+impl Index<SpriteIndex> for Spritesheet {
+ type Output = Sprite;
+
+ fn index(&self, index: SpriteIndex) -> &Self::Output {
+ match index {
+ SpriteIndex::Meeple => &self.meeple,
+ }
}
}
@@ -74,9 +88,15 @@ pub(crate) fn render(camera: &Camera, game: &GameState, spritesheet: &Spriteshee
}
}
-pub(crate) fn follow_local_player(camera: &mut Camera, game: &GameState, local_player_id: &Uuid) {
+pub(crate) fn follow_local_player(
+ camera: &mut Camera,
+ game: &GameState,
+ spritesheet: &Spritesheet,
+ local_player_id: &Uuid,
+) {
let screen_center = Vec2::new(screen_width() / 2., screen_height() / 2.);
if let Some((_, player)) = game.players.iter().find(|(id, _)| *id == local_player_id) {
- camera.position = player.position - screen_center;
+ let player_sprite = &spritesheet[player.sprite_index];
+ camera.position = player.position - screen_center + player_sprite.size / 2.;
}
}