1

Тема: Moving Balls demo

misc.php?action=pun_attachment&item=145&download=0

Для отображения на экране изображения с движущимися шариками используется библиотека Buf2D.

Есть некоторые замечания

Почему-то функция buf_create_f_img не создаёт 32-битный буфер, хотя, казалось бы, что этому мешает?
Пришлось самостоятельно это сделать.

Структура содержит поле Color:   

  TBuf2DBuffer = packed record
    Img:    Pointer;
    Left:   SmallInt;
    Top:    SmallInt;
    Width:  LongWord;
    Height: LongWord;
    Color:  LongWord;
    BPP:    Byte;
  end;

но всё равно почему-то нужно указывать цвет параметром Color ещё и тут: 

  buf2d_clear:          procedure(var Buffer: TBuf2DBuffer; Color: LongWord); stdcall;  

Непонятно, для чего это так дублируется(либо в структуре поле Color лишнее, либо лишний параметр Color в функции buf2d_clear)?

Насколько понял, на самом деле функция buf2d_bit_blt_transp работает с изображением с инвертированным альфа-каналом.
Да, это и указано в документации

Если a=255 то пиксель прозрачный, если 0 не прозрачный.

хотя может показаться не очень привычным: необходимо сначала преобразовать изображение к такому формату.
То есть, я хочу сказать, что имея изначально правильное 32-битное BGRA изображение, придётся в нём предварительно инвертировать альфа-канал(обычно так не делают).
Ссылки по теме:

В примере используются некоторые стандартные функции(Power, Exp, Ln, ...)

есть некоторые нюансы

В примере используется функция Ln — логарифм.
В стандартном System для Delphi 2005 и новее она вот такая

function Ln(const X: Extended): Extended;
asm
        FLD     X       // загрузили наше число
        FLDLN2          // загрузили ln(2) 
        FXCH            // поменяли местами загруженные числа
        FYL2X           // нашли логарифм
        FWAIT
end;

А более ранние версии Delphi(например, Delphi 7) похоже просто инлайнят этот код, но инструкции генерируют те же самые.
Так вот, я сделал по-другому:

function Ln(const X: Extended): Extended;
asm
  FLDLN2                // загрузили ln(2) 
  FLD X                 // загрузили наше число
  FYL2X                 // нашли логарифм
end;

У меня всё так же работает как положено.
Я убрал FWAIT, но дело не в этом.
Как можно заметить, я загрузил числа в обратном порядке, и поэтому не пришлось их менять местами с помощью FXCH.
Вот и не понятно, какой великий смысл был в исходном варианте(загрузить в другом порядке и потом поменять местами)? Ведь разработчики Delphi явно же понимали, что делают.

Также используется функция Exp, я её не стал копипастить из стандартного System.
Используемый в данный момент вариант содержит меньшее количество команд по сравнению со стандартным.

В примере в некоторой степени используется ООП

тип TBall представляет собой объект
  TBall = object
    Freq: Single;
    Len: Single;
    Rad: Single;
    ImgBuf: TBuf2DBuffer;
    procedure Draw;
    procedure Init(i: LongInt);
  end;

Исходный код — MovingBalls.7z.
Скомпилированное приложение — MovingBalls.kex.

Post's attachments

Иконка вложений MovingBalls.7z 9 Кб, 51 скачиваний с 2022-01-30 

Иконка вложений MovingBalls.kex 5.5 Кб, 58 скачиваний с 2022-01-30 

Иконка вложений MovingBalls.PNG 90.21 Кб, 38 скачиваний с 2022-01-30