Skip to content

Instantly share code, notes, and snippets.

@igorkovalchuk
Last active May 17, 2025 16:49
Show Gist options
  • Save igorkovalchuk/4ecb757522800c9ac65654a74f69652d to your computer and use it in GitHub Desktop.
Save igorkovalchuk/4ecb757522800c9ac65654a74f69652d to your computer and use it in GitHub Desktop.
Ретро анімація - політ пташок
// 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