pascalabcnet/InstallerSamples/Graphics/GraphABC/ThroughTheUniverse.pas

85 lines
2.8 KiB
ObjectPascal
Raw Normal View History

//Программа "Скозь вселенную". Порт с midletPascal
2015-05-14 22:35:07 +03:00
uses GraphABC;
type
// Описываем тип-элемент Звезда
2015-05-14 22:35:07 +03:00
TStar = record
X, Y, Z : real; // Положение в пространстве
2015-05-14 22:35:07 +03:00
end;
const
MAX_STARS = 1000; // Кол-во звёздочек
SPEED = 200; // Скорость, в единицах/сек
2015-05-14 22:35:07 +03:00
var
i : Integer;
// Наши звёздочки :)
2015-05-14 22:35:07 +03:00
Stars : array [1..MAX_STARS] of TStar;
// Ширина и высота дисплея
2015-05-14 22:35:07 +03:00
scr_W : Integer;
scr_H : Integer;
// Время
2015-05-14 22:35:07 +03:00
time, dt : Integer;
// Рисует текущую звёздочку (i), цвета (c)
2015-05-14 22:35:07 +03:00
procedure SetPix(c: Integer);
var
sx, sy : Integer;
begin
// Данные действия, проецируют 3D точку на 2D полоскость дисплея
2015-05-14 22:35:07 +03:00
try
sx := trunc(scr_W / 2 + Stars[i].X * 200 / (Stars[i].Z + 200));
sy := trunc(scr_H / 2 - Stars[i].Y * 200 / (Stars[i].Z + 200));
except
end;
try
SetPixel(sx, sy, Color.FromArgb(c, c, c));
except
end;
end;
begin
MaximizeWindow();
scr_W := Window.Width;
scr_H := Window.Height;
//случайным образом раскидаем звёздочки
2015-05-14 22:35:07 +03:00
randomize;
for i := 1 to MAX_STARS do
begin
Stars[i].X := random(scr_W * 4) - scr_W * 2;
Stars[i].Y := random(scr_H * 4) - scr_H * 2;
Stars[i].Z := random(1900);
end;
// Очистка содержимого дисплея (чёрный цвет)
2015-05-14 22:35:07 +03:00
ClearWindow(Color.Black);
time := Milliseconds;
// Главный цикл отрисовки
2015-05-14 22:35:07 +03:00
repeat
scr_W := Window.Width;
scr_H := Window.Height;
dt := Milliseconds - time; // Сколько мс прошло, с прошлой отрисовки
time := Milliseconds; // Засекаем время
2015-05-14 22:35:07 +03:00
for i := 1 to MAX_STARS do
begin
// Затираем звёздочку с предыдущего кадра
2015-05-14 22:35:07 +03:00
SetPix(0);
// Изменяем её позицию в зависимости прошедшего с последней отрисовки времени
2015-05-14 22:35:07 +03:00
Stars[i].Z := Stars[i].Z - SPEED * dt/1000;
// Если звезда "улетела" за позицию камеры - генерируем её вдали
2015-05-14 22:35:07 +03:00
if Stars[i].Z <= -200 then
begin
Stars[i].X := random(scr_W * 4) - scr_W * 2;
Stars[i].Y := random(scr_H * 4) - scr_H * 2;
Stars[i].Z := 1900; // Откидываем звезду далеко вперёд :)
2015-05-14 22:35:07 +03:00
end;
// Рисуем звёздочку в новом положении (цвет зависит от Z координаты)
2015-05-14 22:35:07 +03:00
SetPix(trunc(255 - 255 * (Stars[i].Z + 200) / 2100));
end;
sleep(10);
until false;
end.