

use nannou::prelude::*;
fn main() {
nannou::app(model).update(update).run();
}
struct Model {
position: Point2,
velocity: Vec2, // 속도도 벡터로 관리 가능
}
fn model(app: &App) -> Model {
app.new_window()
.size(400, 400)
.view(view)
.build()
.unwrap();
Model {
position: pt2(0.0, 0.0),
velocity: vec2(2.0, 0.0), // 오른쪽으로 이동
}
}
fn update(app: &App, model: &mut Model, _update: Update) {
model.position += model.velocity;
let win = app.window_rect();
let radius = 40.0;
// 화면 밖으로 나가면 반대편으로 이동
if model.position.x > win.right() + radius {
model.position.x = win.left() - radius;
}
}
fn view(app: &App, model: &Model, frame: Frame) {
let draw = app.draw();
draw.background().color(BLACK);
draw.ellipse()
.xy(model.position)
.radius(40.0)
.color(STEELBLUE);
draw.to_frame(app, &frame).unwrap();
}
fn main() {
nannou::app(model).update(update).run();
}
- 이 코드의 main 함수는 사실상 애플리케이션의 진입점일 뿐.
- 앱 실행 순서 (
모델→업데이트→실행) 를 체이닝으로 깔끔하게 정리하는 역할.- 실제 로직은 전부
nannou의App객체 안에서 수행됨.
nannou::app(model)model 함수는 프로그램이 시작할 때 한 번 실행돼서 Model 구조체를 초기화. view 함수가 등록됨.view 함수의 경우는 model 함수 안에서 app.new_window().view(view).build()로 연결해놨기 때문에, main에서는 따로 적어줄 필요가 없음..update(update)update 함수가 실행되도록 연결함.Model 값을 바꾸거나 애니메이션 상태를 계산함..run()update → view 순서로 돌아감.nannou::app(model)이 AppBuilder 같은 객체를 반환..update(update)가 그 객체를 다시 반환..run()이 실제 실행.let mut app = nannou::app(model);
app = app.update(update);
app.run();
이거를 한 줄로 체이닝한 것뿐임.