Mjukare rörelser

Screenshot

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 = x.min(screen_width()).max(0.0);
        y = y.min(screen_height()).max(0.0);

Info

Metoderna min() och max() används för att få det minsta eller högsta av två värden.

Utmaning

Ä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?

Källkod

Nu ser vårt program ut så här:

use macroquad::prelude::*;

#[macroquad::main("Mitt spel")]
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 = x.min(screen_width()).max(0.0);
        y = y.min(screen_height()).max(0.0);

        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.

Agical