Mjukare rörelser
Eftersom Macroquad kommer rita bildrutor så snabbt som den kan måste vi kolla hur lång tid som har gått mellan varje uppdatering för att avgöra hur långt cirkeln ska förflyttas. Annars kommer vårt spel gå olika fort på olika datorer, beroende på hur snabbt dom kan köra programmet.
Implementering
Vi ska därför utöka programmet och lägga till en konstant variabel som avgör
hur snabbt cirkeln ska röra sig. Vi kallar den MOVEMENT_SPEED
och börjar med
att tilldela den värdet 200.0
. Går det för fort eller för sakta kan vi sänka
eller öka detta värde.
const MOVEMENT_SPEED: f32 = 200.0;
Tid mellan bildrutor
Därefter använder vi funktionen get_frame_time()
som ger oss hur lång tid i
sekunder det har gått sedan föregående bildruta ritades på skärmen och
tilldelar den till variabeln delta_time
.
let delta_time = get_frame_time();
Ändra förflyttningen
Förändringen av variablerna x
och y
kan sedan bytas ut till en
multiplikation av värdena för MOVEMENT_SPEED
och delta_time
för att få hur
långt cirkeln ska förflyttas under denna bildruta.
if is_key_down(KeyCode::Right) {
x += MOVEMENT_SPEED * delta_time;
}
if is_key_down(KeyCode::Left) {
x -= MOVEMENT_SPEED * delta_time;
}
if is_key_down(KeyCode::Down) {
y += MOVEMENT_SPEED * delta_time;
}
if is_key_down(KeyCode::Up) {
y -= MOVEMENT_SPEED * delta_time;
}
Begränsa förflyttningen
Slutligen vill vi också att cirkeln aldrig ska hamna utanför fönstret, därför
begränsar vi variablerna x
och y
.
x = clamp(x, 0.0, screen_width());
y = clamp(y, 0.0, screen_height());
Funktionen clamp()
är en Macroquad-funktion som begränsar ett värde till ett
minimum- och ett maximumvärde.
Ändra konstanten MOVEMENT_SPEED
om cirkeln rör sig för fort eller för sakta.
Vad behöver ändras för att hela cirkeln ska vara kvar på skärmen när
förflyttningen begränsas?
Källkod
Nu ser vårt program ut så här:
use macroquad::prelude::*;
#[macroquad::main("My game")]
async fn main() {
const MOVEMENT_SPEED: f32 = 200.0;
let mut x = screen_width() / 2.0;
let mut y = screen_height() / 2.0;
loop {
clear_background(DARKPURPLE);
let delta_time = get_frame_time();
if is_key_down(KeyCode::Right) {
x += MOVEMENT_SPEED * delta_time;
}
if is_key_down(KeyCode::Left) {
x -= MOVEMENT_SPEED * delta_time;
}
if is_key_down(KeyCode::Down) {
y += MOVEMENT_SPEED * delta_time;
}
if is_key_down(KeyCode::Up) {
y -= MOVEMENT_SPEED * delta_time;
}
x = clamp(x, 0.0, screen_width());
y = clamp(y, 0.0, screen_height());
draw_circle(x, y, 16.0, YELLOW);
next_frame().await
}
}
Quiz
Testa dina nya kunskaper genom att svara på följande quiz innan du går vidare.