From 558e48db08bffd151af5a31b761b1b8648e23285 Mon Sep 17 00:00:00 2001 From: gm Date: Mon, 20 Jul 2026 01:53:52 +0900 Subject: [PATCH] Add basket-catch mini goal and increase apples to 8 --- README.md | 7 +- index.html | 282 +++++++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 233 insertions(+), 56 deletions(-) diff --git a/README.md b/README.md index 3255a9c..1fa193f 100644 --- a/README.md +++ b/README.md @@ -2,10 +2,11 @@ Tree of Life - HTML5 page for the podman pages service -- 정적 HTML5 + Three.js 기반 3D 사과나무 (`index.html` + `vendor/three.module.min.js`, 외부 CDN 의존성 없이 자체 호스팅) +- 정적 HTML5 + Three.js 기반 3D 사과나무 (`index.html` + `vendor/three.min.js`, 외부 CDN 의존성 없이 자체 호스팅) - 저사양 모바일 GPU에서도 부드럽게 동작하도록 로우폴리 지오메트리, 실시간 그림자 대신 블롭 섀도우, 픽셀비 상한(2x) 적용 -- 나무를 마우스/터치로 드래그하면 스프링-댐퍼 물리로 자연스럽게 흔들리고, 일정 세기 이상 흔들면 사과(5개)가 하나씩 떨어짐 -- 떨어진 사과는 바닥에 닿아 통통 튄 뒤 멈추고, 약 2.6초 후 원래 매달려 있던 자리에서 다시 자라남(pop-in 애니메이션) +- 나무를 마우스/터치로 드래그하면 스프링-댐퍼 물리로 자연스럽게 흔들리고, 일정 세기 이상 흔들면 사과(8개)가 하나씩 떨어짐 +- 가지는 사과가 떨어지고 약 2.6초 후 원래 자리에서 새 사과가 다시 자라남(pop-in 애니메이션) — 떨어진 사과가 바구니에 들어갔는지 여부와 무관하게 독립적으로 재생됨 +- 나무 아래 바구니에 사과가 떨어지면 자동으로 담기고(빗나가면 잔디에 튕겼다가 사라짐), 5개가 모이면 축하 메시지 + 컨페티가 뜨고 약 2.8초 후 바구니가 비워지며 반복 가능 ## pages 서비스 연동 diff --git a/index.html b/index.html index b1c2941..aa09f1b 100644 --- a/index.html +++ b/index.html @@ -59,6 +59,41 @@ } .stage.grabbing{ cursor: grabbing; } .stage canvas{ display:block; width:100%; height:100%; } + .hud{ + position:absolute; top:0.6rem; right:0.7rem; z-index:2; + background: rgba(0,0,0,0.35); color:#fff; font-size:0.8rem; font-weight:600; + padding:0.3rem 0.65rem; border-radius:999px; + display:flex; align-items:center; gap:0.3rem; + pointer-events:none; + font-variant-numeric: tabular-nums; + } + .confetti-layer{ position:absolute; inset:0; z-index:3; overflow:hidden; pointer-events:none; } + .confetti-piece{ + position:absolute; top:-14px; width:8px; height:14px; border-radius:2px; + animation: confetti-fall linear forwards; + } + @keyframes confetti-fall{ + 0%{ transform: translateY(0) rotate(var(--rot, 0deg)); opacity:1; } + 100%{ transform: translateY(70vh) rotate(calc(var(--rot, 0deg) + 220deg)); opacity:0; } + } + .celebrate{ + position:absolute; inset:0; z-index:4; + display:flex; align-items:center; justify-content:center; + opacity:0; pointer-events:none; + transition: opacity 0.3s ease; + } + .celebrate.show{ opacity:1; } + .celebrate .msg{ + background: rgba(255,255,255,0.92); color:#1c2b22; + padding:0.85rem 1.3rem; border-radius:14px; + font-weight:700; font-size:1.05rem; + box-shadow:0 10px 28px rgba(0,0,0,0.22); + } + @media (prefers-color-scheme: dark){ + .celebrate .msg{ background: rgba(20,28,22,0.92); color:#eaf3ec; } + } + :root[data-theme="dark"] .celebrate .msg{ background: rgba(20,28,22,0.92); color:#eaf3ec; } + :root[data-theme="light"] .celebrate .msg{ background: rgba(255,255,255,0.92); color:#1c2b22; } p.hint{ margin:0; color: var(--muted); @@ -69,12 +104,19 @@

Tree of Life

-
-

나무를 드래그해서 흔들어 보세요 🍎

+
+
🧺 0 / 5
+
+
🎉 사과 5개를 모았어요!
+
+

나무를 드래그해서 흔들면 사과가 떨어져요. 바구니에 5개를 모아보세요 🧺