aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCharles <sircharlesaze@gmail.com>2020-07-09 22:56:34 +0200
committerCharles <sircharlesaze@gmail.com>2020-07-10 15:36:45 +0200
commitc0e7c121e96713549dce67b01f8d86ef79e6ab80 (patch)
tree3ad4d371835c2c18e08a96d0231b8836786a67dc
downloadboids-c0e7c121e96713549dce67b01f8d86ef79e6ab80.tar.gz
boids-c0e7c121e96713549dce67b01f8d86ef79e6ab80.tar.bz2
boids-c0e7c121e96713549dce67b01f8d86ef79e6ab80.zip
Initial commit: drawing boid with direction and position
-rw-r--r--.gitignore1
-rw-r--r--Cargo.lock54
-rw-r--r--Cargo.toml10
-rw-r--r--src/boid.rs52
-rw-r--r--src/main.rs42
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));
+ }
+}