From 5e539d668febc4ebcef70163fc43d0d6a1172114 Mon Sep 17 00:00:00 2001 From: crumblingstatue Date: Sat, 1 Apr 2023 23:43:46 +0200 Subject: [PATCH] Render some tiles --- res/tiles.png | Bin 4356 -> 4921 bytes src/game.rs | 37 ++++++++++++++++++++++++++++++--- src/graphics.rs | 21 +++++++++++++++---- src/math.rs | 14 +++++++++++++ src/world.rs | 53 +++++++++++++++++++++++++++++++++++++++++++++--- 5 files changed, 115 insertions(+), 10 deletions(-) diff --git a/res/tiles.png b/res/tiles.png index 114cafa39167938b642208ee9d01ed9b56f16f74..21d6e7332e1276e9cd0a2f46541e99ec852e40b9 100644 GIT binary patch delta 970 zcmZos+Nm}{xn7vT)5S5QV$PepCv)!@NU#N1dhpvx7VrjpR~7iaJGga68-wLiuIC9H z3T~$-2%2}kXWVz@gmTxVr@xOrefjq7+w80tfB*hn`Sd3v149CfeUv!^0|SGGKO=}@ zTL2;%m_4)@_SozfvlOfPT)5jbR+^cCL1Fv+jqLku_SgH>|NGbX@8Oi>?K!O*;^)uz z731T%9lV=Ye*5k4)vw>3j5D}yfB%`?C3yx02aR0}6O=D3zrke)lI=E-*_NJnIO?~? z;sKZR|6m>l28INY zNG^u(>ec)V3=HAHwJZ!Tx3wLPFJ*K({J;NVJp;pmSvsr?hkvcFmp*36e>;eYfuUM# zHz<_mDP8z3RC1{HQS`gW`|iH<=k29_ey1^dI^k$;Gm@rBRzF zd1-TmKI??Yinn{WzCCs5QMVmC1H(5Je?|}9|EgjfZ)_9V7BlwEs!!*;_BsAXWZ!3* zjiD@=*B2SC`D)F;aA4ZedX9!WMg3wgZ2z!<(5H7`9AZ%8(Fs;F5>pj%j=Utr0A^ey-kLeE+oH#qZ|c-@?PdkTAW#@3_p zXVSMW-LkO#TintAXUg@jiZL)W7)SRoctl>@|K(AA;*8gcg4+yw-syU5|Nd9>h|a0$ zk8RQ=F5Q3STXVy_zl@=xgolB_pv{$W!PEM(x@t!2GS?qL@45xE-%6CZc|PwL|= zMh1o=;VwOfEiuvzRZBD&85riAT$szixOpO@7eD`l`04@=Q2tSP@jp8~V)8^rX)z0y X0*~y+n!j=;gCsm%{an^LB{Ts5DzUId delta 397 zcmdm~)}k~)xnAJ3r;B4q#hkZyPxBr!5O8pG5}u=UF*eJq++)rPCaw)E+dinDJ2yx9 z(AD#C={L8%t(DBU|2_4|Z$<_Ng{Idp>=_ss7`CW`NCyTc5XBN8!f@^O-jkad7#JL) zZ!#wAy{muzy7KRK?|G~Y3=FqU@iB;fVPIe|Sg*ohv8$e+fq~)qWEKYNzYGiv1$O(u zW-ylUGq~|EFfc6G|BmrM2O|Rm!p2_>A=9iz;PfP#8XIZc%}?u z9H;Ch{>N3<= zTPlD!2O@4VKA7*iXCufc32keJh$GAl3fOAN*@J)b0cLseFP|9Q;tU;L-AuLv OY4>#Xb6Mw<&;$VFpn9 Vector2f { + Vector2f::new(self.x.into(), self.y.into()) + } +} + +pub const NATIVE_RESOLUTION: ScreenRes = ScreenRes { w: 960, h: 540 }; pub fn make_window() -> RenderWindow { let mut rw = RenderWindow::new( diff --git a/src/math.rs b/src/math.rs index ba7a38b..58a8849 100644 --- a/src/math.rs +++ b/src/math.rs @@ -1,6 +1,20 @@ +use crate::world::TilePos; + pub type WorldPosScalar = i32; +#[derive(Clone, Copy)] pub struct WorldPos { pub x: WorldPosScalar, pub y: WorldPosScalar, } + +impl WorldPos { + pub fn tile_pos(&self) -> TilePos { + TilePos { + x: self.x / TILE_SIZE as i32, + y: self.y / TILE_SIZE as i32, + } + } +} + +pub const TILE_SIZE: u8 = 32; diff --git a/src/world.rs b/src/world.rs index c0b28f2..0601c7c 100644 --- a/src/world.rs +++ b/src/world.rs @@ -3,13 +3,14 @@ use rand::{thread_rng, Rng}; type ChunkPosScalar = i16; -#[derive(Hash)] +#[derive(Hash, PartialEq, Eq)] struct ChunkPos { x: ChunkPosScalar, y: ChunkPosScalar, } pub struct World { + /// The currently loaded chunks chunks: FnvHashMap, } @@ -21,6 +22,48 @@ impl Default for World { } } +impl World { + /// Get mutable access to the tile at `pos`. + /// + /// Loads or generates the containing chunk if necessary. + pub fn tile_at_mut(&mut self, pos: TilePos) -> &mut Tile { + let (chk, local) = pos.to_chunk_and_local(); + let chk = self.chunks.entry(chk).or_insert_with(Chunk::new_rand); + chk.at_mut(local) + } +} + +pub struct TilePos { + pub x: TilePosScalar, + pub y: TilePosScalar, +} + +pub struct ChunkLocalTilePos { + pub x: ChunkLocalTilePosScalar, + pub y: ChunkLocalTilePosScalar, +} + +type ChunkLocalTilePosScalar = i16; + +impl TilePos { + fn to_chunk_and_local(&self) -> (ChunkPos, ChunkLocalTilePos) { + // 0,0 is chunk (0, 0) + // -1, -1 is chunk (-1, -1) + let chk = ChunkPos { + x: (self.x / CHUNK_EXTENT as i32) as i16, + y: (self.y / CHUNK_EXTENT as i32) as i16, + }; + let local = ChunkLocalTilePos { + x: (self.x % CHUNK_EXTENT as i32) as i16, + y: (self.y % CHUNK_EXTENT as i32) as i16, + }; + (chk, local) + } +} + +// Need to support at least 8 million tiles long +type TilePosScalar = i32; + const CHUNK_EXTENT: u16 = 256; const CHUNK_N_TILES: usize = CHUNK_EXTENT as usize * CHUNK_EXTENT as usize; @@ -35,15 +78,19 @@ impl Chunk { let mut rng = thread_rng(); let mut tiles = [Tile { id: 0 }; CHUNK_N_TILES]; for b in &mut tiles { - b.id = rng.gen(); + b.id = rng.gen_range(0..8); } Self { tiles } } + + fn at_mut(&mut self, local: ChunkLocalTilePos) -> &mut Tile { + &mut self.tiles[CHUNK_EXTENT as usize * local.y as usize + local.x as usize] + } } type TileId = u16; #[derive(Clone, Copy)] pub struct Tile { - id: TileId, + pub id: TileId, }