Skip to content

Example: Infinite background

Amine B. Hassouna edited this page Nov 17, 2022 · 1 revision
SDL_Color get_color(int i)
{
    switch (i)
    {
    case 0:
        return COLOR_WHITE;
    case 1:
        return COLOR_RED;
    case 2:
        return COLOR_BLUE;
    default:
        return COLOR_WHITE;
    }
}

void draw_background(int window_x, int window_y, int window_w, int window_h,
                     int background[10][20], int backgroud_w, int backgroud_h,
                     int offcet_x, int offcet_y)
{
    int x = window_x;
    int bg_x = offcet_x;

    while (x < window_w && bg_x < backgroud_w)
    {
        int y = window_y;
        int bg_y = offcet_y;

        while (y < window_h && bg_y < backgroud_h)
        {
            set_cell_color(x, y, get_color(background[bg_y][bg_x]));

            y++;
            bg_y++;
        }

        x++;
        bg_x++;
    }
}

void draw_infinite_background(int window_x, int window_y, int window_w,
                              int window_h, int background[10][20],
                              int backgroud_w, int backgroud_h, int offcet_x,
                              int offcet_y)
{
    draw_background(window_x, window_y, window_w, window_h, background,
                    backgroud_w, backgroud_h, offcet_x, offcet_y);

    if (offcet_x > backgroud_w - window_w)
    {
        draw_background(backgroud_w - offcet_x, window_y, window_w, window_h,
                        background, backgroud_w, backgroud_h, 0, offcet_y);
    }

    if (offcet_y > backgroud_h - window_h)
    {
        draw_background(window_x, backgroud_h - offcet_y, window_w, window_h,
                        background, backgroud_w, backgroud_h, offcet_x, 0);
    }
}

void draw(int x_cells, int y_cells)
{
    delay(1000);

    const int backgroud_w = 20;
    const int backgroud_h = 10;
    const int background[10][20] =
    {
        {1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2},
        {1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2},
        {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2},
        {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2},
        {1, 0, 2, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2},
        {1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2},
        {1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2},
        {1, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 2},
        {1, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 2},
        {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2},
    };

    int offcet_x = 0;

    while (true)
    {
        set_grid_color(COLOR_WHITE);

        draw_infinite_background(0, 0, x_cells, y_cells, background, backgroud_w,
                                 backgroud_h, offcet_x, 0);

        offcet_x++;

        if (offcet_x > backgroud_w - 1)
        {
            offcet_x = 0;
        }
        else if (offcet_x < 0)
        {
            offcet_x = backgroud_w + offcet_x;
        }

        delay(200);
    }
}
Clone this wiki locally