Delphi GFX

       

Подготовительные действия


Перед тем как собственно что-нибудь нарисовать, нужно подготовить кое-какую информацию для нормальной работы приложения.

Во-первых, в закрытую секцию необъодимо добавить некоторые переменные и процедуры:

SineMove : array[0..255] of integer; { Таблица синусов для движения }
CosineMove : array[0..255] of integer; { Таблица косинусов }
SineTable : array[0..449] of integer; { Таблица синусов }
CenterX, CenterY : Integer; { Для координат центра черной дыры, которую мы будем рисовать }

procedure CalculateTables; { Заполнение таблиц синусов и косинусов }
procedure PlotPoint( XCenter, YCenter, Radius, Angle : Word); { Рисование точки на бэк-буфере }

Таблицы содержат заранее рассчитываемые значения синусов и косинусов, используемые для моделирования волн при движении. Зачем эти значения рассчитываются заранее? Вообще, в программировании игр всегда существует компромисс между скоростью и объемом. Если приложение занимает немного памяти, то оно все просчитывает само, следовательно, отнимается какое-то время. Либо можно просчитать все до цикла рисования, сохранить результаты и затем использовать их, выиграв в скорости. Процедура заполнения таблиц может выглядеть следующим образом (хотя ваша реализация, несомненно, будет работать намного лучше):

procedure TMainForm.CalculateTables;
var
wCount : Word;
begin
{ Precalculted Values for movement }
   for wCount := 0 to 255 do
   begin
      SineMove[wCount] := round( sin( pi*wCount/128 ) * 45 );
      CosineMove[wCount] := round( cos( pi*wCount/128 ) * 60 );
   end;
{ Precalculated Sine table. Only One table because cos(i) = sin(i + 90) }
   for wCount := 0 to 449 do
   begin
      SineTable[wCount] := round( sin( pi*wCount/180 ) * 128);
   end;
end;

К процедуре построения точки мы вернемся позже. Следующее, что нужно сделать - это добавить кое-какой код в событие OnCreate формы:

procedure TMainForm.FormCreate(Sender: TObject);
begin
   CenterX := Width div 2;
   CenterY := Height div 2;
   CalculateTables;
end;

И для того, чтобы форма завершилась по нажатию на клавишу ESC, нужно добавить код в обработчик события OnKeyDown:

procedure TMainForm.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
   if Key=VK_ESCAPE then Close;
end;

Теперь выбираем компоненту DXDraw, которую мы поместили на форму и создаем обработчик события OnFinalize:

DXTimer.Enabled := False;

Этот кусок кода останавливает таймер. Создайте обработчик события OnInitialize и добавьте в него строчку:

DXTimer.Enabled := True;

что запускает таймер, т.е. начинает отображение картинки (конечно, если поверхность готова к этому)



Содержание  Назад  Вперед