Перед тем как собственно что-нибудь нарисовать, нужно подготовить кое-какую информацию для нормальной работы приложения.
Во-первых, в закрытую секцию необъодимо добавить некоторые переменные и процедуры:
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; |
что запускает таймер, т.е. начинает отображение картинки (конечно, если поверхность готова к этому)