Struct gemini_engine::elements::view::View
source · pub struct View {
pub width: usize,
pub height: usize,
pub background_char: ColChar,
pub coord_numbers_in_render: bool,
pub block_until_resized: bool,
/* private fields */
}
Expand description
The View struct is the canvas on which you will print all of your ViewElement
s. In normal use, you would clear the View, blit
all your ViewElement
s to it and then render. The following example demonstrates a piece of code that will render a View of width 9 and height 3, with a single Pixel in the middle
use gemini_engine::elements::{view::{Wrapping, ColChar}, View, Pixel, Vec2D};
let mut view = View::new(9, 3, ColChar::BACKGROUND);
let pixel = Pixel::new(view.center(), ColChar::SOLID);
view.blit(&pixel, Wrapping::Panic);
view.display_render().unwrap();
Fields§
§width: usize
The width of the View
height: usize
The height of the View
background_char: ColChar
The character that the View will be filled with by default on clear
coord_numbers_in_render: bool
A boolean determining whether the render should contain numbers on the top and left signifying the corresponding pixels’ X/Y value values
block_until_resized: bool
If true, [View.display_render
] will block until the console window is resized to fit the View
Implementations§
source§impl View
impl View
sourcepub fn new(width: usize, height: usize, background_char: ColChar) -> Self
pub fn new(width: usize, height: usize, background_char: ColChar) -> Self
Create a new View
using width
, height
and background_char
parameters
Examples found in repository?
More examples
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
fn main() {
let mut view = View::new(40, 8, ColChar::BACKGROUND);
let mut pixel = Pixel::new(Vec2D { x: 10, y: 5 }, ColChar::SOLID);
loop {
view.clear();
pixel.pos.x += 1;
view.blit(&pixel, Wrapping::Wrap);
let _ = view.display_render();
let _ = gameloop::sleep_fps(FPS, None);
}
}
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
fn main() {
let mut view = View::new(200, 90, ColChar::BACKGROUND);
let viewport = Viewport::new(
Transform3D::new_tr(Vec3D::new(0.0, 1.5, 4.0), Vec3D::new(-0.4, 0.0, 0.0)),
FOV,
view.center(),
);
let mut cube = Mesh3D::default_cube();
fps_gameloop!(
{
view.clear();
cube.transform.rotation.y -= 0.05;
},
{
view.blit(
&viewport.render(vec![&cube], DisplayMode::Solid),
Wrapping::Ignore,
);
let _ = view.display_render();
},
FPS,
|elapsed: gameloop::Duration, frame_skip| {
println!(
"Elapsed: {:.2?}µs | Frame skip: {}",
elapsed.as_micros(),
frame_skip
);
}
);
}
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
fn main() {
let mut view = View::new(82, 32, ColChar::EMPTY);
let viewport = Viewport::new(
Transform3D::new_tr(Vec3D::new(0.0, 0.0, 20.0), Vec3D::ZERO),
FOV,
view.center(),
);
let lights = vec![
Light::new_ambient(0.3),
Light::new_directional(0.7, Vec3D::new(1.0, -1.0, -1.0)),
];
let mut donut = Mesh3D::torus(1.8, 1.0, 32, 16);
fps_gameloop!(
{
donut.transform.rotation.x += 0.05;
donut.transform.rotation.z += 0.05;
},
{
view.clear();
view.blit(
&viewport.render(
vec![&donut],
DisplayMode::Illuminated {
lights: lights.clone(),
},
),
Wrapping::Ignore,
);
let _ = view.display_render();
},
FPS
);
}
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
fn main() {
let mut view = View::new(50, 12, ColChar::BACKGROUND);
let mut blocks = vec![
Rect::new(Vec2D::new(0, 0), BLOCK_SIZE, FILL_CHAR),
Rect::new(Vec2D::new(0, 2), BLOCK_SIZE, FILL_CHAR),
Rect::new(Vec2D::new(0, 4), BLOCK_SIZE, FILL_CHAR),
Rect::new(Vec2D::new(0, 6), BLOCK_SIZE, FILL_CHAR),
Rect::new(Vec2D::new(0, 8), BLOCK_SIZE, FILL_CHAR),
Rect::new(Vec2D::new(0, 10), BLOCK_SIZE, FILL_CHAR),
];
let mut i = 0;
fps_gameloop!(
{
i += 1;
for (j, block) in (0u32..).zip(blocks.iter_mut()) {
if i % 2_u32.pow(j) == 0 {
block.pos.x += 1;
}
}
},
{
view.clear();
for block in &blocks {
view.blit(block, Wrapping::Wrap);
}
let _ = view.display_render();
if blocks
.iter()
.all(|b| b.pos.x % isize::try_from(view.width).expect("Wrapped usize") == 0)
{
thread::sleep(Duration::from_secs(2));
};
},
200.0
);
}
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
fn main() {
let mut view = View::new(60, 10, BACKGROUND_CHAR);
view.coord_numbers_in_render = true;
let mut pixel = Pixel::new(Vec2D::from((5u8, 9u8)), FILL_CHAR);
let mut line = Line::new(Vec2D::new(2, 8), Vec2D::new(28, 7), FILL_CHAR);
let mut line1_direction = -1;
let rect = Rect::new(
Vec2D { x: 11, y: 1 },
Vec2D { x: 9, y: 3 },
ColChar::SOLID.with_rgb(200, 30, 0),
);
let test_image = r"
______
/|_||_\`.__
( _ _ _\
=`-(_)--(_)-' ";
let mut sprite = Sprite::new(
Vec2D::new(30, 1),
test_image,
Modifier::from_rgb(20, 200, 0),
);
let mut blit_elapsed = Duration::default();
let mut render_elapsed = Duration::default();
fps_gameloop!(
{
pixel.pos.x += 2;
// loop the position back to the other side. This can be done with `Wrapping::Wrap` but it won't change the element's actual position, so the pixel position being printed would continue to increase without looping
pixel.pos %= view.size();
line.pos1.y += line1_direction;
line.pos0.y = 10 - line.pos1.y;
if line.pos1.y > 7 {
line1_direction = -1;
} else if line.pos1.y < 3 {
line1_direction = 1;
}
sprite.pos.x += 1;
},
{
view.clear();
let now = Instant::now();
view.blit(&pixel, Wrapping::Panic);
view.blit(&line, Wrapping::Panic);
view.blit(&rect, Wrapping::Panic);
view.blit(&sprite, Wrapping::Wrap);
blit_elapsed = now.elapsed();
let now = Instant::now();
let _ = view.display_render();
render_elapsed = now.elapsed();
},
FPS,
|total_elapsed: Duration, _frame_skip| {
println!(
"Blitting: {:.2?} microseconds | Rendering: {:.2?} microseconds| Total: {:.2?}",
blit_elapsed.as_micros(),
render_elapsed.as_micros(),
total_elapsed.as_micros()
);
println!("Pixel position: {}", pixel.pos);
}
);
}
sourcepub const fn with_coord_numbers(self, coord_numbers_in_render: bool) -> Self
pub const fn with_coord_numbers(self, coord_numbers_in_render: bool) -> Self
Return the View
with its coord_numbers_in_render
field set to the chosen value. Consumes the original View
sourcepub const fn with_block_until_resized(self, block_until_resized: bool) -> Self
pub const fn with_block_until_resized(self, block_until_resized: bool) -> Self
Return the View
with its block_until_resized
field set to the chosen value. Consumes the original View
sourcepub const fn size(&self) -> Vec2D
pub const fn size(&self) -> Vec2D
Return the width and height of the View
as a Vec2D
Examples found in repository?
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
fn main() {
let mut view = View::new(60, 10, BACKGROUND_CHAR);
view.coord_numbers_in_render = true;
let mut pixel = Pixel::new(Vec2D::from((5u8, 9u8)), FILL_CHAR);
let mut line = Line::new(Vec2D::new(2, 8), Vec2D::new(28, 7), FILL_CHAR);
let mut line1_direction = -1;
let rect = Rect::new(
Vec2D { x: 11, y: 1 },
Vec2D { x: 9, y: 3 },
ColChar::SOLID.with_rgb(200, 30, 0),
);
let test_image = r"
______
/|_||_\`.__
( _ _ _\
=`-(_)--(_)-' ";
let mut sprite = Sprite::new(
Vec2D::new(30, 1),
test_image,
Modifier::from_rgb(20, 200, 0),
);
let mut blit_elapsed = Duration::default();
let mut render_elapsed = Duration::default();
fps_gameloop!(
{
pixel.pos.x += 2;
// loop the position back to the other side. This can be done with `Wrapping::Wrap` but it won't change the element's actual position, so the pixel position being printed would continue to increase without looping
pixel.pos %= view.size();
line.pos1.y += line1_direction;
line.pos0.y = 10 - line.pos1.y;
if line.pos1.y > 7 {
line1_direction = -1;
} else if line.pos1.y < 3 {
line1_direction = 1;
}
sprite.pos.x += 1;
},
{
view.clear();
let now = Instant::now();
view.blit(&pixel, Wrapping::Panic);
view.blit(&line, Wrapping::Panic);
view.blit(&rect, Wrapping::Panic);
view.blit(&sprite, Wrapping::Wrap);
blit_elapsed = now.elapsed();
let now = Instant::now();
let _ = view.display_render();
render_elapsed = now.elapsed();
},
FPS,
|total_elapsed: Duration, _frame_skip| {
println!(
"Blitting: {:.2?} microseconds | Rendering: {:.2?} microseconds| Total: {:.2?}",
blit_elapsed.as_micros(),
render_elapsed.as_micros(),
total_elapsed.as_micros()
);
println!("Pixel position: {}", pixel.pos);
}
);
}
sourcepub fn center(&self) -> Vec2D
pub fn center(&self) -> Vec2D
Return Vec2D
coordinates of the centre of the View
Examples found in repository?
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
fn main() {
let mut view = View::new(200, 90, ColChar::BACKGROUND);
let viewport = Viewport::new(
Transform3D::new_tr(Vec3D::new(0.0, 1.5, 4.0), Vec3D::new(-0.4, 0.0, 0.0)),
FOV,
view.center(),
);
let mut cube = Mesh3D::default_cube();
fps_gameloop!(
{
view.clear();
cube.transform.rotation.y -= 0.05;
},
{
view.blit(
&viewport.render(vec![&cube], DisplayMode::Solid),
Wrapping::Ignore,
);
let _ = view.display_render();
},
FPS,
|elapsed: gameloop::Duration, frame_skip| {
println!(
"Elapsed: {:.2?}µs | Frame skip: {}",
elapsed.as_micros(),
frame_skip
);
}
);
}
More examples
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
fn main() {
let mut view = View::new(82, 32, ColChar::EMPTY);
let viewport = Viewport::new(
Transform3D::new_tr(Vec3D::new(0.0, 0.0, 20.0), Vec3D::ZERO),
FOV,
view.center(),
);
let lights = vec![
Light::new_ambient(0.3),
Light::new_directional(0.7, Vec3D::new(1.0, -1.0, -1.0)),
];
let mut donut = Mesh3D::torus(1.8, 1.0, 32, 16);
fps_gameloop!(
{
donut.transform.rotation.x += 0.05;
donut.transform.rotation.z += 0.05;
},
{
view.clear();
view.blit(
&viewport.render(
vec![&donut],
DisplayMode::Illuminated {
lights: lights.clone(),
},
),
Wrapping::Ignore,
);
let _ = view.display_render();
},
FPS
);
}
sourcepub fn clear(&mut self)
pub fn clear(&mut self)
Clear the View
of all pixels
Examples found in repository?
More examples
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
fn main() {
let mut view = View::new(40, 8, ColChar::BACKGROUND);
let mut pixel = Pixel::new(Vec2D { x: 10, y: 5 }, ColChar::SOLID);
loop {
view.clear();
pixel.pos.x += 1;
view.blit(&pixel, Wrapping::Wrap);
let _ = view.display_render();
let _ = gameloop::sleep_fps(FPS, None);
}
}
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
fn main() {
let mut view = View::new(200, 90, ColChar::BACKGROUND);
let viewport = Viewport::new(
Transform3D::new_tr(Vec3D::new(0.0, 1.5, 4.0), Vec3D::new(-0.4, 0.0, 0.0)),
FOV,
view.center(),
);
let mut cube = Mesh3D::default_cube();
fps_gameloop!(
{
view.clear();
cube.transform.rotation.y -= 0.05;
},
{
view.blit(
&viewport.render(vec![&cube], DisplayMode::Solid),
Wrapping::Ignore,
);
let _ = view.display_render();
},
FPS,
|elapsed: gameloop::Duration, frame_skip| {
println!(
"Elapsed: {:.2?}µs | Frame skip: {}",
elapsed.as_micros(),
frame_skip
);
}
);
}
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
fn main() {
let mut view = View::new(82, 32, ColChar::EMPTY);
let viewport = Viewport::new(
Transform3D::new_tr(Vec3D::new(0.0, 0.0, 20.0), Vec3D::ZERO),
FOV,
view.center(),
);
let lights = vec![
Light::new_ambient(0.3),
Light::new_directional(0.7, Vec3D::new(1.0, -1.0, -1.0)),
];
let mut donut = Mesh3D::torus(1.8, 1.0, 32, 16);
fps_gameloop!(
{
donut.transform.rotation.x += 0.05;
donut.transform.rotation.z += 0.05;
},
{
view.clear();
view.blit(
&viewport.render(
vec![&donut],
DisplayMode::Illuminated {
lights: lights.clone(),
},
),
Wrapping::Ignore,
);
let _ = view.display_render();
},
FPS
);
}
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
fn main() {
let mut view = View::new(50, 12, ColChar::BACKGROUND);
let mut blocks = vec![
Rect::new(Vec2D::new(0, 0), BLOCK_SIZE, FILL_CHAR),
Rect::new(Vec2D::new(0, 2), BLOCK_SIZE, FILL_CHAR),
Rect::new(Vec2D::new(0, 4), BLOCK_SIZE, FILL_CHAR),
Rect::new(Vec2D::new(0, 6), BLOCK_SIZE, FILL_CHAR),
Rect::new(Vec2D::new(0, 8), BLOCK_SIZE, FILL_CHAR),
Rect::new(Vec2D::new(0, 10), BLOCK_SIZE, FILL_CHAR),
];
let mut i = 0;
fps_gameloop!(
{
i += 1;
for (j, block) in (0u32..).zip(blocks.iter_mut()) {
if i % 2_u32.pow(j) == 0 {
block.pos.x += 1;
}
}
},
{
view.clear();
for block in &blocks {
view.blit(block, Wrapping::Wrap);
}
let _ = view.display_render();
if blocks
.iter()
.all(|b| b.pos.x % isize::try_from(view.width).expect("Wrapped usize") == 0)
{
thread::sleep(Duration::from_secs(2));
};
},
200.0
);
}
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
fn main() {
let mut view = View::new(60, 10, BACKGROUND_CHAR);
view.coord_numbers_in_render = true;
let mut pixel = Pixel::new(Vec2D::from((5u8, 9u8)), FILL_CHAR);
let mut line = Line::new(Vec2D::new(2, 8), Vec2D::new(28, 7), FILL_CHAR);
let mut line1_direction = -1;
let rect = Rect::new(
Vec2D { x: 11, y: 1 },
Vec2D { x: 9, y: 3 },
ColChar::SOLID.with_rgb(200, 30, 0),
);
let test_image = r"
______
/|_||_\`.__
( _ _ _\
=`-(_)--(_)-' ";
let mut sprite = Sprite::new(
Vec2D::new(30, 1),
test_image,
Modifier::from_rgb(20, 200, 0),
);
let mut blit_elapsed = Duration::default();
let mut render_elapsed = Duration::default();
fps_gameloop!(
{
pixel.pos.x += 2;
// loop the position back to the other side. This can be done with `Wrapping::Wrap` but it won't change the element's actual position, so the pixel position being printed would continue to increase without looping
pixel.pos %= view.size();
line.pos1.y += line1_direction;
line.pos0.y = 10 - line.pos1.y;
if line.pos1.y > 7 {
line1_direction = -1;
} else if line.pos1.y < 3 {
line1_direction = 1;
}
sprite.pos.x += 1;
},
{
view.clear();
let now = Instant::now();
view.blit(&pixel, Wrapping::Panic);
view.blit(&line, Wrapping::Panic);
view.blit(&rect, Wrapping::Panic);
view.blit(&sprite, Wrapping::Wrap);
blit_elapsed = now.elapsed();
let now = Instant::now();
let _ = view.display_render();
render_elapsed = now.elapsed();
},
FPS,
|total_elapsed: Duration, _frame_skip| {
println!(
"Blitting: {:.2?} microseconds | Rendering: {:.2?} microseconds| Total: {:.2?}",
blit_elapsed.as_micros(),
render_elapsed.as_micros(),
total_elapsed.as_micros()
);
println!("Pixel position: {}", pixel.pos);
}
);
}
sourcepub fn blit(&mut self, element: &impl ViewElement, wrapping: Wrapping)
pub fn blit(&mut self, element: &impl ViewElement, wrapping: Wrapping)
Blit a struct implementing ViewElement
to the View
Examples found in repository?
More examples
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
fn main() {
let mut view = View::new(40, 8, ColChar::BACKGROUND);
let mut pixel = Pixel::new(Vec2D { x: 10, y: 5 }, ColChar::SOLID);
loop {
view.clear();
pixel.pos.x += 1;
view.blit(&pixel, Wrapping::Wrap);
let _ = view.display_render();
let _ = gameloop::sleep_fps(FPS, None);
}
}
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
fn main() {
let mut scale_view = ScaleFitView::new(ColChar::BACKGROUND);
let mut text = Text::new(Vec2D::ZERO, "This is some centered text!", Modifier::None)
.with_align(TextAlign::Centered);
let mut sprite =
Sprite::new(Vec2D::ZERO, TEXTURE, Modifier::None).with_align(TextAlign2D::CENTERED);
loop {
text.pos = scale_view.intended_size() / 2;
sprite.pos = scale_view.intended_size() / 2;
sprite.pos.y -= 5;
scale_view.update();
scale_view.view.blit(&text, Wrapping::Wrap);
scale_view.view.blit(&sprite, Wrapping::Wrap);
let _ = scale_view.view.display_render();
sleep(Duration::from_millis(10));
}
}
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
fn main() {
let mut view = View::new(200, 90, ColChar::BACKGROUND);
let viewport = Viewport::new(
Transform3D::new_tr(Vec3D::new(0.0, 1.5, 4.0), Vec3D::new(-0.4, 0.0, 0.0)),
FOV,
view.center(),
);
let mut cube = Mesh3D::default_cube();
fps_gameloop!(
{
view.clear();
cube.transform.rotation.y -= 0.05;
},
{
view.blit(
&viewport.render(vec![&cube], DisplayMode::Solid),
Wrapping::Ignore,
);
let _ = view.display_render();
},
FPS,
|elapsed: gameloop::Duration, frame_skip| {
println!(
"Elapsed: {:.2?}µs | Frame skip: {}",
elapsed.as_micros(),
frame_skip
);
}
);
}
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
fn main() {
let mut view = View::new(82, 32, ColChar::EMPTY);
let viewport = Viewport::new(
Transform3D::new_tr(Vec3D::new(0.0, 0.0, 20.0), Vec3D::ZERO),
FOV,
view.center(),
);
let lights = vec![
Light::new_ambient(0.3),
Light::new_directional(0.7, Vec3D::new(1.0, -1.0, -1.0)),
];
let mut donut = Mesh3D::torus(1.8, 1.0, 32, 16);
fps_gameloop!(
{
donut.transform.rotation.x += 0.05;
donut.transform.rotation.z += 0.05;
},
{
view.clear();
view.blit(
&viewport.render(
vec![&donut],
DisplayMode::Illuminated {
lights: lights.clone(),
},
),
Wrapping::Ignore,
);
let _ = view.display_render();
},
FPS
);
}
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
fn main() {
let mut view = View::new(50, 12, ColChar::BACKGROUND);
let mut blocks = vec![
Rect::new(Vec2D::new(0, 0), BLOCK_SIZE, FILL_CHAR),
Rect::new(Vec2D::new(0, 2), BLOCK_SIZE, FILL_CHAR),
Rect::new(Vec2D::new(0, 4), BLOCK_SIZE, FILL_CHAR),
Rect::new(Vec2D::new(0, 6), BLOCK_SIZE, FILL_CHAR),
Rect::new(Vec2D::new(0, 8), BLOCK_SIZE, FILL_CHAR),
Rect::new(Vec2D::new(0, 10), BLOCK_SIZE, FILL_CHAR),
];
let mut i = 0;
fps_gameloop!(
{
i += 1;
for (j, block) in (0u32..).zip(blocks.iter_mut()) {
if i % 2_u32.pow(j) == 0 {
block.pos.x += 1;
}
}
},
{
view.clear();
for block in &blocks {
view.blit(block, Wrapping::Wrap);
}
let _ = view.display_render();
if blocks
.iter()
.all(|b| b.pos.x % isize::try_from(view.width).expect("Wrapped usize") == 0)
{
thread::sleep(Duration::from_secs(2));
};
},
200.0
);
}
sourcepub fn blit_double_width(
&mut self,
element: &impl ViewElement,
wrapping: Wrapping
)
pub fn blit_double_width( &mut self, element: &impl ViewElement, wrapping: Wrapping )
Blit a struct implementing ViewElement
to the View
with a doubled width. Blitting a Pixel
at Vec2D(5,3)
, for example, will result in a blit at Vec2D(10,3)
and Vec2D(11,3)
being plotted to. Useful when you want to work with more square pixels, as single text characters are much taller than they are wide
sourcepub fn display_render(&self) -> Result<()>
pub fn display_render(&self) -> Result<()>
Display the View
. View
implements the Display
trait and so can be rendered in many ways (such as println!("{view}");
), but this is intended to be the fastest way possible.
§Errors
Returns the Result
from writing to io::stdout().lock()
. You can ignore it with let _ = ...
most of the time
Examples found in repository?
More examples
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
fn main() {
let mut view = View::new(40, 8, ColChar::BACKGROUND);
let mut pixel = Pixel::new(Vec2D { x: 10, y: 5 }, ColChar::SOLID);
loop {
view.clear();
pixel.pos.x += 1;
view.blit(&pixel, Wrapping::Wrap);
let _ = view.display_render();
let _ = gameloop::sleep_fps(FPS, None);
}
}
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
fn main() {
let mut scale_view = ScaleFitView::new(ColChar::BACKGROUND);
let mut text = Text::new(Vec2D::ZERO, "This is some centered text!", Modifier::None)
.with_align(TextAlign::Centered);
let mut sprite =
Sprite::new(Vec2D::ZERO, TEXTURE, Modifier::None).with_align(TextAlign2D::CENTERED);
loop {
text.pos = scale_view.intended_size() / 2;
sprite.pos = scale_view.intended_size() / 2;
sprite.pos.y -= 5;
scale_view.update();
scale_view.view.blit(&text, Wrapping::Wrap);
scale_view.view.blit(&sprite, Wrapping::Wrap);
let _ = scale_view.view.display_render();
sleep(Duration::from_millis(10));
}
}
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
fn main() {
let mut view = View::new(200, 90, ColChar::BACKGROUND);
let viewport = Viewport::new(
Transform3D::new_tr(Vec3D::new(0.0, 1.5, 4.0), Vec3D::new(-0.4, 0.0, 0.0)),
FOV,
view.center(),
);
let mut cube = Mesh3D::default_cube();
fps_gameloop!(
{
view.clear();
cube.transform.rotation.y -= 0.05;
},
{
view.blit(
&viewport.render(vec![&cube], DisplayMode::Solid),
Wrapping::Ignore,
);
let _ = view.display_render();
},
FPS,
|elapsed: gameloop::Duration, frame_skip| {
println!(
"Elapsed: {:.2?}µs | Frame skip: {}",
elapsed.as_micros(),
frame_skip
);
}
);
}
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
fn main() {
let mut view = View::new(82, 32, ColChar::EMPTY);
let viewport = Viewport::new(
Transform3D::new_tr(Vec3D::new(0.0, 0.0, 20.0), Vec3D::ZERO),
FOV,
view.center(),
);
let lights = vec![
Light::new_ambient(0.3),
Light::new_directional(0.7, Vec3D::new(1.0, -1.0, -1.0)),
];
let mut donut = Mesh3D::torus(1.8, 1.0, 32, 16);
fps_gameloop!(
{
donut.transform.rotation.x += 0.05;
donut.transform.rotation.z += 0.05;
},
{
view.clear();
view.blit(
&viewport.render(
vec![&donut],
DisplayMode::Illuminated {
lights: lights.clone(),
},
),
Wrapping::Ignore,
);
let _ = view.display_render();
},
FPS
);
}
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
fn main() {
let mut view = View::new(50, 12, ColChar::BACKGROUND);
let mut blocks = vec![
Rect::new(Vec2D::new(0, 0), BLOCK_SIZE, FILL_CHAR),
Rect::new(Vec2D::new(0, 2), BLOCK_SIZE, FILL_CHAR),
Rect::new(Vec2D::new(0, 4), BLOCK_SIZE, FILL_CHAR),
Rect::new(Vec2D::new(0, 6), BLOCK_SIZE, FILL_CHAR),
Rect::new(Vec2D::new(0, 8), BLOCK_SIZE, FILL_CHAR),
Rect::new(Vec2D::new(0, 10), BLOCK_SIZE, FILL_CHAR),
];
let mut i = 0;
fps_gameloop!(
{
i += 1;
for (j, block) in (0u32..).zip(blocks.iter_mut()) {
if i % 2_u32.pow(j) == 0 {
block.pos.x += 1;
}
}
},
{
view.clear();
for block in &blocks {
view.blit(block, Wrapping::Wrap);
}
let _ = view.display_render();
if blocks
.iter()
.all(|b| b.pos.x % isize::try_from(view.width).expect("Wrapped usize") == 0)
{
thread::sleep(Duration::from_secs(2));
};
},
200.0
);
}