1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- extern crate rltk;
- use rltk::{Console, GameState, Rltk, RGB};
- extern crate specs;
- use specs::prelude::*;
- #[macro_use]
- extern crate specs_derive;
- mod components;
- pub use components::*;
- mod map;
- pub use map::*;
- mod player;
- use player::*;
- mod rect;
- pub use rect::Rect;
- mod visibility_system;
- use visibility_system::VisibilitySystem;
- rltk::add_wasm_support!();
- pub struct State {
- pub ecs: World
- }
- impl State {
- fn run_systems(&mut self) {
- let mut vis = VisibilitySystem{};
- vis.run_now(&self.ecs);
- self.ecs.maintain();
- }
- }
- impl GameState for State {
- fn tick(&mut self, ctx : &mut Rltk) {
- ctx.cls();
- player_input(self, ctx);
- self.run_systems();
- draw_map(&self.ecs, ctx);
- let positions = self.ecs.read_storage::<Position>();
- let renderables = self.ecs.read_storage::<Renderable>();
- for (pos, render) in (&positions, &renderables).join() {
- ctx.set(pos.x, pos.y, render.fg, render.bg, render.glyph);
- }
- }
- }
- fn main() {
- let context = Rltk::init_simple8x8(80, 50, "Hello Rust World", "resources");
- let mut gs = State {
- ecs: World::new()
- };
- gs.ecs.register::<Position>();
- gs.ecs.register::<Renderable>();
- gs.ecs.register::<Player>();
- gs.ecs.register::<Viewshed>();
- let map : Map = Map::new_map_rooms_and_corridors();
- let (player_x, player_y) = map.rooms[0].center();
- gs.ecs.insert(map);
- gs.ecs
- .create_entity()
- .with(Position { x: player_x, y: player_y })
- .with(Renderable {
- glyph: rltk::to_cp437('@'),
- fg: RGB::named(rltk::YELLOW),
- bg: RGB::named(rltk::BLACK),
- })
- .with(Player{})
- .with(Viewshed{ visible_tiles : Vec::new(), range: 8, dirty: true })
- .build();
- rltk::main_loop(context, gs);
- }
|