§ Демонстрация работы
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; }