diff options
| author | Charles <sircharlesaze@gmail.com> | 2020-07-09 22:56:34 +0200 |
|---|---|---|
| committer | Charles <sircharlesaze@gmail.com> | 2020-07-10 15:36:45 +0200 |
| commit | c0e7c121e96713549dce67b01f8d86ef79e6ab80 (patch) | |
| tree | 3ad4d371835c2c18e08a96d0231b8836786a67dc | |
| download | boids-c0e7c121e96713549dce67b01f8d86ef79e6ab80.tar.gz boids-c0e7c121e96713549dce67b01f8d86ef79e6ab80.tar.bz2 boids-c0e7c121e96713549dce67b01f8d86ef79e6ab80.zip | |
Initial commit: drawing boid with direction and position
| -rw-r--r-- | .gitignore | 1 | ||||
| -rw-r--r-- | Cargo.lock | 54 | ||||
| -rw-r--r-- | Cargo.toml | 10 | ||||
| -rw-r--r-- | src/boid.rs | 52 | ||||
| -rw-r--r-- | src/main.rs | 42 |
5 files changed, 159 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..ba5e857 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,54 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +[[package]] +name = "bitflags" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" + +[[package]] +name = "boids" +version = "0.1.0" +dependencies = [ + "sdl2", +] + +[[package]] +name = "cfg-if" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.71" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9457b06509d27052635f90d6466700c65095fdf75409b3fbdd903e988b886f49" + +[[package]] +name = "sdl2" +version = "0.34.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45c68e7a45838d6dd8723347a5d233f2c989f0b291f18a46158d5dfbb275ada1" +dependencies = [ + "bitflags", + "lazy_static", + "libc", + "sdl2-sys", +] + +[[package]] +name = "sdl2-sys" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "575db20c45cce6565d4ece46509288ded53f5571dc89e4af165a562eb0eeec26" +dependencies = [ + "cfg-if", + "libc", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..a31ad4c --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "boids" +version = "0.1.0" +authors = ["Charles <sircharlesaze@gmail.com>"] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +sdl2 = "0.34.0" diff --git a/src/boid.rs b/src/boid.rs new file mode 100644 index 0000000..dfc0755 --- /dev/null +++ b/src/boid.rs @@ -0,0 +1,52 @@ +use std::f32::consts::{FRAC_PI_2}; + +use sdl2::rect::Point; +use sdl2::render::Canvas; + +pub struct Boid { + dir_x: f32, + dir_y: f32, + position: Point, +} + +const TRIANGLE_SIZE: i32 = 20; +const SPEED: f32 = 10.0; + +use sdl2::video::Window; +impl Boid { + pub fn new(position: Point) -> Boid { + Boid { dir_x: 0.1, dir_y: 0.2, position } + } + + pub fn draw(&self, canvas: &mut Canvas<Window>) { + let top = self.position.offset(0, -TRIANGLE_SIZE); + let bot_left = self.position.offset(-TRIANGLE_SIZE / 3, TRIANGLE_SIZE / 2); + let bot_right = self.position.offset(TRIANGLE_SIZE / 3, TRIANGLE_SIZE / 2); + + // direction angle = t + // tan t = y / x + // rotation + // | x cos t -y sin t | + // | x sin t y cos t | + + let angle = (self.dir_y / self.dir_x).atan() + FRAC_PI_2; + let s = angle.sin(); + let c = angle.cos(); + + let ps: Vec<Point> = [top, bot_left, bot_right, top].iter().map(|p| { + let x = (p.x() - self.position.x()) as f32; + let y = (p.y() - self.position.y()) as f32; + Point::new((x * c - y * s) as i32 + self.position.x(), + (x * s + y * c) as i32 + self.position.y()) + }).collect(); + + canvas.draw_lines(&ps[..]).unwrap(); + } + + pub fn step(&mut self) { + self.position = self.position.offset( + (self.dir_x * SPEED) as i32, + (self.dir_y * SPEED) as i32 + ); + } +} diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..4c6ce8f --- /dev/null +++ b/src/main.rs @@ -0,0 +1,42 @@ +extern crate sdl2; + +use sdl2::event::Event; +use sdl2::keyboard::Keycode; +use sdl2::pixels::Color; +use sdl2::rect::Point; + +pub mod boid; +use boid::Boid; + +fn main() { + let sdl = sdl2::init().unwrap(); + let video_subsys = sdl.video().unwrap(); + + let window = video_subsys.window("boids", 640, 480).build().unwrap(); + let mut canvas = window.into_canvas().build().unwrap(); + + let mut b = Boid::new(Point::new(50, 50)); + + let mut event_pump = sdl.event_pump().unwrap(); + 'main: loop { + for event in event_pump.poll_iter() { + match event { + Event::Quit { .. } | + Event::KeyDown { keycode: Some(Keycode::Q), .. } | + Event::KeyDown { keycode: Some(Keycode::Escape), .. } + => break 'main, + _ => {}, + } + } + canvas.set_draw_color(Color::RGB(0, 0, 0)); + canvas.clear(); + canvas.set_draw_color(Color::RGB(200, 200, 200)); + b.draw(&mut canvas); + + canvas.present(); + + b.step(); + + std::thread::sleep(std::time::Duration::new(0, 50_000_000)); + } +} |
