From 2ee665ef6954f6eab9f0398c19284b3ea4c8246d Mon Sep 17 00:00:00 2001 From: tom barrett Date: Tue, 23 Jul 2019 00:54:35 -0500 Subject: state -> world, moved struct members to private --- src/world.rs | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 src/world.rs (limited to 'src/world.rs') diff --git a/src/world.rs b/src/world.rs new file mode 100644 index 0000000..0de8726 --- /dev/null +++ b/src/world.rs @@ -0,0 +1,96 @@ +use ggez::event::{EventHandler, KeyCode, KeyMods}; +use ggez::graphics::{self, spritebatch::SpriteBatch, DrawParam, FilterMode, Image, WrapMode}; +use ggez::{filesystem, Context, GameResult}; + +use crate::camera::Camera; +use crate::entity::Operable; +use crate::map::Map; +use crate::npc::NPC; +use crate::player::Player; +use crate::tileset::Tileset; + +pub struct World { + map: Map, + spritebatch: SpriteBatch, + camera: Camera, + player: Player, + npcs: Vec, +} + +impl World { + pub fn new(context: &mut Context) -> GameResult { + let mut image = Image::new(context, "/tileset.png")?; + image.set_filter(FilterMode::Nearest); + image.set_wrap(WrapMode::Mirror, WrapMode::Mirror); + + let tileset = Tileset::new(filesystem::open(context, "/tileset.tsx")?); + + let map = Map::new(filesystem::open(context, "/map.tmx")?, &tileset); + + Ok(World { + map: map.clone(), + spritebatch: SpriteBatch::new(image), + camera: Camera::new(context, map.get_dimensions()), + player: Player::new( + &tileset, + map.get_spawn_points("player")[0], + map.get_dimensions(), + ), + npcs: NPC::build_npcs(&tileset, &map), + }) + } +} + +impl EventHandler for World { + fn update(&mut self, _context: &mut Context) -> GameResult { + self.map.update(); + self.player.update(); + for npc in self.npcs.iter_mut() { + npc.update(); + } + + self.camera.give_center(self.player.get_position()); + Ok(()) + } + + fn draw(&mut self, context: &mut Context) -> GameResult { + graphics::clear(context, graphics::BLACK); + + self.map.draw(&mut self.spritebatch); + self.player.draw(&mut self.spritebatch); + for npc in self.npcs.iter_mut() { + npc.draw(&mut self.spritebatch); + } + + graphics::draw( + context, + &self.spritebatch, + DrawParam::default().dest(self.camera.draw), + )?; + + self.spritebatch.clear(); + + graphics::present(context)?; + + Ok(()) + } + + fn key_up_event(&mut self, _: &mut Context, keycode: KeyCode, _: KeyMods) { + self.player.give_key_up(keycode) + } + + fn key_down_event( + &mut self, + context: &mut Context, + keycode: KeyCode, + _: KeyMods, + repeat: bool, + ) { + if !repeat { + match keycode { + KeyCode::Q => context.continuing = false, + _ => self.player.give_key_down(keycode), + } + } + } +} -- cgit v1.2.3