๐ŸŽ›๏ธ :: fn main()์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜

BamgasiJMยท2025๋…„ 9์›” 21์ผ

Nannou <BASIC>

๋ชฉ๋ก ๋ณด๊ธฐ
6/41
post-thumbnail

nannou v0.19 ์•ฑ & ์œˆ๋„์šฐ ๋นŒ๋” ์˜ต์…˜ ๋ชจ์Œ

nannou์—์„œ๋Š” app(model).update(update).event(event).view(view)... ํ˜•ํƒœ๋กœ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.
์ด๋•Œ ๊ฐ ์ฝœ๋ฐฑ์€ ์ •ํ•ด์ง„ ์‹œ๊ทธ๋‹ˆ์ฒ˜(์ธ์ž ํƒ€์ž…)๋ฅผ ๊ฐ€์ง€๋Š”๋ฐ, ์‹ค์ œ๋กœ ๋ชจ๋“  ์ธ์ž๋ฅผ ๋‹ค ์“ฐ๋Š” ๊ฒฝ์šฐ๋Š” ๋“œ๋ญ…๋‹ˆ๋‹ค.

์ปดํŒŒ์ผ๋Ÿฌ๋Š” "์•ˆ ์“ฐ๋Š” ๋ณ€์ˆ˜"์— ๊ฒฝ๊ณ ๋ฅผ ๋‚ด๊ธฐ ๋•Œ๋ฌธ์—, ํ•„์š” ์—†๋Š” ์ธ์ž๋Š” _ ํ˜น์€ _name์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

ํ•จ์ˆ˜์‹œ๊ทธ๋‹ˆ์ฒ˜์ธ์ž ์„ค๋ช…์ฃผ๋กœ ํ•„์š”ํ•œ ์ƒํ™ฉ
modelfn(&App) -> Modelapp: ์ „์—ญ ์•ฑ ์ƒํƒœ- ์œˆ๋„์šฐ ํฌ๊ธฐ/์œ„์น˜ ๊ฐ€์ ธ์˜ฌ ๋•Œ
- ํ…์Šค์ฒ˜, ์บก์ฒ˜ ์ดˆ๊ธฐํ™”
updatefn(&App, &mut Model, Update)app: ์ „์—ญ ์ •๋ณด
model: ์‚ฌ์šฉ์ž ์ •์˜ ์ƒํƒœ
update: ๋ธํƒ€ํƒ€์ž„ ๋“ฑ
- ๋ชจ๋ธ ๊ฐ’ ๋งค ํ”„๋ ˆ์ž„ ๊ฐฑ์‹ 
- ์• ๋‹ˆ๋ฉ”์ด์…˜, ๋ฌผ๋ฆฌ ์‹œ๋ฎฌ๋ ˆ์ด์…˜
eventfn(&App, &mut Model, Event)event: ๋ชจ๋“  ์ž…๋ ฅ/์œˆ๋„์šฐ ์ด๋ฒคํŠธ- ๋งˆ์šฐ์Šค/ํ‚ค๋ณด๋“œ ์ œ์–ด
- ์œˆ๋„์šฐ ํฌ๊ธฐ ๋ณ€๊ฒฝ ๋ฐ˜์‘
viewfn(&App, &Model, Frame)app: draw ํ•ธ๋“ค ์ ‘๊ทผ
model: ํ˜„์žฌ ์ƒํƒœ ์ฝ๊ธฐ
frame: ์ด๋ฒˆ ํ”„๋ ˆ์ž„ ์บ”๋ฒ„์Šค
- ํ™”๋ฉด ๊ทธ๋ฆฌ๊ธฐ
exitfn(&App, &mut Model)์•ฑ ์ข…๋ฃŒ ์‹œ ํ˜ธ์ถœ- ํŒŒ์ผ ์ €์žฅ, ๋ฆฌ์†Œ์Šค ํ•ด์ œ

๐ŸŽฏ ๊ฐ ์ธ์ž์˜ ํ•„์š”์„ฑ ๊ฐ€์ด๋“œ

&App

  • ์ „์—ญ ์•ฑ ์ƒํƒœ๋ฅผ ์˜๋ฏธ

    • app.draw() โ†’ ๊ทธ๋ฆผ ๊ทธ๋ฆด ๋•Œ
    • app.time โ†’ ๊ฒฝ๊ณผ ์‹œ๊ฐ„ ์ฐธ์กฐ
    • app.window_rect() โ†’ ์œˆ๋„์šฐ ํฌ๊ธฐ/์ขŒํ‘œ ์‚ฌ์šฉ
  • ์•ˆ ์“ฐ๋Š” ๊ฒฝ์šฐ: ๋‹จ์ˆœํžˆ ๋ชจ๋ธ ๊ฐ’๋งŒ ๊ฐฑ์‹ ํ•  ๋•Œ

&mut Model ํ˜น์€ &Model

  • ์‚ฌ์šฉ์ž ์ •์˜ ์ƒํƒœ ๊ตฌ์กฐ์ฒด

    • ์œ„์น˜, ์ƒ‰์ƒ, ์†๋„ ๋“ฑ ์ƒํƒœ๋ฅผ ์ €์žฅ/๋ณ€๊ฒฝํ•  ๋•Œ
    • update์—์„œ &mut Model โ†’ ๊ฐ’ ๋ณ€๊ฒฝ
    • view์—์„œ &Model โ†’ ๊ฐ’ ์ฝ๊ธฐ
  • ์•ˆ ์“ฐ๋Š” ๊ฒฝ์šฐ: ์ƒํƒœ ์—†์ด ๋žœ๋ค ๊ทธ๋ฆผ๋งŒ ๊ทธ๋ฆฌ๊ณ  ์‹ถ์„ ๋•Œ

Update

  • ํ”„๋ ˆ์ž„๋ณ„ ๊ฐฑ์‹  ์ •๋ณด (delta time ํฌํ•จ)

    • ์‹œ๊ฐ„ ๊ธฐ๋ฐ˜ ์• ๋‹ˆ๋ฉ”์ด์…˜ (ํ”„๋ ˆ์ž„ ๋ ˆ์ดํŠธ ๋ฌด๊ด€)
    • update.since_last โ†’ ๊ฒฝ๊ณผ ์‹œ๊ฐ„ ํ™œ์šฉ
  • ์•ˆ ์“ฐ๋Š” ๊ฒฝ์šฐ: frame count ๊ธฐ๋ฐ˜ ์• ๋‹ˆ๋ฉ”์ด์…˜๋งŒ ํ•  ๋•Œ

Event

  • ๋ชจ๋“  ์ž…๋ ฅ ์ด๋ฒคํŠธ๊ฐ€ ๋“ค์–ด์˜ค๋Š” ๊ด€๋ฌธ

    • ํ‚ค๋ณด๋“œ ์ž…๋ ฅ (KeyPressed, KeyReleased)
    • ๋งˆ์šฐ์Šค ์ž…๋ ฅ (MouseMoved, MousePressed, MouseReleased)
    • ์œˆ๋„์šฐ ์ด๋ฒคํŠธ (Resized, Moved)
  • ์•ˆ ์“ฐ๋Š” ๊ฒฝ์šฐ: ์ž…๋ ฅ์„ ์“ฐ์ง€ ์•Š๊ณ  ์ž๋™์œผ๋กœ ๊ทธ๋ฆผ๋งŒ ๊ฐฑ์‹ ํ•  ๋•Œ

Frame

  • ํ˜„์žฌ ํ”„๋ ˆ์ž„์˜ ์บ”๋ฒ„์Šค

    • draw.to_frame(app, &frame) โ†’ ์‹ค์ œ ํ™”๋ฉด์— ์ถœ๋ ฅ
  • ์•ˆ ์“ฐ๋Š” ๊ฒฝ์šฐ: view๋ฅผ ์•ˆ ์“ฐ๋Š” ๊ฒฝ์šฐ๋Š” ๊ฑฐ์˜ ์—†์Œ (ํ•ญ์ƒ ํ•„์š”)


๐ŸŽฏ ๋ฉ”์†Œ๋“œ ๋ณ„ ์ธ์ž ๋ฐ ํ•จ์ˆ˜ ๊ฐ€์ด๋“œ

๋ฉ”์†Œ๋“œ/์˜ต์…˜์œ„์น˜ (App vs Window)์ธ์ž ๋˜๋Š” ๋„˜๊ฒจ์ฃผ๋Š” ํ•จ์ˆ˜ํ•จ์ˆ˜(์ฝœ๋ฐฑ) ์‹œ๊ทธ๋‹ˆ์ฒ˜์—ญํ•  ์š”์•ฝ
app(model)App ๋นŒ๋” ์‹œ์ž‘model: fn(&App) -> Modelfn(&App) -> Model์•ฑ ์ƒํƒœ ๋งŒ๋“ค๊ธฐ
.update(update)Appupdate: fn(&App, &mut Model, Update)fn(&App, &mut Model, Update)๋งค ํ”„๋ ˆ์ž„ ์ƒํƒœ ๊ฐฑ์‹ 
.event(event)Appevent: fn(&App, &mut Model, Event)fn(&App, &mut Model, Event)์ „์—ญ ์ž…๋ ฅ / ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ
.simple_window(view)Appview: fn(&App, &Model, Frame)fn(&App, &Model, Frame)๋‹จ์ˆœ ์œˆ๋„์šฐ + ๋ทฐ ๋งŒ๋“ค๊ธฐ
.size(w, h)Appw: u32, h: u32โ€”์œˆ๋„์šฐ ๋„ˆ๋น„/๋†’์ด ์„ค์ •
.loop_mode(mode)Appmode: LoopModeโ€”์‹คํ–‰ ๋ฐฉ์‹ ์กฐ์ • (vsync, ๊ณ ์ • ์†๋„ ๋“ฑ)
.exit(exit_fn)Appexit_fn: fn(&App, Model)fn(&App, Model)์•ฑ ์ข…๋ฃŒ ์‹œ ํ˜ธ์ถœ
.run()Appโ€”โ€”์•ฑ ์‹œ์ž‘

๋ฉ”์†Œ๋“œ/์˜ต์…˜์œ„์น˜ (Window)์ธ์ž ๋˜๋Š” ๋„˜๊ฒจ์ฃผ๋Š” ํ•จ์ˆ˜ํ•จ์ˆ˜(์ฝœ๋ฐฑ) ์‹œ๊ทธ๋‹ˆ์ฒ˜์—ญํ•  ์š”์•ฝ
.view(view_fn)Windowfn(&App, &Model, Frame)fn(&App, &Model, Frame)ํ•ด๋‹น ์œˆ๋„์šฐ ๊ทธ๋ฆฌ๊ธฐ ํ•จ์ˆ˜
.raw_view(raw_view_fn)Windowfn(&App, &Model, RawFrame)fn(&App, &Model, RawFrame)์ €์ˆ˜์ค€ ๋ Œ๋”๋ง
.sketch(sketch_fn)Windowfn(&App, Frame)fn(&App, Frame)๊ฐ„๋‹จํ•œ ์Šค์ผ€์น˜ ๋ชจ๋“œ
.event(event_fn)Windowfn(&App, &mut Model, WindowEvent)fn(&App, &mut Model, WindowEvent)์œˆ๋„์šฐ ์ด๋ฒคํŠธ ์ „์ฒด
.raw_event(raw_event_fn)Windowfn(&App, &mut Model, winit::WindowEvent)fn(&App, &mut Model, WindowEventRaw)์›์‹œ ์œˆ๋„์šฐ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ
.key_pressed(f) / .key_released(f)Windowfn(&App, &mut Model, Key)fn(&App, &mut Model, Key)ํ‚ค ์ž…๋ ฅ ์ฒ˜๋ฆฌ
.received_character(f)Windowfn(&App, &mut Model, char)fn(&App, &mut Model, char)๋ฌธ์ž ์ž…๋ ฅ ์ฒ˜๋ฆฌ
.mouse_moved(f)Windowfn(&App, &mut Model, Point2)fn(&App, &mut Model, Point2)๋งˆ์šฐ์Šค ์›€์ง์ž„ ๊ฐ์ง€
.mouse_pressed(f) / .mouse_released(f)Windowfn(&App, &mut Model, MouseButton)fn(&App, &mut Model, MouseButton)๋งˆ์šฐ์Šค ๋ฒ„ํŠผ
.mouse_wheel(f)Windowfn(&App, &mut Model, MouseScrollDelta)fn(&App, &mut Model, MouseScrollDelta)ํœ /์Šคํฌ๋กค
.mouse_entered(f) / .mouse_exited(f)Windowfn(&App, &mut Model)fn(&App, &mut Model)๋งˆ์šฐ์Šค ์œˆ๋„์šฐ ์•ˆํŒŽ ์ด๋™
.touch(f)Windowfn(&App, &mut Model, TouchEvent)fn(&App, &mut Model, TouchEvent)ํ„ฐ์น˜ ์ž…๋ ฅ
.touchpad_pressure(f)Windowfn(&App, &mut Model, TouchpadPressure)fn(&App, &mut Model, TouchpadPressure)ํ„ฐ์น˜ํŒจ๋“œ ์••๋ ฅ๊ฐ์ง€
.moved(f)Windowfn(&App, &mut Model, Point2)fn(&App, &mut Model, Point2)์œˆ๋„์šฐ ์œ„์น˜ ๋ฐ”๋€œ
.resized(f)Windowfn(&App, &mut Model, Size2)fn(&App, &mut Model, Size2)์œˆ๋„์šฐ ํฌ๊ธฐ ๋ณ€๊ฒฝ
.focused(f) / .unfocused(f)Windowfn(&App, &mut Model)fn(&App, &mut Model)์œˆ๋„์šฐ ํฌ์ปค์Šค ํš๋“/์ƒ์‹ค
.closed(f)Windowfn(&App, &mut Model)fn(&App, &mut Model)์œˆ๋„์šฐ ๋‹ซํž˜
.hovered_file(f) / .dropped_file(f)Windowfn(&App, &mut Model, PathBuf)fn(&App, &mut Model, PathBuf)ํŒŒ์ผ ๋“œ๋ž˜๊ทธํ•ด์„œ ๊ฐ€์ ธ์˜ค๊ธฐ etc.
.clear_color(color)Windowcolor: IntoLinSrgba<f32>โ€”๋ฐฐ๊ฒฝ์ƒ‰ ์ง€์ •
.max_capture_frame_jobs(n)Windown: u32โ€”์บก์ฒ˜ ํ”„๋ ˆ์ž„ ์ž‘์—… ๋™์‹œ ์‹คํ–‰ ์ตœ๋Œ€ ๊ฐœ์ˆ˜

โœ… โš™๏ธ๐Ÿ› ๏ธ๐Ÿ“„๐Ÿ“š๐ŸŽจ๐Ÿ–ผ๏ธ๐Ÿงฉ๐Ÿง ๐Ÿงฎ๐Ÿ•น๏ธ๐Ÿงฟโณ๐ŸŽ›๏ธ๐Ÿ”ฎ๐ŸŒŒ๐Ÿชฉ๐Ÿ—‚๏ธ๐Ÿ“๐Ÿงฐ๐Ÿ”’

์•„๋ณด์นด๋„
Sample
Important
Highlighting
๋น„์ƒ‰
์ ํ™ฉ์ƒ‰
purple
hot pink
yellow
์‚ด๊ตฌ์ƒ‰
orange
green
blue

profile
Coding Art with Blender / oF / Processing / p5.js / nannou

0๊ฐœ์˜ ๋Œ“๊ธ€