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

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

§ Код на С

1#include <qblib.c>
2
3#define PALNUMBER 6
4
5// Исходная палитра
6static const unsigned char pal[PALNUMBER][4] =
7{
8    {0,     0,   0,   0},
9    {16,    0,   0,  64},
10    {127, 255,   0,   0},
11    {230, 255, 255,   0},
12    {250, 255, 255, 192},
13    {255, 255, 255, 255}
14};
15
16// Инициализация поля
17float t;
18float fld[ 2 ][ 320 ][ 200 ];
19float qbs[ 320 ][ 200 ];
20
21// Инициализация поля
22void init() {
23
24    t = 0;
25    qb_scroll_x = 0;
26
27    for (int i = 0; i < 200; i++)
28    for (int j = 0; j < 320; j++)
29        fld[0][j][i] = 0.0;
30}
31
32// Постоянное обновление поля
33void update() {
34
35    for (int y = 0; y < 199; y++)
36    for (int x = 0; x < 320; x++) {
37
38        if (qbs[x][y]) fld[0][x][y] = qbs[x][y];
39
40        // Сбор суммарной энергии соседей снизу
41        float s = fld[0][ (x+319)%320 ][ (y+1) ] +
42                  fld[0][ (x+0)%320 ][ (y+1) ] +
43                  fld[0][ (x+1)%320 ][ (y+1) ] +
44                  fld[0][ x ][ y ];
45
46        s = s/4 * 0.99;
47        fld[1][x][y] = s;
48    }
49}
50
51// Перерисовка и перенос в следующее состояние
52void redraw() {
53
54    for (int y = 0; y < 200; y++)
55    for (int x = 0; x < 320; x++) {
56
57        fld[0][x][y] = fld[1][x][y];
58
59        int s = 8*fld[0][x][y];
60        if (s > 255) s = 255;
61        pset(x, y, s);
62    }
63}
64
65// Генератор нового сида
66void sidgen() {
67
68    for (int x = 0; x < 320; x++) fld[0][x][199] = 0;
69    for (int x = 0; x < 128; x++) fld[0][rand() % 320][199] = rand()%256;
70}
71
72// 15 минут кодинга и 180 минут отладки
73int main(int argc, char* argv[]) {
74
75    screen(13);
76    generate_palette(PALNUMBER, pal);
77    init();
78
79    while (sdlevent(EVT_REDRAW)) {
80
81        sidgen();
82        update();
83        redraw();
84    }
85
86    return 0;
87}