Struct nze_game_sdl::Camera
source · pub struct Camera { /* private fields */ }
Expand description
Used for drawing to the canvas.
The window size and screen size and position are used to adjust the size of the rects sent as
draw commands to the sdl Canvas
This holds buffered draw commands that render will consume at the end of each frame, so that the commands need to be resubmitted each frame they are to be drawn.
Notes:
- passed to
Render
at the end of each frame in order to submit the draw commands - the rects are scaled according to the
view size
which represents the target screen resolution and thewindow size
, which represents the resolution of the game’s window - the rects are moved according to camera’s
offset
- The
parallax
of the draws will affect how much the camera’soffset
changes the object’s position, setparallax
to 0 if you want the object to be unaffected by the moving camera
Implementations§
source§impl Camera
impl Camera
sourcepub fn draw(&mut self, game_obj: &GameObject)
pub fn draw(&mut self, game_obj: &GameObject)
Draws a GameObject adjusted for the camera’s view
Examples found in repository?
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 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
pub fn main() -> Result<(), Error> {
let (mut cam, drawing_area, context) = DrawingArea::new(
"Name of Game", // window name
Rect::new(0.0, 0.0, 400.0, 400.0), // window camera
Vec2::new(400.0, 400.0) // window size
)?;
let mut render = Render::new(drawing_area, &context)?;
let mut controls = Controls::new(&context)?;
let mut obj = GameObject::new_from_tex(
render.texture_manager.load(Path::new("resources/textures/gaia.png"))?
);
obj.rect.x = cam.get_view_size().x / 2.0 - obj.rect.w / 2.0;
obj.rect.y = cam.get_view_size().y / 2.0 - obj.rect.h / 2.0;
const SPEED: f64 = 125.0;
while !controls.should_close {
controls.update(&cam);
if controls.kb.down(Key::D) {
obj.rect.x += SPEED * controls.frame_elapsed;
}
if controls.kb.down(Key::A) {
obj.rect.x -= SPEED * controls.frame_elapsed;
}
if controls.kb.down(Key::W) {
obj.rect.y -= SPEED * controls.frame_elapsed;
}
if controls.kb.down(Key::S) {
obj.rect.y += SPEED * controls.frame_elapsed;
}
if controls.kb.down(Key::Escape) {
controls.should_close = true;
}
render.start_draw();
cam.draw(&obj);
render.end_draw(&mut cam)?;
}
Ok(())
}
More examples
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 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 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
pub fn main() -> Result<(), Error> {
let (mut cam, drawing_area, context) = DrawingArea::new(
"Game Template", //window name
Rect::new(0.0, 0.0, 240.0, 160.0),
Vec2::new(240.0 * 4.0, 160.0 * 4.0)
)?;
let mut render = Render::new(drawing_area, &context)?;
let mut controls = Controls::new(&context)?;
let mono_font = render.font_manager.load_font(
Path::new("resources/textures/fonts/FiraCode-Light.ttf"))?;
let map = Map::new(
Path::new("resources/map/test.tmx"), &mut render.texture_manager,
Path::new("resources/textures/fonts"), &mut render.font_manager)?;
let mut audio = AudioManager::new()?;
let music = audio.music.load(Path::new("resources/audio/test.wav"))?;
audio.music.play(music, -1)?;
let sfx = audio.sfx.load(Path::new("resources/audio/test.mp3"))?;
audio.sfx.set_volume(sfx, 0.4)?;
//checking resource loading/unloading
let mut is_gaia = true;
let mut ephemeral_obj = GameObject::new_from_tex(
render.texture_manager.load(
Path::new("resources/textures/gaia.png"))?);
let mut text = render
.font_manager
.load_text_obj(
&mono_font,
"The Planet Earth",
Colour::new(100, 200, 70, 255),
Vec2::new(0.0, 0.0), 10.0,
Vec2::new(0.0, 0.0)
)?;
while !controls.should_close {
cam_controls(&mut render, &mut controls, &mut cam)?;
controls.update(&cam);
// load/unload resources
if controls.kb.press(Key::L) ||
controls.c.press(0, controller::Button::A)
{
render.texture_manager.unload_from_gameobject(ephemeral_obj);
render.font_manager.unload_text_obj(text);
if is_gaia {
ephemeral_obj = GameObject::new_from_tex(
render.texture_manager.load(
Path::new("resources/textures/error.png"))?);
text = render.font_manager.load_text_obj(
&mono_font,
"Error Text",
Colour::new(200, 100, 70, 255),
Vec2::new(100.0, 0.0),
10.0,
Vec2::new(0.0, 0.0))?;
text.parallax = Vec2::new(1.0, 1.0);
} else {
ephemeral_obj = GameObject::new_from_tex(
render.texture_manager.load(
Path::new("resources/textures/gaia.png"))?);
text = render.font_manager.load_text_obj(
&mono_font,
"The Planet Earth",
Colour::new(100, 200, 70, 255),
Vec2::new(0.0, 0.0),
10.0,
Vec2::new(0.0, 0.0))?;
}
is_gaia = !is_gaia;
}
ephemeral_obj.rotate += controls.frame_elapsed * 30.0;
if controls.kb.press(Key::F) {
ephemeral_obj.flip_horizontal = !ephemeral_obj.flip_horizontal;
}
if controls.kb.press(Key::P) {
audio.sfx.play(sfx)?;
}
if controls.c.press(0, controller::Button::DPadUp) {
controls.c.rumble(0, 10000, 20000, 1000);
}
render.start_draw();
map.draw(&mut cam);
cam.draw(&ephemeral_obj);
cam.draw_text(&text);
cam.draw_disposable_text(
&mono_font,
format!("Wheel: {}", controls.m.wheel()),
40,
controls.m.pos(),
Colour::white(),
Vec2::new(1.0, 1.0));
render.end_draw(&mut cam)?;
}
Ok(())
}
sourcepub fn draw_disposable_text(
&mut self,
font: &Font,
text: String,
height: u32,
pos: Vec2,
colour: Colour,
parallax: Vec2
)
pub fn draw_disposable_text( &mut self, font: &Font, text: String, height: u32, pos: Vec2, colour: Colour, parallax: Vec2 )
Draws a disposable text texture adjusted for the camera’s view
Examples found in repository?
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 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 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
pub fn main() -> Result<(), Error> {
let (mut cam, drawing_area, context) = DrawingArea::new(
"Game Template", //window name
Rect::new(0.0, 0.0, 240.0, 160.0),
Vec2::new(240.0 * 4.0, 160.0 * 4.0)
)?;
let mut render = Render::new(drawing_area, &context)?;
let mut controls = Controls::new(&context)?;
let mono_font = render.font_manager.load_font(
Path::new("resources/textures/fonts/FiraCode-Light.ttf"))?;
let map = Map::new(
Path::new("resources/map/test.tmx"), &mut render.texture_manager,
Path::new("resources/textures/fonts"), &mut render.font_manager)?;
let mut audio = AudioManager::new()?;
let music = audio.music.load(Path::new("resources/audio/test.wav"))?;
audio.music.play(music, -1)?;
let sfx = audio.sfx.load(Path::new("resources/audio/test.mp3"))?;
audio.sfx.set_volume(sfx, 0.4)?;
//checking resource loading/unloading
let mut is_gaia = true;
let mut ephemeral_obj = GameObject::new_from_tex(
render.texture_manager.load(
Path::new("resources/textures/gaia.png"))?);
let mut text = render
.font_manager
.load_text_obj(
&mono_font,
"The Planet Earth",
Colour::new(100, 200, 70, 255),
Vec2::new(0.0, 0.0), 10.0,
Vec2::new(0.0, 0.0)
)?;
while !controls.should_close {
cam_controls(&mut render, &mut controls, &mut cam)?;
controls.update(&cam);
// load/unload resources
if controls.kb.press(Key::L) ||
controls.c.press(0, controller::Button::A)
{
render.texture_manager.unload_from_gameobject(ephemeral_obj);
render.font_manager.unload_text_obj(text);
if is_gaia {
ephemeral_obj = GameObject::new_from_tex(
render.texture_manager.load(
Path::new("resources/textures/error.png"))?);
text = render.font_manager.load_text_obj(
&mono_font,
"Error Text",
Colour::new(200, 100, 70, 255),
Vec2::new(100.0, 0.0),
10.0,
Vec2::new(0.0, 0.0))?;
text.parallax = Vec2::new(1.0, 1.0);
} else {
ephemeral_obj = GameObject::new_from_tex(
render.texture_manager.load(
Path::new("resources/textures/gaia.png"))?);
text = render.font_manager.load_text_obj(
&mono_font,
"The Planet Earth",
Colour::new(100, 200, 70, 255),
Vec2::new(0.0, 0.0),
10.0,
Vec2::new(0.0, 0.0))?;
}
is_gaia = !is_gaia;
}
ephemeral_obj.rotate += controls.frame_elapsed * 30.0;
if controls.kb.press(Key::F) {
ephemeral_obj.flip_horizontal = !ephemeral_obj.flip_horizontal;
}
if controls.kb.press(Key::P) {
audio.sfx.play(sfx)?;
}
if controls.c.press(0, controller::Button::DPadUp) {
controls.c.rumble(0, 10000, 20000, 1000);
}
render.start_draw();
map.draw(&mut cam);
cam.draw(&ephemeral_obj);
cam.draw_text(&text);
cam.draw_disposable_text(
&mono_font,
format!("Wheel: {}", controls.m.wheel()),
40,
controls.m.pos(),
Colour::white(),
Vec2::new(1.0, 1.0));
render.end_draw(&mut cam)?;
}
Ok(())
}
sourcepub fn draw_text(&mut self, text_obj: &TextObject)
pub fn draw_text(&mut self, text_obj: &TextObject)
Draws a TextObject adjusted by camera’s view
Examples found in repository?
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 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 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
pub fn main() -> Result<(), Error> {
let (mut cam, drawing_area, context) = DrawingArea::new(
"Game Template", //window name
Rect::new(0.0, 0.0, 240.0, 160.0),
Vec2::new(240.0 * 4.0, 160.0 * 4.0)
)?;
let mut render = Render::new(drawing_area, &context)?;
let mut controls = Controls::new(&context)?;
let mono_font = render.font_manager.load_font(
Path::new("resources/textures/fonts/FiraCode-Light.ttf"))?;
let map = Map::new(
Path::new("resources/map/test.tmx"), &mut render.texture_manager,
Path::new("resources/textures/fonts"), &mut render.font_manager)?;
let mut audio = AudioManager::new()?;
let music = audio.music.load(Path::new("resources/audio/test.wav"))?;
audio.music.play(music, -1)?;
let sfx = audio.sfx.load(Path::new("resources/audio/test.mp3"))?;
audio.sfx.set_volume(sfx, 0.4)?;
//checking resource loading/unloading
let mut is_gaia = true;
let mut ephemeral_obj = GameObject::new_from_tex(
render.texture_manager.load(
Path::new("resources/textures/gaia.png"))?);
let mut text = render
.font_manager
.load_text_obj(
&mono_font,
"The Planet Earth",
Colour::new(100, 200, 70, 255),
Vec2::new(0.0, 0.0), 10.0,
Vec2::new(0.0, 0.0)
)?;
while !controls.should_close {
cam_controls(&mut render, &mut controls, &mut cam)?;
controls.update(&cam);
// load/unload resources
if controls.kb.press(Key::L) ||
controls.c.press(0, controller::Button::A)
{
render.texture_manager.unload_from_gameobject(ephemeral_obj);
render.font_manager.unload_text_obj(text);
if is_gaia {
ephemeral_obj = GameObject::new_from_tex(
render.texture_manager.load(
Path::new("resources/textures/error.png"))?);
text = render.font_manager.load_text_obj(
&mono_font,
"Error Text",
Colour::new(200, 100, 70, 255),
Vec2::new(100.0, 0.0),
10.0,
Vec2::new(0.0, 0.0))?;
text.parallax = Vec2::new(1.0, 1.0);
} else {
ephemeral_obj = GameObject::new_from_tex(
render.texture_manager.load(
Path::new("resources/textures/gaia.png"))?);
text = render.font_manager.load_text_obj(
&mono_font,
"The Planet Earth",
Colour::new(100, 200, 70, 255),
Vec2::new(0.0, 0.0),
10.0,
Vec2::new(0.0, 0.0))?;
}
is_gaia = !is_gaia;
}
ephemeral_obj.rotate += controls.frame_elapsed * 30.0;
if controls.kb.press(Key::F) {
ephemeral_obj.flip_horizontal = !ephemeral_obj.flip_horizontal;
}
if controls.kb.press(Key::P) {
audio.sfx.play(sfx)?;
}
if controls.c.press(0, controller::Button::DPadUp) {
controls.c.rumble(0, 10000, 20000, 1000);
}
render.start_draw();
map.draw(&mut cam);
cam.draw(&ephemeral_obj);
cam.draw_text(&text);
cam.draw_disposable_text(
&mono_font,
format!("Wheel: {}", controls.m.wheel()),
40,
controls.m.pos(),
Colour::white(),
Vec2::new(1.0, 1.0));
render.end_draw(&mut cam)?;
}
Ok(())
}
sourcepub fn get_offset(&self) -> Vec2
pub fn get_offset(&self) -> Vec2
Get the current view offset
Examples found in repository?
More examples
122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203
fn cam_controls(render: &mut Render, controls: &mut Controls, cam: &mut Camera) -> Result<(), Error> {
let prev_frame = controls.frame_elapsed;
let mut pos = cam.get_offset();
const SPEED : f64 = 500.0;
if controls.kb.down(Key::Left) {
pos.x -= SPEED * prev_frame;
}
if controls.kb.down(Key::Right) {
pos.x += SPEED * prev_frame;
}
if controls.kb.down(Key::Up) {
pos.y -= SPEED * prev_frame;
}
if controls.kb.down(Key::Down) {
pos.y += SPEED * prev_frame;
}
pos.x += SPEED * controls.m.wheel() as f64 * prev_frame;
let v = controls.c.joy(0, controller::Side::Left) * SPEED * prev_frame;
pos = pos + v;
cam.set_offset(pos);
let mut win_size_update = false;
let mut cs = cam.get_window_size();
if controls.kb.down(Key::Equals) {
if cs.x < cam.get_view_size().x {
cs.x *= 2.0;
cs.y *= 2.0;
} else {
cs.x += cam.get_view_size().x/2.0;
cs.y += cam.get_view_size().y/2.0;
}
win_size_update = true;
}
if controls.kb.down(Key::Minus) {
if cs.x <= cam.get_view_size().x {
cs.x /= 2.0;
cs.y /= 2.0;
} else {
cs.x -= cam.get_view_size().x/2.0;
cs.y -= cam.get_view_size().y/2.0;
}
win_size_update = true;
}
if controls.kb.down(Key::D) {
cs.x += SPEED * prev_frame;
win_size_update = true;
}
if controls.kb.down(Key::A) {
cs.x -= SPEED * prev_frame;
win_size_update = true;
}
if controls.kb.down(Key::W) {
cs.y += SPEED * prev_frame;
win_size_update = true;
}
if controls.kb.down(Key::S) {
cs.y -= SPEED * prev_frame;
win_size_update = true;
}
if controls.kb.press(Key::Num1) {
render.toggle_fullscreen(cam)?;
}
if win_size_update {
render.set_win_size(cam, cs)?;
}
if controls.kb.down(Key::Escape) {
controls.should_close = true;
}
Ok(())
}
sourcepub fn set_offset(&mut self, offset: Vec2)
pub fn set_offset(&mut self, offset: Vec2)
Set the camera’s view offset
The view offset will move all draws by the offset
multiplied by the object’s parallax
Examples found in repository?
More examples
122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203
fn cam_controls(render: &mut Render, controls: &mut Controls, cam: &mut Camera) -> Result<(), Error> {
let prev_frame = controls.frame_elapsed;
let mut pos = cam.get_offset();
const SPEED : f64 = 500.0;
if controls.kb.down(Key::Left) {
pos.x -= SPEED * prev_frame;
}
if controls.kb.down(Key::Right) {
pos.x += SPEED * prev_frame;
}
if controls.kb.down(Key::Up) {
pos.y -= SPEED * prev_frame;
}
if controls.kb.down(Key::Down) {
pos.y += SPEED * prev_frame;
}
pos.x += SPEED * controls.m.wheel() as f64 * prev_frame;
let v = controls.c.joy(0, controller::Side::Left) * SPEED * prev_frame;
pos = pos + v;
cam.set_offset(pos);
let mut win_size_update = false;
let mut cs = cam.get_window_size();
if controls.kb.down(Key::Equals) {
if cs.x < cam.get_view_size().x {
cs.x *= 2.0;
cs.y *= 2.0;
} else {
cs.x += cam.get_view_size().x/2.0;
cs.y += cam.get_view_size().y/2.0;
}
win_size_update = true;
}
if controls.kb.down(Key::Minus) {
if cs.x <= cam.get_view_size().x {
cs.x /= 2.0;
cs.y /= 2.0;
} else {
cs.x -= cam.get_view_size().x/2.0;
cs.y -= cam.get_view_size().y/2.0;
}
win_size_update = true;
}
if controls.kb.down(Key::D) {
cs.x += SPEED * prev_frame;
win_size_update = true;
}
if controls.kb.down(Key::A) {
cs.x -= SPEED * prev_frame;
win_size_update = true;
}
if controls.kb.down(Key::W) {
cs.y += SPEED * prev_frame;
win_size_update = true;
}
if controls.kb.down(Key::S) {
cs.y -= SPEED * prev_frame;
win_size_update = true;
}
if controls.kb.press(Key::Num1) {
render.toggle_fullscreen(cam)?;
}
if win_size_update {
render.set_win_size(cam, cs)?;
}
if controls.kb.down(Key::Escape) {
controls.should_close = true;
}
Ok(())
}
sourcepub fn get_window_size(&self) -> Vec2
pub fn get_window_size(&self) -> Vec2
Get the current window size
The window size is the resolution of the window drawn by the OS.
This must be set by using render.set_win_size
.
Examples found in repository?
122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203
fn cam_controls(render: &mut Render, controls: &mut Controls, cam: &mut Camera) -> Result<(), Error> {
let prev_frame = controls.frame_elapsed;
let mut pos = cam.get_offset();
const SPEED : f64 = 500.0;
if controls.kb.down(Key::Left) {
pos.x -= SPEED * prev_frame;
}
if controls.kb.down(Key::Right) {
pos.x += SPEED * prev_frame;
}
if controls.kb.down(Key::Up) {
pos.y -= SPEED * prev_frame;
}
if controls.kb.down(Key::Down) {
pos.y += SPEED * prev_frame;
}
pos.x += SPEED * controls.m.wheel() as f64 * prev_frame;
let v = controls.c.joy(0, controller::Side::Left) * SPEED * prev_frame;
pos = pos + v;
cam.set_offset(pos);
let mut win_size_update = false;
let mut cs = cam.get_window_size();
if controls.kb.down(Key::Equals) {
if cs.x < cam.get_view_size().x {
cs.x *= 2.0;
cs.y *= 2.0;
} else {
cs.x += cam.get_view_size().x/2.0;
cs.y += cam.get_view_size().y/2.0;
}
win_size_update = true;
}
if controls.kb.down(Key::Minus) {
if cs.x <= cam.get_view_size().x {
cs.x /= 2.0;
cs.y /= 2.0;
} else {
cs.x -= cam.get_view_size().x/2.0;
cs.y -= cam.get_view_size().y/2.0;
}
win_size_update = true;
}
if controls.kb.down(Key::D) {
cs.x += SPEED * prev_frame;
win_size_update = true;
}
if controls.kb.down(Key::A) {
cs.x -= SPEED * prev_frame;
win_size_update = true;
}
if controls.kb.down(Key::W) {
cs.y += SPEED * prev_frame;
win_size_update = true;
}
if controls.kb.down(Key::S) {
cs.y -= SPEED * prev_frame;
win_size_update = true;
}
if controls.kb.press(Key::Num1) {
render.toggle_fullscreen(cam)?;
}
if win_size_update {
render.set_win_size(cam, cs)?;
}
if controls.kb.down(Key::Escape) {
controls.should_close = true;
}
Ok(())
}
sourcepub fn get_view_size(&self) -> Vec2
pub fn get_view_size(&self) -> Vec2
Get the camera’s view size
Examples found in repository?
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 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
pub fn main() -> Result<(), Error> {
let (mut cam, drawing_area, context) = DrawingArea::new(
"Name of Game", // window name
Rect::new(0.0, 0.0, 400.0, 400.0), // window camera
Vec2::new(400.0, 400.0) // window size
)?;
let mut render = Render::new(drawing_area, &context)?;
let mut controls = Controls::new(&context)?;
let mut obj = GameObject::new_from_tex(
render.texture_manager.load(Path::new("resources/textures/gaia.png"))?
);
obj.rect.x = cam.get_view_size().x / 2.0 - obj.rect.w / 2.0;
obj.rect.y = cam.get_view_size().y / 2.0 - obj.rect.h / 2.0;
const SPEED: f64 = 125.0;
while !controls.should_close {
controls.update(&cam);
if controls.kb.down(Key::D) {
obj.rect.x += SPEED * controls.frame_elapsed;
}
if controls.kb.down(Key::A) {
obj.rect.x -= SPEED * controls.frame_elapsed;
}
if controls.kb.down(Key::W) {
obj.rect.y -= SPEED * controls.frame_elapsed;
}
if controls.kb.down(Key::S) {
obj.rect.y += SPEED * controls.frame_elapsed;
}
if controls.kb.down(Key::Escape) {
controls.should_close = true;
}
render.start_draw();
cam.draw(&obj);
render.end_draw(&mut cam)?;
}
Ok(())
}
More examples
122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203
fn cam_controls(render: &mut Render, controls: &mut Controls, cam: &mut Camera) -> Result<(), Error> {
let prev_frame = controls.frame_elapsed;
let mut pos = cam.get_offset();
const SPEED : f64 = 500.0;
if controls.kb.down(Key::Left) {
pos.x -= SPEED * prev_frame;
}
if controls.kb.down(Key::Right) {
pos.x += SPEED * prev_frame;
}
if controls.kb.down(Key::Up) {
pos.y -= SPEED * prev_frame;
}
if controls.kb.down(Key::Down) {
pos.y += SPEED * prev_frame;
}
pos.x += SPEED * controls.m.wheel() as f64 * prev_frame;
let v = controls.c.joy(0, controller::Side::Left) * SPEED * prev_frame;
pos = pos + v;
cam.set_offset(pos);
let mut win_size_update = false;
let mut cs = cam.get_window_size();
if controls.kb.down(Key::Equals) {
if cs.x < cam.get_view_size().x {
cs.x *= 2.0;
cs.y *= 2.0;
} else {
cs.x += cam.get_view_size().x/2.0;
cs.y += cam.get_view_size().y/2.0;
}
win_size_update = true;
}
if controls.kb.down(Key::Minus) {
if cs.x <= cam.get_view_size().x {
cs.x /= 2.0;
cs.y /= 2.0;
} else {
cs.x -= cam.get_view_size().x/2.0;
cs.y -= cam.get_view_size().y/2.0;
}
win_size_update = true;
}
if controls.kb.down(Key::D) {
cs.x += SPEED * prev_frame;
win_size_update = true;
}
if controls.kb.down(Key::A) {
cs.x -= SPEED * prev_frame;
win_size_update = true;
}
if controls.kb.down(Key::W) {
cs.y += SPEED * prev_frame;
win_size_update = true;
}
if controls.kb.down(Key::S) {
cs.y -= SPEED * prev_frame;
win_size_update = true;
}
if controls.kb.press(Key::Num1) {
render.toggle_fullscreen(cam)?;
}
if win_size_update {
render.set_win_size(cam, cs)?;
}
if controls.kb.down(Key::Escape) {
controls.should_close = true;
}
Ok(())
}
sourcepub fn set_view_size(&mut self, view: Vec2)
pub fn set_view_size(&mut self, view: Vec2)
Set the camera’s view size
The view size is the resolution of your game, which may be different from your window resolution
The supplied view size is modified by the zoom
member
sourcepub fn aspect_ratio(&self) -> f64
pub fn aspect_ratio(&self) -> f64
Get the current aspect ratio (the view width divided by the view height)