pascalabcnet/TestSuite/CompilationSamples/ThroughTheUniverse.pas
Бондарев Иван e6e67c193c initial commit
2015-05-14 21:35:07 +02:00

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.