Лисья Нора

Оглавление


§ Моя щеколтивая история

Это один из моих любимых эффектов: эффект огня. Эффектно, неэффективно и всё, что связано с HiSciFX. Итак, все началось с Олимпиады 2004, которая была проведена в Твери. А вы подумали, я про "ту"? Нет, это было про "эту", которая связана с областной олимпиаде по программированию. Вот так было. Я приехал туда, потому что каким-то странным образом занял 1-е место в городской олимпиаде среди школьников всех времен и народов... то есть, просто, среди школьников 9-классников, потому что я был тоже 9-классником.
Долго ли коротко ли, но я ошивался бесцельно по просторным холлам некой школы с компами, которые я обожал. Я заглядывался на них, как на няшную тян, и у меня текли слюнки – дайте, пустите меня к моей Клаве! Я хочу прикоснуться к ее мягким клавишам, чтобы испытать наслаждение программирования. Но нет, там все было строго и сурово. И тут ко мне подходит определенная личность в виде еще одного долговязого школьника-программиста и от нечего делать мы с ним разговорились. Он мне рассказал о крутизне своего компа, отчего я сразу же загорелся, чтобы помацать его комп, но это было слишком уже даже для меня! Конечно, я понимаю – гормоны, все дела, но нельзя же вот так прямо сразу к его компу лезть! Ну, мы с ним перебалтывались постепенно, все больше и больше понимая, до чего же крутой у него комп и вообще, всё, и не знаю каким образом, но в свободное от программирования в уме и на бумаге время, я оказался у него дома.
А там был компы, алгоритмы и прочие красивые няшки. И тут он запустил на компе программу, которая весила 128 байт и я узрел настоящее чудо: там был огонь. Это было просто огонь! Я мечтал разобрать прогу на инструкции, но не решился – наглость моя все-таки знала границы. Однако, я был настолько впечатлён, что грезил об этой Программе, ночами не спал и плакал в подушку. И, наконец, решился и осторожно, чтобы не спугнуть рыбку, написал на электронную почту этого сверхчеловека, чтобы он мне выслал тут Программу и какое же было чудо, он ее выслал и в тот же вечер занялся с ней тем самым, ну вы поняли – дизассемблированием. Я со всех сторон изучил, разобрал до каждой инструкции, до каждого байта и смог, наконец, всё понять, как эта Прекрасная Программа работает. Теперь смогу записать Ее тут, в виде программного кода на Си.

§ Программный код

Структура:
fire.png
#include <qblib.h>
 
// Исходная палитра
static const unsigned char pal[6][4] =
{
{0, 0, 0, 0},
{15, 0, 0, 64},
{127, 255, 0, 0},
{230, 255, 255, 0},
{250, 255, 255, 192},
{255, 255, 255, 255}
};
 
// Инициализация поля
float t = 0;
float fld[2][ 320 ][ 200 ];
 
// Инициализация поля
void load()
{
palette(pal, 6);
 
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 < 200; y++)
for (int x = 0; x < 320; x++) {
 
// Сбор суммарной энергии соседей снизу
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;
}
 
int main(int argc, char** argv)
{
screen();
load();
 
while (loop()) {
sidgen();
update();
redraw();
}
 
return quit();
}