|
|
@@ -10,7 +10,6 @@ import { TextureLayer } from "../base/TextureLayer";
|
|
|
import { loadImage } from "../base/utils";
|
|
|
import AudioPlayer, { AudioType } from "./Audio";
|
|
|
import { AreaGroup, AreaGroups, Color, Settings } from "./common";
|
|
|
-import Explosion from "./explosion";
|
|
|
import {
|
|
|
FillerConfig,
|
|
|
FillerData,
|
|
|
@@ -64,10 +63,6 @@ async function init() {
|
|
|
// 应用背景渐变到 body
|
|
|
document.body.style.background = adTheme.bgGradient;
|
|
|
|
|
|
- // 应用进度条颜色
|
|
|
- const progressBar = document.getElementById("progress");
|
|
|
- if (progressBar) progressBar.style.backgroundColor = adTheme.progressColor;
|
|
|
-
|
|
|
const loadingController = new LoadingController({
|
|
|
minDisplayTime: 1000, // 最小显示时间1秒
|
|
|
fadeDuration: 300, // 淡出动画300ms
|
|
|
@@ -253,6 +248,8 @@ async function init() {
|
|
|
} else {
|
|
|
// 创建手指提示,全图未完成时启动引导
|
|
|
fingerHint = new FingerHint(scene, fillerData, adAssets.fingerUrl);
|
|
|
+ // 监听 group 切换,确保手指提示立即指向新颜色区块
|
|
|
+ fillerData.addListener(fingerHint);
|
|
|
fingerHint.start();
|
|
|
}
|
|
|
}
|
|
|
@@ -297,7 +294,7 @@ function createButtons(fillerData: FillerData) {
|
|
|
color = new Color(areaGroup.color);
|
|
|
if (areaGroup.isAllColored) {
|
|
|
htmlDone.push(
|
|
|
- `<div id="color-btn-container-${i}" class="color-btn-container" onclick="selectColor(this, event, ${i})">`,
|
|
|
+ `<div id="color-btn-container-${i}" class="color-btn-container color-btn-done">`,
|
|
|
);
|
|
|
htmlDone.push(
|
|
|
`<svg id="color-btn-progress-ring-${i}" class="color-btn-progress-ring" viewBox="0 0 48 48"><circle class="color-btn-progress-ring-track" cx="50%" cy="50%" r="45%" fill="transparent" stroke="#fff" stroke-width="5%" /> <circle id="color-btn-progress-ring-value-${i}" class="color-btn-progress-ring-value" cx="50%" cy="50%" r="45%" fill="transparent" stroke="#2ecc71" stroke-width="5%" stroke-linecap="round" /></svg>`,
|
|
|
@@ -350,6 +347,8 @@ function createButtons(fillerData: FillerData) {
|
|
|
i: number,
|
|
|
) {
|
|
|
console.log("select", el, event, i);
|
|
|
+ // 已完成的颜色不可点击
|
|
|
+ if (fillerData.data.areaGroups[i].isAllColored) return;
|
|
|
fillerData.setCurrentGroup(i);
|
|
|
document.querySelectorAll(".color-btn-container").forEach((item) => {
|
|
|
item.classList.remove("color-btn-container-selected");
|
|
|
@@ -359,15 +358,10 @@ function createButtons(fillerData: FillerData) {
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 调整整体完成进度条
|
|
|
+ * 调整整体完成进度条(已移除,保留接口兼容)
|
|
|
*/
|
|
|
-function cssAdjustProgress(percent: number) {
|
|
|
- let progressElem = document.getElementById("progress") as HTMLDivElement;
|
|
|
- let percentElem = document.getElementById("percent") as HTMLDivElement;
|
|
|
-
|
|
|
- percentElem.innerText = `${percent}%`;
|
|
|
-
|
|
|
- progressElem.style.width = `${percent}%`;
|
|
|
+function cssAdjustProgress(_percent: number) {
|
|
|
+ // progress bar removed — no-op
|
|
|
}
|
|
|
|
|
|
// 选中某个color, 自动切换到下一个颜色的时候触发调用
|
|
|
@@ -414,70 +408,26 @@ function cssInitColorProgress(i: number, percent: number) {
|
|
|
progressCircle.style.strokeDashoffset = offset.toString();
|
|
|
}
|
|
|
|
|
|
-// 调整滚动条
|
|
|
+// 调整滚动条,将当前颜色按钮居中
|
|
|
function cssAdjustScroll(fd: FillerData) {
|
|
|
let wrapper = document.getElementById("color-btns")!;
|
|
|
- let count =
|
|
|
- document.body.clientWidth /
|
|
|
- (wrapper.scrollWidth / fd.data.areaGroups.length); // 视窗内显示了多少个元素
|
|
|
- let width = document.body.clientWidth / count; // 每个元素占用的宽度
|
|
|
- // 计算位置
|
|
|
- let scrollpos =
|
|
|
- (wrapper.scrollWidth / fd.data.areaGroups.length) *
|
|
|
- (fd.currentGroupIndex - fd.doneBeforeCount) -
|
|
|
- (count * width) / 2 +
|
|
|
- width / 2;
|
|
|
- scrollpos = scrollpos < 0 ? 0 : scrollpos;
|
|
|
- // wrapper.scrollLeft = scrollpos ; // 不要直接设置scrollLeft,太突然没效果
|
|
|
+ let itemWidth = wrapper.scrollWidth / fd.data.areaGroups.length;
|
|
|
+ let scrollpos = itemWidth * fd.currentGroupIndex + itemWidth / 2 - wrapper.clientWidth / 2;
|
|
|
+ scrollpos = Math.max(0, scrollpos);
|
|
|
try {
|
|
|
- wrapper.scroll({ left: scrollpos, top: 0, behavior: "smooth" }); // 发现有些低端机不支持
|
|
|
+ wrapper.scroll({ left: scrollpos, top: 0, behavior: "smooth" });
|
|
|
} catch (e) {
|
|
|
- console.log(e);
|
|
|
wrapper.scrollLeft = scrollpos;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-/**
|
|
|
- * 数字item爆破动画
|
|
|
- */
|
|
|
-function cssExplosionAnimation(
|
|
|
- numElem: HTMLElement,
|
|
|
- color: string,
|
|
|
- onfinish: Function,
|
|
|
-) {
|
|
|
- let aniCanvas = document.createElement("canvas");
|
|
|
- aniCanvas.className = "finish-ani-canvas";
|
|
|
- let coords = numElem.getBoundingClientRect();
|
|
|
- aniCanvas.style.left = `${coords.left - 50}px`;
|
|
|
- aniCanvas.style.top = `${coords.top - 50}px`;
|
|
|
- aniCanvas.style.width = `${coords.width + 100}px`;
|
|
|
- aniCanvas.style.height = `${coords.height + 100}px`;
|
|
|
- document.body.append(aniCanvas);
|
|
|
-
|
|
|
- let explosion = new Explosion(aniCanvas, color, 50, () => {
|
|
|
- onfinish();
|
|
|
- aniCanvas.remove();
|
|
|
- });
|
|
|
- explosion.explode();
|
|
|
-}
|
|
|
-
|
|
|
// 某个颜色填充完毕
|
|
|
function cssColorDone(fillerData: FillerData) {
|
|
|
let i = fillerData.currentGroupIndex;
|
|
|
- let color = new Color(fillerData.currentGroup!.color).css();
|
|
|
-
|
|
|
- let wrapper = document.getElementById("color-btns")!;
|
|
|
- let buttonWrap = document.getElementById(`color-btn-container-${i}`)!;
|
|
|
-
|
|
|
- setTimeout(() => {
|
|
|
- //等环形进度条走完,开始爆破动画
|
|
|
- buttonWrap.style.visibility = "hidden";
|
|
|
- cssExplosionAnimation(buttonWrap, color, () => {
|
|
|
- // 爆破动画结束后,将元素移至末尾
|
|
|
- wrapper.lastElementChild!.after(buttonWrap);
|
|
|
- buttonWrap.style.visibility = "visible";
|
|
|
- });
|
|
|
- }, 300);
|
|
|
+ // 标记完成状态,不做爆破动画,不移动位置
|
|
|
+ const buttonWrap = document.getElementById(`color-btn-container-${i}`)!;
|
|
|
+ buttonWrap.classList.add("color-btn-done");
|
|
|
+ buttonWrap.onclick = null;
|
|
|
}
|
|
|
|
|
|
// 全部填完
|
|
|
@@ -597,7 +547,7 @@ function showToast(message: string) {
|
|
|
// 撒花动画,使用js-confetti库
|
|
|
function confetti() {
|
|
|
const jsConfetti = new JSConfetti();
|
|
|
- jsConfetti.addConfetti();
|
|
|
+ jsConfetti.addConfetti({ confettiNumber: 80 });
|
|
|
}
|
|
|
|
|
|
function onActionSheetClick(evt: Event) {
|