mirror of
https://github.com/Noratrieb/game-wip-dontplay.git
synced 2026-01-14 11:45:01 +01:00
Properly center screen
This commit is contained in:
parent
a3cb228799
commit
c54af3ee67
4 changed files with 27 additions and 1 deletions
1
Cargo.lock
generated
1
Cargo.lock
generated
|
|
@ -541,6 +541,7 @@ dependencies = [
|
||||||
"fnv",
|
"fnv",
|
||||||
"gamedebug_core",
|
"gamedebug_core",
|
||||||
"hecs",
|
"hecs",
|
||||||
|
"num-traits",
|
||||||
"rand",
|
"rand",
|
||||||
"rfd",
|
"rfd",
|
||||||
"s2dc",
|
"s2dc",
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@ anyhow = "1.0.70"
|
||||||
egui-sfml = "0.4.0"
|
egui-sfml = "0.4.0"
|
||||||
fnv = "1.0.7"
|
fnv = "1.0.7"
|
||||||
hecs = "0.10.1"
|
hecs = "0.10.1"
|
||||||
|
num-traits = "0.2.15"
|
||||||
rand = "0.8.5"
|
rand = "0.8.5"
|
||||||
rfd = "0.11.3"
|
rfd = "0.11.3"
|
||||||
sfml = "0.20.0"
|
sfml = "0.20.0"
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ use crate::{
|
||||||
game::{for_each_tile_on_screen, Biome, GameState},
|
game::{for_each_tile_on_screen, Biome, GameState},
|
||||||
graphics::{self, ScreenPosScalar, NATIVE_RESOLUTION},
|
graphics::{self, ScreenPosScalar, NATIVE_RESOLUTION},
|
||||||
input::Input,
|
input::Input,
|
||||||
math::{px_per_frame_to_km_h, WorldPos, M_PER_PX, TILE_SIZE},
|
math::{center_offset, px_per_frame_to_km_h, WorldPos, M_PER_PX, TILE_SIZE},
|
||||||
res::Res,
|
res::Res,
|
||||||
world::{Tile, TilePosScalar, CHUNK_EXTENT},
|
world::{Tile, TilePosScalar, CHUNK_EXTENT},
|
||||||
};
|
};
|
||||||
|
|
@ -243,6 +243,11 @@ impl App {
|
||||||
self.rt.display();
|
self.rt.display();
|
||||||
let mut spr = Sprite::with_texture(self.rt.texture());
|
let mut spr = Sprite::with_texture(self.rt.texture());
|
||||||
spr.set_scale((self.scale as f32, self.scale as f32));
|
spr.set_scale((self.scale as f32, self.scale as f32));
|
||||||
|
let rw_size = self.rw.size();
|
||||||
|
let rt_size = self.rt.size() * self.scale as u32;
|
||||||
|
let x = center_offset(rt_size.x as i32, rw_size.x as i32);
|
||||||
|
let y = center_offset(rt_size.y as i32, rw_size.y as i32);
|
||||||
|
spr.set_position((x as f32, y as f32));
|
||||||
self.rw.clear(Color::rgb(40, 10, 70));
|
self.rw.clear(Color::rgb(40, 10, 70));
|
||||||
self.rw.draw(&spr);
|
self.rw.draw(&spr);
|
||||||
self.sf_egui
|
self.sf_egui
|
||||||
|
|
|
||||||
19
src/math.rs
19
src/math.rs
|
|
@ -1,3 +1,5 @@
|
||||||
|
use num_traits::Signed;
|
||||||
|
|
||||||
use crate::world::{TilePos, TilePosScalar};
|
use crate::world::{TilePos, TilePosScalar};
|
||||||
|
|
||||||
pub type WorldPosScalar = u32;
|
pub type WorldPosScalar = u32;
|
||||||
|
|
@ -50,6 +52,23 @@ pub fn wp_to_tp(wp: WorldPosScalar) -> TilePosScalar {
|
||||||
(wp / TILE_SIZE as WorldPosScalar) as TilePosScalar
|
(wp / TILE_SIZE as WorldPosScalar) as TilePosScalar
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get the offset required to center an object of `xw` width inside an object of `yw` width.
|
||||||
|
//
|
||||||
|
// For example, let's say `xw` (+) is 10 and we want to center it inside `yw` (-), which is 20
|
||||||
|
//
|
||||||
|
// ++++++++++ (x uncentered)
|
||||||
|
// -------------------- (y)
|
||||||
|
// ++++++++++ (x centered)
|
||||||
|
//
|
||||||
|
// In this case, we needed to add 5 to x to achieve centering.
|
||||||
|
// This is the offset that this function calculates.
|
||||||
|
//
|
||||||
|
// We can calulate it by subtracting `xw` from `yw` (10), and dividing it by 2.
|
||||||
|
pub fn center_offset<N: From<u8> + Copy + Signed>(xw: N, yw: N) -> N {
|
||||||
|
let diff = yw - xw;
|
||||||
|
diff / N::from(2)
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_wp_to_tp() {
|
fn test_wp_to_tp() {
|
||||||
assert_eq!(wp_to_tp(0), 0);
|
assert_eq!(wp_to_tp(0), 0);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue