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