Advertisement
ForrestFox

Fire Algorithm

Feb 26th, 2021
231
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.47 KB | None | 0 0
  1. #include <qblib.c>
  2.  
  3. #define PALNUMBER 6
  4. #define MSGNUMBER 9
  5. #define RECORDING 0
  6.  
  7. #define WIDTH  640
  8. #define HEIGHT 360
  9.  
  10. // Исходная палитра
  11. static const unsigned char pal[PALNUMBER][4] =
  12. {
  13.     {0,     0,   0,   0},
  14.     {16,    0,   0,  64},
  15.     {127, 255,   0,   0},
  16.     {230, 255, 255,   0},
  17.     {250, 255, 255, 192},
  18.     {255, 255, 255, 255}
  19. };
  20.  
  21. // Инициализация поля
  22. float t;
  23. int   msg_cnt;
  24. int   msg_id;
  25. float fld[ 2 ][ WIDTH ][ 500 ];
  26. float qbs     [ WIDTH ][ 500 ];
  27.  
  28. // Инициализация поля
  29. void init() {
  30.  
  31.     t = 0;
  32.  
  33.     for (int i = 0; i < HEIGHT; i++)
  34.     for (int j = 0; j < WIDTH; j++)
  35.         fld[0][j][i] = 0.0;
  36. }
  37.  
  38. // Постоянное обновление поля
  39. void update() {
  40.  
  41.     for (int y = 0; y < HEIGHT; y++)
  42.     for (int x = 0; x < WIDTH; x++) {
  43.  
  44.         if (qbs[x][y]) fld[0][x][y] = qbs[x][y];
  45.  
  46.         // Сбор суммарной энергии соседей снизу
  47.         float s = fld[0][ (x+WIDTH-1)%WIDTH ][ (y+1) ] +
  48.                   fld[0][ (x+0)%WIDTH ][ (y+1) ] +
  49.                   fld[0][ (x+1)%WIDTH ][ (y+1) ] +
  50.                   fld[0][ x ][ y ];
  51.  
  52.         s = s/4 * 0.997;
  53.         fld[1][x][y] = s;
  54.     }
  55. }
  56.  
  57. // Перерисовка и перенос в следующее состояние
  58. void redraw() {
  59.  
  60.     for (int y = 0; y < HEIGHT; y++)
  61.     for (int x = 0; x < WIDTH; x++) {
  62.  
  63.         fld[0][x][y] = fld[1][x][y];
  64.  
  65.         int s = 8*fld[0][x][y];
  66.         if (s > 255) s = 255;
  67.         pset(x, y, s);
  68.     }
  69. }
  70.  
  71. // Нарисовать предметы
  72. void draw() {
  73.  
  74.     linebf(0, 0, WIDTH, HEIGHT, 0);
  75.     circle(320 + sin(t)*200, 240 + cos(t)*80, 4, -128);
  76.     circle(320 - cos(t)*200, 240 - sin(t)*80, 4, -128);
  77.  
  78.     for (int y = 0; y < HEIGHT; y++)
  79.     for (int x = 0; x < WIDTH; x++)
  80.         qbs[x][y] = qb_screen[x][y];
  81. }
  82.  
  83. void sidgen() {
  84.  
  85.     t += 0.01;
  86.  
  87.     // Генератор нового сида
  88.     for (int x = 0; x < WIDTH; x++) fld[0][x][479] = 0;
  89.     for (int x = 0; x < 128; x++) fld[0][rand() % WIDTH][HEIGHT-1] = rand()%256;
  90.  
  91. }
  92.  
  93. // 15 минут кодинга
  94. int main(int argc, char* argv[]) {
  95.  
  96.     screen(15);
  97.  
  98.     init();
  99.     generate_palette(PALNUMBER, pal);
  100.  
  101.     // Залипательный огонь...
  102.     while (sdlevent(EVT_REDRAW)) {
  103.  
  104.         sidgen();
  105.         draw();
  106.         update();
  107.         redraw();
  108.         if (record(argc, argv, 3*3600)) break;
  109.     }
  110.  
  111.     return 0;
  112. }
  113.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement