Advertisement
Guest User

Untitled

a guest
Jun 17th, 2019
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.41 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. /// Run with: cargo run --example testgame --release
  15. fn main() {
  16. SimpleLogger::init(LevelFilter::Trace);
  17.  
  18. let mut clock = Clock::new(1440);
  19. let mut engine = Engine::new();
  20.  
  21. let screen = engine.batch_create(&BatchDescription::default());
  22. let mut sprites = Vec::new();
  23. let mut particles = Vec::new();
  24. for x in -500..500 {
  25. for y in -500..500 {
  26. let (sprite, particle) = Particle::new(Vector3::new(x as f32 * 2.0, y as f32 * 2.0, 0.0));
  27. sprites.push(sprite);
  28. particles.push(particle);
  29. }
  30. }
  31.  
  32. let mut is_active = true;
  33. while is_active {
  34. engine.input_poll(|message| match message {
  35. InputMessage::CloseRequested => is_active = false,
  36. InputMessage::KeyPressed(key) => match key {
  37. KeyboardButton::Escape => is_active = false,
  38. _ => {},
  39. },
  40. _ => {},
  41. });
  42.  
  43. let delta = clock.get_delta();
  44. for index in 0..sprites.len() {
  45. Particle::tick(&mut sprites[index], &mut particles[index], delta);
  46. }
  47. engine.sprite_set(&screen, &sprites);
  48.  
  49. engine.window_commit();
  50. clock.tick();
  51. }
  52. }
  53.  
  54. pub struct Particle {
  55. pos: Vector2<f32>,
  56. velocity: Vector2<f32>,
  57. acceleration: Vector2<f32>,
  58. }
  59.  
  60. impl Particle {
  61. const G: f32 = 6.674;
  62. const MASS: f32 = 200.0;
  63.  
  64. pub fn new(pos: Vector3<f32>) -> (SpriteDescription, Particle) {
  65. let sprite = SpriteDescription::new(pos, Vector2::new(1.0, 1.0), DEFAULT_TEXTURE, BLACK, 0.0);
  66. let particle = Particle {
  67. pos: pos.truncate(),
  68. velocity: Vector2::zero(),
  69. acceleration: Vector2::zero(),
  70. };
  71. (sprite, particle)
  72. }
  73.  
  74. pub fn tick(sprite: &mut SpriteDescription, particle: &mut Particle, delta: f32) {
  75. let length_squared = particle.pos.x * particle.pos.x + particle.pos.y * particle.pos.y;
  76. let length = f32::sqrt(length_squared);
  77. let norm = particle.pos / length;
  78. particle.acceleration = -(norm * (Self::G * Self::MASS)) / length_squared.max(1000.0);
  79. particle.velocity += particle.acceleration;
  80. particle.pos += particle.velocity * delta;
  81.  
  82. sprite.set_pos(particle.pos.extend(0.0));
  83. }
  84. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement