main.rs 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. #[macro_use] extern crate specs_derive;
  2. use ggez::{Context, ContextBuilder, GameResult};
  3. use ggez::event::{self, EventHandler};
  4. use ggez::graphics;
  5. use specs::RunNow;
  6. use sdl2::keyboard as sdl;
  7. pub mod consts;
  8. pub mod components;
  9. pub mod res;
  10. pub mod sys;
  11. struct MyGame {
  12. world: specs::World,
  13. sprites: graphics::spritebatch::SpriteBatch,
  14. }
  15. impl EventHandler for MyGame {
  16. fn update(&mut self, _ctx: &mut Context) -> GameResult<()> {
  17. Ok(())
  18. }
  19. fn draw(&mut self, ctx: &mut Context) -> GameResult<()> {
  20. ggez::graphics::set_background_color(ctx, ggez::graphics::BLACK);
  21. ggez::graphics::clear(ctx);
  22. sys::Draw {
  23. ctx,
  24. sprites: &mut self.sprites,
  25. _phase: components::Background,
  26. }.run_now(&self.world.res);
  27. sys::Draw {
  28. ctx,
  29. sprites: &mut self.sprites,
  30. _phase: components::Foreground,
  31. }.run_now(&self.world.res);
  32. sys::Draw {
  33. ctx,
  34. sprites: &mut self.sprites,
  35. _phase: components::Decoration,
  36. }.run_now(&self.world.res);
  37. ggez::graphics::draw(
  38. ctx,
  39. &self.sprites,
  40. ggez::nalgebra::Point2::new(0.0, 0.0),
  41. 0.0
  42. )?;
  43. self.sprites.clear();
  44. ggez::graphics::present(ctx);
  45. Ok(())
  46. }
  47. fn key_down_event(
  48. &mut self,
  49. ctx: &mut Context,
  50. keycode: sdl::Keycode,
  51. _keymod: sdl::Mod,
  52. _repeat: bool,
  53. ) {
  54. if keycode == sdl::Keycode::Escape {
  55. ctx.quit().expect("Should never fail");
  56. }
  57. sys::Move { keycode }.run_now(&self.world.res);
  58. }
  59. }
  60. fn main() -> Result<(), ggez::error::GameError> {
  61. let mut world = specs::World::new();
  62. components::register(&mut world);
  63. res::world_from_file(&mut world, "assets/main.tmx");
  64. // Make a Context and an EventLoop.
  65. let mut ctx = ContextBuilder::new("game", "me")
  66. .add_resource_path({
  67. let base = std::env::var("CARGO_MANIFEST_DIR").unwrap();
  68. let mut path = std::path::PathBuf::from(base);
  69. path.push("assets");
  70. path
  71. })
  72. .window_mode(ggez::conf::WindowMode {
  73. width: consts::WINDOW_WIDTH,
  74. height: consts::WINDOW_HEIGHT,
  75. ..Default::default()
  76. })
  77. .build()?;
  78. let image = graphics::Image::new(&mut ctx, "/spritesheet.png")?;
  79. let mut sprites = graphics::spritebatch::SpriteBatch::new(image);
  80. sprites.set_filter(ggez::graphics::FilterMode::Nearest);
  81. let mut my_game = MyGame {
  82. world,
  83. sprites,
  84. };
  85. event::run(&mut ctx, &mut my_game)
  86. }