main.rs 3.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  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. source: graphics::Rect,
  11. tile_count: u16,
  12. relative_tile_width: f32,
  13. relative_tile_height: f32,
  14. }
  15. impl SpriteInfo {
  16. pub fn new(source: graphics::Rect, tile_count: u16) -> Self {
  17. let relative_tile_width: f32 = 1.0 / tile_count as f32;
  18. Self {
  19. source,
  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(graphics::Rect::new(0.0, 0.0, 128.0, 24.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. current_sprite_type: SpriteType,
  48. position: na::Point2<f32>,
  49. }
  50. impl SceneItem {
  51. pub fn new(current_sprite_type: SpriteType, position: na::Point2<f32>) -> Self {
  52. Self {
  53. current_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_info = SpriteInfo::from_type(&scene_item.current_sprite_type);
  98. let sprite_batch_part = sprite_batch_part_from_sprite_info(&sprite_info, self.i)
  99. .dest(scene_item.position.clone());
  100. self.scene_items_sprite_batch.add(sprite_batch_part);
  101. }
  102. graphics::draw(
  103. ctx,
  104. &self.scene_items_sprite_batch,
  105. graphics::DrawParam::new().dest(na::Point2::new(0.0, 0.0)),
  106. );
  107. self.scene_items_sprite_batch.clear();
  108. graphics::present(ctx);
  109. println!("FPS: {}", ggez::timer::fps(ctx));
  110. Ok(())
  111. }
  112. }
  113. // TODO: spite i par objet, fabrication des sprite_info qu'une fois; channel pour modifs des objets ds update
  114. pub fn main() -> GameResult {
  115. let resource_dir = if let Ok(manifest_dir) = env::var("CARGO_MANIFEST_DIR") {
  116. let mut path = path::PathBuf::from(manifest_dir);
  117. path.push("resources");
  118. path
  119. } else {
  120. path::PathBuf::from("./resources")
  121. };
  122. let cb = ggez::ContextBuilder::new("oc", "bux")
  123. .add_resource_path(resource_dir)
  124. .window_mode(ggez::conf::WindowMode::default().dimensions(800.0, 600.0));
  125. let (ctx, event_loop) = &mut cb.build()?;
  126. let state = &mut MainState::new(ctx)?;
  127. event::run(ctx, event_loop, state)
  128. }