function createSnow2() {
const snow2 = document.createElement("div");
snow2.classList.add("snow2");
snow2.style.left = Math.random() * window.innerWidth + "px";
snow2.style.animationDuration = Math.random() * 10 + 10 + "s";
snow2.style.top = "200px";
document.body.appendChild(snow2);
setTimeout(() => snow2.remove(), 10000);
}
setInterval(createSnow2, 300);
// 물리 시뮬레이션에 필요한 변수들
const snowWidth = 50;
const snowHeight = 50;
const gravity = 0.3; // 중력 가속도
const friction = 0.99; // 마찰 (좌우 속도 감쇠)
const bounceFactor = 0.7; // 바닥 충돌 시 튕기는 정도
const snowArray = [];
// 강아지(스노우독) 생성 함수
function createSnow() {
const snow = document.createElement("div");
snow.classList.add("snow");
// 시작 위치: 화면 위쪽 조금 바깥쪽 (자연스럽게 떨어지도록)
const left = Math.floor(Math.random() * (window.innerWidth - snowWidth));
const top = -snowHeight;
snow.style.left = left + "px";
snow.style.top = top + "px";
// 초기 속도 (수평 랜덤, 수직은 0)
snow.vx = (Math.random() * 5 - 2); // -2 ~ 2 사이
snow.vy = 0;
document.body.appendChild(snow);
snowArray.push(snow);
}
// 매 프레임마다 각 스노우독의 위치 업데이트
function updateSnow() {
snowArray.forEach(snow => {
// 현재 위치
let currentTop = parseFloat(snow.style.top);
let currentLeft = parseFloat(snow.style.left);
// 속도에 중력 적용 (수직)
snow.vy += gravity;
// 위치 업데이트
let newTop = currentTop + snow.vy;
let newLeft = currentLeft + snow.vx;
// 바닥에 닿으면 튕기고 마찰 효과 적용
if (newTop + snowHeight > window.innerHeight) {
newTop = window.innerHeight - snowHeight;
snow.vy = -snow.vy * bounceFactor;
// 매우 느린 수직 속도는 0으로 처리하여 정지시키기
if (Math.abs(snow.vy) < 0.5) {
snow.vy = 0;
}
}
// 좌우 벽 충돌 처리
if (newLeft < 0) {
newLeft = 0;
snow.vx = -snow.vx;
} else if (newLeft + snowWidth > window.innerWidth) {
newLeft = window.innerWidth - snowWidth;
snow.vx = -snow.vx;
}
// 좌우 마찰 적용 (지면에서 굴러갈 때 서서히 감속)
if (newTop >= window.innerHeight - snowHeight) {
snow.vx *= friction;
}
// 실제 스타일에 반영
snow.style.top = newTop + "px";
snow.style.left = newLeft + "px";
});
requestAnimationFrame(updateSnow);
}
// 주기적으로 새 강아지 생성 (0.5초마다)
setInterval(createSnow, 1000);
// 애니메이션 루프 시작
updateSnow();
document.addEventListener("mousemove", () => {
snowArray.forEach(snow => snow.remove()); // 눈송이 삭제
snowArray.length = 0; // 배열 초기화
});
setInterval(createSnow, 1000);
updateSnow();