diff options
author | 2024-04-27 15:11:03 +0200 | |
---|---|---|
committer | 2024-04-27 15:11:03 +0200 | |
commit | aeede66963a2e512ed299bdfd502c2c63a99cca9 (patch) | |
tree | a752a4fc4e476532ba23afef136571762902b924 /examples/the_matrix | |
parent | 2dcd4f916e0ea71f925212c8277498c6f995155b (diff) | |
download | iced-aeede66963a2e512ed299bdfd502c2c63a99cca9.tar.gz iced-aeede66963a2e512ed299bdfd502c2c63a99cca9.tar.bz2 iced-aeede66963a2e512ed299bdfd502c2c63a99cca9.zip |
Create `the_matrix` example
Diffstat (limited to 'examples/the_matrix')
-rw-r--r-- | examples/the_matrix/Cargo.toml | 12 | ||||
-rw-r--r-- | examples/the_matrix/src/main.rs | 116 |
2 files changed, 128 insertions, 0 deletions
diff --git a/examples/the_matrix/Cargo.toml b/examples/the_matrix/Cargo.toml new file mode 100644 index 00000000..17cf443b --- /dev/null +++ b/examples/the_matrix/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "the_matrix" +version = "0.1.0" +authors = ["Héctor Ramón Jiménez <hector0193@gmail.com>"] +edition = "2021" +publish = false + +[dependencies] +iced.workspace = true +iced.features = ["canvas", "tokio", "debug"] + +rand = "0.8" diff --git a/examples/the_matrix/src/main.rs b/examples/the_matrix/src/main.rs new file mode 100644 index 00000000..55c9da4b --- /dev/null +++ b/examples/the_matrix/src/main.rs @@ -0,0 +1,116 @@ +use iced::mouse; +use iced::time::{self, Instant}; +use iced::widget::canvas; +use iced::widget::canvas::{Cache, Geometry}; +use iced::{ + Color, Element, Font, Length, Point, Rectangle, Renderer, Subscription, + Theme, +}; + +pub fn main() -> iced::Result { + iced::program("The Matrix - Iced", TheMatrix::update, TheMatrix::view) + .subscription(TheMatrix::subscription) + .antialiasing(true) + .run() +} + +struct TheMatrix { + ticks: usize, + backgrounds: Vec<Cache>, +} + +#[derive(Debug, Clone, Copy)] +enum Message { + Tick(Instant), +} + +impl TheMatrix { + fn update(&mut self, message: Message) { + match message { + Message::Tick(_now) => { + self.ticks += 1; + } + } + } + + fn view(&self) -> Element<Message> { + canvas(self as &Self) + .width(Length::Fill) + .height(Length::Fill) + .into() + } + + fn subscription(&self) -> Subscription<Message> { + time::every(std::time::Duration::from_millis(50)).map(Message::Tick) + } +} + +impl Default for TheMatrix { + fn default() -> Self { + let mut backgrounds = Vec::with_capacity(30); + backgrounds.resize_with(30, Cache::default); + + Self { + ticks: 0, + backgrounds, + } + } +} + +impl<Message> canvas::Program<Message> for TheMatrix { + type State = (); + + fn draw( + &self, + _state: &Self::State, + renderer: &Renderer, + _theme: &Theme, + bounds: Rectangle, + _cursor: mouse::Cursor, + ) -> Vec<Geometry> { + use rand::distributions::Distribution; + use rand::Rng; + + const CELL_SIZE: f32 = 10.0; + + vec![self.backgrounds[self.ticks % self.backgrounds.len()].draw( + renderer, + bounds.size(), + |frame| { + frame.fill_rectangle(Point::ORIGIN, frame.size(), Color::BLACK); + + let mut rng = rand::thread_rng(); + let rows = (frame.height() / CELL_SIZE).ceil() as usize; + let columns = (frame.width() / CELL_SIZE).ceil() as usize; + + for row in 0..rows { + for column in 0..columns { + let position = Point::new( + column as f32 * CELL_SIZE, + row as f32 * CELL_SIZE, + ); + + let alphas = [0.05, 0.1, 0.2, 0.5]; + let weights = [10, 4, 2, 1]; + let distribution = + rand::distributions::WeightedIndex::new(weights) + .expect("Create distribution"); + + frame.fill_text(canvas::Text { + content: rng.gen_range('!'..'z').to_string(), + position, + color: Color { + a: alphas[distribution.sample(&mut rng)], + g: 1.0, + ..Color::BLACK + }, + size: CELL_SIZE.into(), + font: Font::MONOSPACE, + ..canvas::Text::default() + }); + } + } + }, + )] + } +} |