util.rs 1.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. use ggez::graphics::{Color, DrawMode, MeshBuilder};
  2. use ggez::{graphics, GameResult};
  3. use crate::map::Map;
  4. use crate::ScenePoint;
  5. pub fn update_terrain_batch(
  6. mut terrain_batch: graphics::spritebatch::SpriteBatch,
  7. map: &Map,
  8. ) -> graphics::spritebatch::SpriteBatch {
  9. terrain_batch.clear();
  10. for ((grid_x, grid_y), tile) in map.terrain.tiles.iter() {
  11. // FIXME pre compute these data ?
  12. let src_x = tile.tile_x as f32 * tile.relative_tile_width;
  13. let src_y = tile.tile_y as f32 * tile.relative_tile_height;
  14. let dest_x = *grid_x as f32 * tile.tile_width as f32;
  15. let dest_y = *grid_y as f32 * tile.tile_height as f32;
  16. terrain_batch.add(
  17. graphics::DrawParam::new()
  18. .src(graphics::Rect::new(
  19. src_x,
  20. src_y,
  21. tile.relative_tile_width,
  22. tile.relative_tile_height,
  23. ))
  24. .dest(ScenePoint::new(dest_x, dest_y)),
  25. );
  26. }
  27. terrain_batch
  28. }
  29. pub fn create_debug_terrain_opacity_mesh_builder(map: &Map) -> GameResult<MeshBuilder> {
  30. let mut debug_terrain_opacity_mesh = MeshBuilder::new();
  31. for ((grid_x, grid_y), tile) in map.terrain.tiles.iter() {
  32. let dest_x = *grid_x as f32 * tile.tile_width as f32;
  33. let dest_y = *grid_y as f32 * tile.tile_height as f32;
  34. let color_modifier = 0.6 * tile.opacity;
  35. debug_terrain_opacity_mesh.rectangle(
  36. DrawMode::fill(),
  37. graphics::Rect::new(
  38. dest_x,
  39. dest_y,
  40. tile.tile_width as f32,
  41. tile.tile_height as f32,
  42. ),
  43. Color {
  44. r: 0.4 - color_modifier,
  45. g: 0.4 - color_modifier,
  46. b: 0.4 - color_modifier,
  47. a: 1.0,
  48. },
  49. )?;
  50. }
  51. Ok(debug_terrain_opacity_mesh)
  52. }