Advertisement
Guest User

Untitled

a guest
Jun 17th, 2019
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.39 KB | None | 0 0
  1. extern crate log;
  2. extern crate storm;
  3.  
  4. mod logger;
  5.  
  6. use cgmath::prelude::*;
  7. use cgmath::*;
  8. use log::LevelFilter;
  9. use logger::*;
  10. use storm::color::*;
  11. use storm::time::*;
  12. use storm::*;
  13.  
  14. fn main() {
  15. SimpleLogger::init(LevelFilter::Trace);
  16.  
  17. let mut clock = Clock::new(144);
  18. let mut engine = Engine::new();
  19.  
  20. let screen = engine.batch_create(&BatchDescription::default());
  21. let mut sprites = Vec::new();
  22. let mut particles = Vec::new();
  23. for x in -500..500 {
  24. for y in -500..500 {
  25. let (sprite, particle) = Particle::new(Vector3::new(x as f32 * 2.0, y as f32 * 2.0, 0.0));
  26. sprites.push(sprite);
  27. particles.push(particle);
  28. }
  29. }
  30.  
  31. let mut is_active = true;
  32. while is_active {
  33. engine.input_poll(|message| match message {
  34. InputMessage::CloseRequested => is_active = false,
  35. InputMessage::KeyPressed(key) => match key {
  36. KeyboardButton::Escape => is_active = false,
  37. _ => {},
  38. },
  39. _ => {},
  40. });
  41.  
  42. let delta = clock.get_delta();
  43. for index in 0..sprites.len() {
  44. Particle::tick(&mut sprites[index], &mut particles[index], delta);
  45. }
  46.  
  47. engine.sprite_set(&screen, &sprites);
  48. engine.window_commit();
  49. clock.tick();
  50. }
  51. }
  52.  
  53. pub struct Particle {
  54. pos: Vector2<f32>,
  55. velocity: Vector2<f32>,
  56. acceleration: Vector2<f32>,
  57. }
  58.  
  59. impl Particle {
  60. const G: f32 = 6.674;
  61. const MASS: f32 = 200.0;
  62.  
  63. pub fn new(pos: Vector3<f32>) -> (SpriteDescription, Particle) {
  64. let sprite = SpriteDescription::new(pos, Vector2::new(2.0, 2.0), DEFAULT_TEXTURE, BLACK, 0.0);
  65. let particle = Particle {
  66. pos: pos.truncate(),
  67. velocity: Vector2::zero(),
  68. acceleration: Vector2::zero(),
  69. };
  70. (sprite, particle)
  71. }
  72.  
  73. pub fn tick(sprite: &mut SpriteDescription, particle: &mut Particle, delta: f32) {
  74. let length = f32::sqrt(particle.pos.x * particle.pos.x + particle.pos.y * particle.pos.y);
  75. let norm = particle.pos / length;
  76. let norm_squared = norm.mul_element_wise(norm);
  77. particle.acceleration = -(norm * (Self::G * Self::MASS)).div_element_wise(norm_squared);
  78. particle.velocity += particle.acceleration * delta * 0.1;
  79. particle.pos += particle.velocity * delta * 0.1;
  80.  
  81. sprite.set_pos(particle.pos.extend(0.0));
  82. }
  83. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement