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

#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();
}