§ Демонстрация работы

Demo: Эффект огня

§ Код на С

#include <qblib.c>

#define PALNUMBER 6

// Исходная палитра
static const unsigned char pal[PALNUMBER][4] =
{
    {0,     0,   0,   0},
    {16,    0,   0,  64},
    {127, 255,   0,   0},
    {230, 255, 255,   0},
    {250, 255, 255, 192},
    {255, 255, 255, 255}
};

// Инициализация поля
float t;
float fld[ 2 ][ 320 ][ 200 ];
float qbs[ 320 ][ 200 ];

// Инициализация поля
void init() {

    t = 0;
    qb_scroll_x = 0;

    for (int i = 0; i < 200; i++)
    for (int j = 0; j < 320; j++)
        fld[0][j][i] = 0.0;
}

// Постоянное обновление поля
void update() {

    for (int y = 0; y < 199; y++)
    for (int x = 0; x < 320; x++) {

        if (qbs[x][y]) fld[0][x][y] = qbs[x][y];

        // Сбор суммарной энергии соседей снизу
        float s = fld[0][ (x+319)%320 ][ (y+1) ] +
                  fld[0][ (x+0)%320 ][ (y+1) ] +
                  fld[0][ (x+1)%320 ][ (y+1) ] +
                  fld[0][ x ][ y ];

        s = s/4 * 0.99;
        fld[1][x][y] = s;
    }
}

// Перерисовка и перенос в следующее состояние
void redraw() {

    for (int y = 0; y < 200; y++)
    for (int x = 0; x < 320; x++) {

        fld[0][x][y] = fld[1][x][y];

        int s = 8*fld[0][x][y];
        if (s > 255) s = 255;
        pset(x, y, s);
    }
}

// Генератор нового сида
void sidgen() {

    for (int x = 0; x < 320; x++) fld[0][x][199] = 0;
    for (int x = 0; x < 128; x++) fld[0][rand() % 320][199] = rand()%256;
}

// 15 минут кодинга и 180 минут отладки
int main(int argc, char* argv[]) {

    screen(13);
    generate_palette(PALNUMBER, pal);
    init();

    while (sdlevent(EVT_REDRAW)) {

        sidgen();
        update();
        redraw();
    }

    return 0;
}