Struct StdoutTarget

Source
pub struct StdoutTarget { /* private fields */ }
Expand description

Render to stdout

Implementations§

Source§

impl StdoutTarget

Source

pub fn new() -> Result<Self>

Create a new stdout target. This sets up the terminal so tinybit can draw on it. That includes:

  • Enabling raw mode
  • Entering an alternate screen
  • Hiding the cursor
  • Clearing the screen

Once this is dropped it will reset all these settings.

Examples found in repository?
examples/simple.rs (line 21)
7fn main() {
8    let (width, height) = term_size().expect("Can't get the term size? Can't play the game!");
9
10    // Viewport
11    let viewport_size = ScreenSize::new(width / 2, height / 2);
12    let mut viewport = Viewport::new(ScreenPos::new(0, 4), viewport_size);
13
14    // Camera
15    let (width, height) = (width as i64, height as i64);
16    let camera_size = WorldSize::new(width / 2, height / 2);
17    let camera_pos = WorldPos::new(width, height);
18    let camera = Camera::new(camera_pos, camera_size);
19
20    // Renderer
21    let stdout_renderer = StdoutTarget::new().expect("Failed to enter raw mode");
22    let mut renderer = Renderer::new(stdout_renderer);
23
24    // Player
25    let mut player = ('@', camera_pos);
26
27    let (_, events) = events::<()>(EventModel::Fps(20));
28    for event in events {
29        match event {
30            Event::User(()) => {}
31            Event::Tick => {
32                let pixel = Pixel::new(player.0, camera.to_screen(player.1), None, None);
33                viewport.draw_pixel(pixel);
34                let _ = renderer.render(&mut viewport);
35                viewport.swap_buffers();
36            }
37            Event::Key(KeyEvent { code: KeyCode::Esc, ..  }) => break,
38            Event::Key(KeyEvent { code: kc, .. }) => {
39                match kc {
40                    KeyCode::Left => { player.1.x -= 1; }
41                    KeyCode::Right => { player.1.x += 1; }
42                    KeyCode::Up => { player.1.y -= 1; }
43                    KeyCode::Down => { player.1.y += 1; }
44                    _ => {}
45                }
46            }
47            Event::Resize(_w, _h) => {}
48        }
49    }
50}
More examples
Hide additional examples
examples/world.rs (line 37)
24fn main() {
25    let (width, height) = term_size().expect("Can't get the term size? Can't play the game!");
26
27    // Viewport
28    let viewport_size = ScreenSize::new(width / 2, height / 2);
29    let mut viewport = Viewport::new(ScreenPos::new(0, 4), viewport_size);
30    let mut status_viewport = Viewport::new(ScreenPos::zero(), ScreenSize::new(width, 3));
31
32    // Camera
33    let camera_pos = WorldPos::zero();
34    let mut camera = Camera::from_viewport(camera_pos, &viewport).with_limit(5, 5, 5, 5);
35
36    // Renderer
37    let stdout_renderer = StdoutTarget::new().expect("Failed to enter raw mode");
38    let mut renderer = Renderer::new(stdout_renderer);
39
40    // Player
41    let mut player = ('@', camera_pos);
42    let mut player_pixel = Pixel::new(player.0, camera.to_screen(player.1), Some(Color::Yellow), None);
43
44    // Mob
45    let mut mob = Mob {
46        pixel: Pixel::new('&', camera.to_screen(player.1), Some(Color::Red), None),
47        world_pos: WorldPos::new(camera_pos.x - 2, camera_pos.y - 6),
48        tick: 0,
49    };
50
51    // "Grass"
52    let grass_positions = field_of_grass(&camera);
53    let mut grass = grass_positions.iter().map(|_| Pixel::new(
54        'w',
55        camera.to_screen(camera.position),
56        Some(Color::Green),
57        None
58    )).collect::<Vec<_>>();
59
60    let (_, events) = events::<()>(EventModel::Fps(20));
61    for event in events {
62        match event {
63            Event::User(()) => {}
64            Event::Tick => {
65                viewport.draw_pixels(&grass);
66                viewport.draw_pixel(player_pixel);
67                mob.pixel.pos = camera.to_screen(mob.world_pos);
68                viewport.draw_pixel(mob.pixel);
69
70                // Move the mob to the right
71                mob.update();
72                let camera_border = Border::thin(Some(Color::Green), None);
73                viewport.draw_widget(&camera_border, ScreenPos::zero());
74
75                // Track the player
76                camera.track(player.1);
77                player_pixel.pos = camera.to_screen(player.1);
78                grass_positions.iter().zip(&mut grass).for_each(|(world_pos, grass)| {
79                    grass.pos = camera.to_screen(*world_pos);
80                });
81
82                // Status
83                let status = Text::new(
84                    format!("player x {} | y {}  camera x {} | y {}",
85                        player.1.x,
86                        player.1.y, 
87                        camera.position.x,
88                        camera.position.y,
89                    ),
90                    Some(Color::Red),
91                    None,
92                );
93
94                // Status border
95                let status_border = Border::new("╭─╮│╯─╰│", Some(Color::White), None);
96
97                status_viewport.swap_buffers();
98                status_viewport.draw_widget(&status_border, ScreenPos::zero());
99                status_viewport.draw_widget(&status, ScreenPos::new(1, 1));
100                let _ = renderer.render(&mut status_viewport);
101
102                // Render and swap the buffers so there is no 
103                // residual characters
104                let _ = renderer.render(&mut viewport);
105                viewport.swap_buffers();
106            }
107            Event::Key(KeyEvent { code: KeyCode::Esc, ..  }) => break,
108            Event::Key(KeyEvent { code: kc, .. }) => {
109                match kc {
110                    KeyCode::Left => { player.1.x -= 1; }
111                    KeyCode::Right => { player.1.x += 1; }
112                    KeyCode::Up => { player.1.y -= 1; }
113                    KeyCode::Down => { player.1.y += 1; }
114                    _ => {}
115                }
116            }
117            Event::Resize(_w, _h) => {}
118        }
119    }
120}

Trait Implementations§

Source§

impl Drop for StdoutTarget

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more
Source§

impl RenderTarget for StdoutTarget

Source§

fn render<'a, P: Iterator<Item = &'a Pixel>>(&'a mut self, pixels: P)

Source§

fn clear(&mut self)

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.