Draw a Sketch

Tutorial Info

  • Author: tpltnt
  • Required Knowledge:
  • Reading Time: 5 minutes

Nannou is a framework for creative coding in Rust. A framework can be thought of as a collection of building blocks to help accomplish a goal. A sketch is the smallest/fastest way to get results with nannou. Here is one example which just yields a blue window:

use nannou::prelude::*; fn main() { nannou::sketch(view).run(); } fn view(app: &App, frame: Frame) { // get canvas to draw on let draw = app.draw(); // set background to blue draw.background().color(BLUE); // put everything on the frame draw.to_frame(app, &frame).unwrap(); }

You can exit the sketch by pressing ESC.

Explaining the Code

A sketch consists of at least two functions: main() and view(). First we import some building blocks:

#![allow(unused_imports)] use nannou::prelude::*; fn main() {}

After this import the actual sketching code starts. The main() functions is where all your logic starts. The code

use nannou::prelude::*; fn main() { nannou::sketch(view).run(); } fn view(_app: &App, _frame: Frame) {}

calls a function to draw on the single window (view() in this case). This function has the signature fn(_: &App, _: Frame);. Don't worry if you don't know what a function signature is. Just copy the main() function and you will be fine.

Within the view() function, what we draw to the Frame will be presented in our window.

#![allow(unused_imports)] use nannou::prelude::*; fn main() { nannou::sketch(view).run(); } fn view(app: &App, frame: Frame) { let draw = app.draw(); draw.background().color(BLUE); draw.to_frame(app, &frame).unwrap(); }

This function follows the same scheme. First some setup is done. The line

#![allow(unused_imports, unused_variables)] use nannou::prelude::*; fn main() { nannou::sketch(view).run(); } fn view(app: &App, _frame: Frame) { let draw = app.draw(); }

lets us assign a canvas-like datatype to the variable draw. We can now paint on the this canvas by setting the background to blue.

#![allow(unused_imports)] use nannou::prelude::*; fn main() { nannou::sketch(view).run(); } fn view(app: &App, _frame: Frame) { let draw = app.draw(); draw.background().color(BLUE); }

Now we have a canvas with only a blue background. We take this canvas and create a computer graphics frame from it to display in the main window.

#![allow(unused_imports)] use nannou::prelude::*; fn main() { nannou::sketch(view).run(); } fn view(app: &App, frame: Frame) { let draw = app.draw(); draw.to_frame(app, &frame).unwrap(); }

If you find the desire to respond to other kinds of events, interact with other kinds of input/output, track some state, or need more flexibility in general, you might be interested in creating a nannou app instead! You can also learn more about the difference between sketches and apps here.