85 lines
2.8 KiB
ObjectPascal
85 lines
2.8 KiB
ObjectPascal
|
|
//Программа "Скозь вселенную". Порт с midletPascal
|
|||
|
|
|
|||
|
|
uses GraphABCLinux;
|
|||
|
|
|
|||
|
|
type
|
|||
|
|
// Описываем тип-элемент Звезда
|
|||
|
|
TStar = record
|
|||
|
|
X, Y, Z : real; // Положение в пространстве
|
|||
|
|
end;
|
|||
|
|
|
|||
|
|
const
|
|||
|
|
MAX_STARS = 1000; // Кол-во звёздочек
|
|||
|
|
SPEED = 200; // Скорость, в единицах/сек
|
|||
|
|
|
|||
|
|
var
|
|||
|
|
i : Integer;
|
|||
|
|
// Наши звёздочки :)
|
|||
|
|
Stars : array [1..MAX_STARS] of TStar;
|
|||
|
|
// Ширина и высота дисплея
|
|||
|
|
scr_W : Integer;
|
|||
|
|
scr_H : Integer;
|
|||
|
|
// Время
|
|||
|
|
time, dt : Integer;
|
|||
|
|
|
|||
|
|
// Рисует текущую звёздочку (i), цвета (c)
|
|||
|
|
procedure SetPix(c: Integer);
|
|||
|
|
var
|
|||
|
|
sx, sy : Integer;
|
|||
|
|
begin
|
|||
|
|
// Данные действия, проецируют 3D точку на 2D полоскость дисплея
|
|||
|
|
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;
|
|||
|
|
|
|||
|
|
//случайным образом раскидаем звёздочки
|
|||
|
|
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;
|
|||
|
|
|
|||
|
|
// Очистка содержимого дисплея (чёрный цвет)
|
|||
|
|
ClearWindow(Color.Black);
|
|||
|
|
|
|||
|
|
time := Milliseconds;
|
|||
|
|
// Главный цикл отрисовки
|
|||
|
|
repeat
|
|||
|
|
scr_W := Window.Width;
|
|||
|
|
scr_H := Window.Height;
|
|||
|
|
dt := Milliseconds - time; // Сколько мс прошло, с прошлой отрисовки
|
|||
|
|
time := Milliseconds; // Засекаем время
|
|||
|
|
for i := 1 to MAX_STARS do
|
|||
|
|
begin
|
|||
|
|
// Затираем звёздочку с предыдущего кадра
|
|||
|
|
SetPix(0);
|
|||
|
|
// Изменяем её позицию в зависимости прошедшего с последней отрисовки времени
|
|||
|
|
Stars[i].Z := Stars[i].Z - SPEED * dt/1000;
|
|||
|
|
// Если звезда "улетела" за позицию камеры - генерируем её вдали
|
|||
|
|
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; // Откидываем звезду далеко вперёд :)
|
|||
|
|
end;
|
|||
|
|
// Рисуем звёздочку в новом положении (цвет зависит от Z координаты)
|
|||
|
|
SetPix(trunc(255 - 255 * (Stars[i].Z + 200) / 2100));
|
|||
|
|
end;
|
|||
|
|
sleep(10);
|
|||
|
|
until false;
|
|||
|
|
end.
|