85 lines
2.3 KiB
ObjectPascal
85 lines
2.3 KiB
ObjectPascal
//Ïðîãðàììà "Ñêîçü âñåëåííóþ". Ïîðò ñ midletPascal
|
|
|
|
uses GraphABC;
|
|
|
|
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. |