From 6acaf7ed1c45388a4ad2103a288dd7eaabf553f0 Mon Sep 17 00:00:00 2001 From: Jonathan Johnson Date: Fri, 27 Oct 2023 15:30:37 -0700 Subject: [PATCH] Added tilemap example --- examples/tilemap.rs | 96 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 examples/tilemap.rs diff --git a/examples/tilemap.rs b/examples/tilemap.rs new file mode 100644 index 0000000..5dd214a --- /dev/null +++ b/examples/tilemap.rs @@ -0,0 +1,96 @@ +use gooey::dynamic::Dynamic; +use gooey::kludgine::app::winit::keyboard::Key; +use gooey::kludgine::figures::units::Px; +use gooey::kludgine::figures::{Point, Rect, Size}; +use gooey::kludgine::render::Renderer; +use gooey::kludgine::shapes::Shape; +use gooey::kludgine::tilemap::{ + Object, ObjectId, ObjectLayer, TileKind, TileMapFocus, Tiles, TILE_SIZE, +}; +use gooey::kludgine::Color; +use gooey::widget::{EventHandling, HANDLED, UNHANDLED}; +use gooey::widgets::TileMap; +use gooey::{EventLoopError, Run}; + +const PLAYER_SIZE: Px = Px(16); + +#[rustfmt::skip] +const TILES: [TileKind; 64] = { + const O: TileKind = TileKind::Color(Color::PURPLE); + const X: TileKind = TileKind::Color(Color::WHITE); + [ + X, X, X, X, X, X, X, X, + X, O, O, O, O, O, O, X, + X, O, X, O, O, X, O, X, + X, O, O, O, O, O, O, X, + X, O, X, O, O, X, O, X, + X, O, O, X, X, O, O, X, + X, O, O, O, O, O, O, X, + X, X, X, X, X, X, X, X, + ] +}; + +fn main() -> Result<(), EventLoopError> { + let mut characters = ObjectLayer::new(); + + let myself = characters.push(Player { + color: Color::RED, + position: Point::new(TILE_SIZE * 1, TILE_SIZE * 1), + }); + + let layers = Dynamic::new((Tiles::new(8, 8, TILES), characters)); + + TileMap::dynamic(layers.clone()) + .focus_on(TileMapFocus::Object { + layer: 1, + id: myself, + }) + .on_key(move |key| handle_key(key, myself, &layers)) + .run() +} + +fn handle_key( + key: Key, + player: ObjectId, + layers: &Dynamic<(Tiles, ObjectLayer)>, +) -> EventHandling { + let offset = match key { + Key::ArrowDown => Point::new(Px(0), Px(1)), + Key::ArrowUp => Point::new(Px(0), Px(-1)), + Key::ArrowLeft => Point::new(Px(-1), Px(0)), + Key::ArrowRight => Point::new(Px(1), Px(0)), + _ => return UNHANDLED, + }; + + layers.map_mut(|layers| layers.1[player].position += offset); + + HANDLED +} + +#[derive(Debug)] +struct Player { + color: Color, + position: Point, +} + +impl Object for Player { + fn position(&self) -> Point { + self.position + } + + fn render(&self, center: Point, zoom: f32, context: &mut Renderer<'_, '_>) { + let zoomed_size = PLAYER_SIZE * zoom; + context.draw_shape( + &Shape::filled_rect( + Rect::new( + Point::new(-zoomed_size / 2, -zoomed_size / 2), + Size::squared(zoomed_size), + ), + self.color, + ), + center, + None, + None, + ) + } +}