Как видно, для подготовки к работе с 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 (в зависимости от полноэкранного/оконного режима).