Delphi GFX


Самое главное - это время


Как видно, для подготовки к работе с DirectX нужно совсем немного. Теперь перейдем собственно к рисованию. Создайте обработчик события OnTimer таймера и добавьте в него следующий код:

procedure TMainForm.DXTimerTimer(Sender: TObject; LagCount: Integer);
const
  x : Word = 0;
  y : Word = 0;
  IncAngle = 12;
  XMove = 7;
  YMove = 8;
var
  CountAngle : Word;
  CountLong : Word;
  IncLong :Word;
begin
  if not DXDraw.CanDraw then exit;
  IncLong := 2;
  CountLong := 20;
  DXDraw.Surface.Fill( 0 );
  repeat
    CountAngle := 0;
    repeat
      PlotPoint(CosineMove[( x + ( 200 - CountLong )) mod 255],
      SineMove[( y + ( 200 - CountLong )) mod 255], CountLong, CountAngle);
      inc(CountAngle, IncAngle);
    until CountAngle >= 360;
    inc(CountLong, IncLong);
    if ( CountLong mod 3 ) = 0 then inc(IncLong);
  until CountLong >= 270;
  x := XMove + x mod 255;
  y := YMove + y mod 255;   
  with DXDraw.Surface.Canvas do
  begin
    Brush.Style := bsClear;
    Font.Color := clWhite;
    Font.Size := 12;
    Textout( 0, 0, 'FPS: '+inttostr( DXTimer.FrameRate ) );
    Release;
  end;
DXDraw.Flip;
end;

Это основной код нашего приложения. Рассмотрим некторые важные моменты:

Вызов процедуры Fill поверхности DXDraw.Surface (DXDraw.Surface.Fill(0);) заполняет буфер цветом, который передается ей в качестве параметра (в нашем случае - черный).

Рассмотрим теперь процедуру PlotPoint. Все таблицы для ее работы были заполнены на подготовительном этапе, так что ничто не мешает нам нарисовать все, что мы хотим. Итак,

procedure TMainForm.PlotPoint(XCenter, YCenter, Radius, Angle: Word);
var
   X, Y : Word;
begin
   X := ( Radius * SineTable[90 + Angle]);
   asm
      sar x,7
   end;
   X := CenterX + XCenter + X;
   Y := ( Radius * SineTable[Angle] );
   asm
      sar y,7
   end;
   Y := CenterY + YCenter + Y;
   if (X < Width ) and ( Y < Height ) then
   begin
      DXDraw.Surface.Canvas.Pixels[X, Y] := clBlue;
      DXImageList.Items[0].Draw( DXDraw.Surface, X, Y, 0 );
   end;
end;

Основная строка в этой процедуре:

DXImageList.Items[0].Draw( DXDraw.Surface, X, Y, 0 );

Как было сказано выше DXImageList содержит массив картинок, с которыми мы работаем. Доступ к элементам осуществляется через индекс, начинающийся с 0. Т.е. указывая DXImageList.Items[0], мы получаем первую картинку, и т.д. Свойство Items имеет метод Draw, в который нужно передать 4 параметра. Первый параметр определяет поверхность, на которой будет рисоваться эта картинка. Второй и третий параметры - X и Y - определяют позицию, в которую будет выведено изображение. Последний параметр - флаг, определяющий прозрачность выводимой картинки. Так что строка кода, приведенная выше может прочитаться как "Вывести картинку с индексом 0 на поверхность DXDraw.Surface в позицию X, Y со значением прозрачности 0".

Также можно использовать свойство Pixels объекта Canvas для указания цвета определенной точки на экране (эта строка закоментирована, так как в нашем случае используется картинка. Эксперименты со свойством Pixels даются вам в качестве домашнего задания).

После того, как мы нарисовали нашу картинку, мы выводим значение FPS используя свойство FrameRate таймера. Вывод производится с помощью свойства Canvas объекта DXDraw.Surface.

Наконец вызывается метод DXDraw.Flip для отображения картинки на экране. При этом основная поверхность становится буфером.

Все, компилируйте и запускайте ваше приложение. На P120 получается порядка 12-15FPS (в зависимости от полноэкранного/оконного режима).




Начало  Назад  Вперед