main.rs 3.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. use ggez;
  2. use ggez::event;
  3. use ggez::graphics;
  4. use ggez::nalgebra as na;
  5. use ggez::timer::check_update_time;
  6. use ggez::{Context, GameResult};
  7. use std::env;
  8. use std::path;
  9. struct SpriteInfo {
  10. start: na::Point2<f32>,
  11. tile_count: u16,
  12. relative_tile_width: f32,
  13. relative_tile_height: f32,
  14. }
  15. impl SpriteInfo {
  16. pub fn new(start: na::Point2<f32>, tile_count: u16) -> Self {
  17. let relative_tile_width: f32 = 1.0 / tile_count as f32;
  18. Self {
  19. start,
  20. tile_count,
  21. relative_tile_width,
  22. relative_tile_height: 1.0,
  23. }
  24. }
  25. pub fn from_type(type_: &SpriteType) -> Self {
  26. match type_ {
  27. SpriteType::WalkingSoldier => Self::new(na::Point2::new(0.0, 0.0), 7),
  28. }
  29. }
  30. }
  31. enum SpriteType {
  32. WalkingSoldier,
  33. }
  34. fn sprite_batch_part_from_sprite_info(
  35. sprite_info: &SpriteInfo,
  36. frame_i: u32,
  37. ) -> graphics::DrawParam {
  38. let src = graphics::Rect::new(
  39. frame_i as f32 * sprite_info.relative_tile_width,
  40. 0.0,
  41. sprite_info.relative_tile_width,
  42. sprite_info.relative_tile_height,
  43. );
  44. graphics::DrawParam::new().src(src)
  45. }
  46. struct SceneItem {
  47. sprite_info: SpriteInfo,
  48. position: na::Point2<f32>,
  49. }
  50. impl SceneItem {
  51. pub fn new(sprite_type: SpriteType, position: na::Point2<f32>) -> Self {
  52. Self {
  53. sprite_info: SpriteInfo::from_type(&sprite_type),
  54. position,
  55. }
  56. }
  57. }
  58. struct MainState {
  59. scene_items_sprite_batch: graphics::spritebatch::SpriteBatch,
  60. scene_items: Vec<SceneItem>,
  61. i: u32,
  62. }
  63. impl MainState {
  64. fn new(ctx: &mut Context) -> GameResult<MainState> {
  65. let image = graphics::Image::new(ctx, "/test.png").unwrap();
  66. let batch = graphics::spritebatch::SpriteBatch::new(image);
  67. let mut scene_items = vec![];
  68. for x in 0..10 {
  69. for y in 0..10 {
  70. scene_items.push(SceneItem::new(
  71. SpriteType::WalkingSoldier,
  72. na::Point2::new(x as f32 * 24.0, y as f32 * 24.0),
  73. ));
  74. }
  75. }
  76. let s = MainState {
  77. scene_items_sprite_batch: batch,
  78. scene_items,
  79. i: 0,
  80. };
  81. Ok(s)
  82. }
  83. }
  84. impl event::EventHandler for MainState {
  85. fn update(&mut self, ctx: &mut Context) -> GameResult {
  86. if check_update_time(ctx, 5) {
  87. self.i += 1;
  88. }
  89. if self.i > 6 {
  90. self.i = 0;
  91. }
  92. Ok(())
  93. }
  94. fn draw(&mut self, ctx: &mut Context) -> GameResult {
  95. graphics::clear(ctx, graphics::BLACK);
  96. for scene_item in self.scene_items.iter() {
  97. let sprite_batch_part = sprite_batch_part_from_sprite_info(&scene_item.sprite_info, self.i)
  98. .dest(scene_item.position.clone());
  99. self.scene_items_sprite_batch.add(sprite_batch_part);
  100. }
  101. graphics::draw(
  102. ctx,
  103. &self.scene_items_sprite_batch,
  104. graphics::DrawParam::new().dest(na::Point2::new(0.0, 0.0)),
  105. );
  106. self.scene_items_sprite_batch.clear();
  107. graphics::present(ctx);
  108. println!("FPS: {}", ggez::timer::fps(ctx));
  109. Ok(())
  110. }
  111. }
  112. // TODO: spite i par objet, fabrication des sprite_info qu'une fois; channel pour modifs des objets ds update
  113. pub fn main() -> GameResult {
  114. let resource_dir = if let Ok(manifest_dir) = env::var("CARGO_MANIFEST_DIR") {
  115. let mut path = path::PathBuf::from(manifest_dir);
  116. path.push("resources");
  117. path
  118. } else {
  119. path::PathBuf::from("./resources")
  120. };
  121. let cb = ggez::ContextBuilder::new("oc", "bux")
  122. .add_resource_path(resource_dir)
  123. .window_mode(ggez::conf::WindowMode::default().dimensions(800.0, 600.0));
  124. let (ctx, event_loop) = &mut cb.build()?;
  125. let state = &mut MainState::new(ctx)?;
  126. event::run(ctx, event_loop, state)
  127. }