Last active
May 17, 2025 16:49
-
-
Save igorkovalchuk/4ecb757522800c9ac65654a74f69652d to your computer and use it in GitHub Desktop.
Ретро анімація - політ пташок
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// https://youtu.be/WUx0G43TRsQ | |
// симулятор ретро комп'ютера https://igorkovalchuk.github.io | |
// у даному прикладі розрахунок дистанції та розміру пташки є дуже орієнтовним, | |
// правильно було б задати швидкість зграї, а від швидкості вже вираховувати дистанцію, | |
// а від дистанції - розмір пташки та її координати | |
cls(); | |
// максимальна довжина проекції крила на осі x та y | |
var WING_DX = 30; | |
var WING_DY = 20; | |
// початкові координати центру зграї пташок | |
var START_X = 64; | |
var START_Y = 20; | |
var HALF_OF_SCREEN_Y = 24; | |
// період часу для одного помаху крила | |
var T_PERIOD = 60; | |
var PI = 3.14159; | |
for(n = 0; n < 3; n++) { // кількість повторів анімації | |
await animate(); | |
} | |
async function animate() { | |
// час, можна вважати за секунди, але у даному прикладі це досить умовно. | |
// одна анімація триває близько 3-х з половиною секунд | |
for(t = 0; t <= 360; t += 10) { | |
cls(); | |
// спроба задати траєкторію як частину спіралі | |
var dx = (t / 10) * Math.cos(PI * t / 360); // дельта x зграї | |
var dy = HALF_OF_SCREEN_Y * Math.sin(PI * t / 360); // дельта y зграї | |
var z = 1 + t / 60; // дистанція на якій знаходиться зграя, починається з 1 | |
drawMountain(t); | |
drawFlock(START_X + dx, START_Y + dy, z, t); | |
await pause(0.1); | |
} | |
} | |
function drawFlock(x, y, z, t) { | |
drawBird(x + 15, y + 5, z + 3, t + 15); | |
drawBird(x, y, z, t); | |
drawBird(x - 20, y - 20, z + 5, t + 30); | |
} | |
function drawBird(x, y, z, t) { | |
var dx = WING_DX / z; | |
var dy = calculateWingDy(t) / z; | |
plot(x, y, 1); | |
line(x - dx, y + dy); | |
plot(x, y, 1); | |
line(x + dx, y + dy); | |
} | |
function calculateWingDy(t) { | |
var remainder = t % T_PERIOD; | |
var percent = remainder / T_PERIOD; | |
var dy = WING_DY * percent; | |
return dy; | |
} | |
function drawMountain(t) { | |
var dx = 0; | |
var dy = t / 120; | |
plot(0, 12 + dy, 1); | |
line(20 + dx, 20 + dy); | |
line(50 + dx, 5 + dy); | |
line(80 + dx, 12 + dy); | |
line(127, 3 + dy); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment