当前位置: 首页 > article >正文

uni-app实现完成任务解锁拼图功能

界面如下

在这里插入图片描述

代码如下

<template><view class="puzzle-container"><view class="puzzle-title">任务进度 {{completedCount}}/{{totalPieces}}</view><view class="puzzle-grid"><viewv-for="(piece, index) in puzzlePieces":key="index"class="puzzle-piece":class="{'unlocked': piece.unlocked,'locked': !piece.unlocked,'unlock-animation': animatingIndex === index}"@click="onPieceTap(index)"><!-- 已解锁显示拼图块,未解锁显示锁图标 --><imagev-if="piece.unlocked":src="piece.imageUrl"mode="aspectFill"class="piece-image"></image><imagev-elsesrc="@/static/images/form/close-image.png"class="lock-icon"></image><!-- 显示拼图块编号 --><text class="piece-number">{{index + 1}}</text><!-- 粒子效果 --><view class="particle-container" v-if="animatingIndex === index"><viewclass="particle"v-for="particle in particles":key="particle.id":style="{left: particle.left + '%',top: particle.top + '%',backgroundColor: particle.color}"></view></view></view></view><!-- 完成所有拼图后的庆祝弹窗 --><uni-popup ref="completePopup" type="center"><view class="celebration-popup"><image src="/static/celebration.png" mode="widthFix"></image><text class="celebration-text">恭喜完成所有任务!</text><button @click="viewCompletePuzzle">查看完整拼图</button></view></uni-popup></view>
</template><script>
export default {data() {return {totalPieces: 20,puzzlePieces: [],completedCount: 0,animatingIndex: -1,particles: [],allCompleted: false}},created() {this.initPuzzle();},methods: {// 初始化拼图initPuzzle() {this.puzzlePieces = Array(this.totalPieces).fill().map((_, index) => ({index,unlocked: false,imageUrl: `../../static/pt/pt${index + 1}.png`}));// 模拟已解锁的拼图块 (实际应从后端获取)this.unlockPiece(0);this.unlockPiece(1);this.unlockPiece(2);this.unlockPiece(3);this.unlockPiece(4);this.completedCount = 5;},// 解锁拼图块unlockPiece(index) {if (index >= this.totalPieces || this.puzzlePieces[index].unlocked) return;this.$set(this.puzzlePieces, index, {...this.puzzlePieces[index],unlocked: true});this.animatingIndex = index;this.completedCount++;// 创建粒子效果this.createParticles();// 检查是否全部完成if (this.completedCount === this.totalPieces) {this.allCompleted = true;setTimeout(() => {this.$refs.completePopup.open();}, 1000);}// 动画结束后清除状态setTimeout(() => {this.animatingIndex = -1;}, 1000);},// 创建粒子效果createParticles() {this.particles = [];const particles = [];for (let i = 0; i < 12; i++) {particles.push({id: i,left: Math.random() * 60 + 20,top: Math.random() * 60 + 20,color: `hsl(${Math.random() * 360}, 100%, 50%)`,'--tx': Math.random() * 100,'--ty': Math.random() * 100});}this.particles = particles;setTimeout(() => {this.particles = [];}, 1000);},// 点击拼图块onPieceTap(index) {if (!this.puzzlePieces[index].unlocked) {uni.showToast({title: `完成任务${index + 1}后解锁`,icon: 'none'});}},// 模拟完成任务completeRandomTask() {const firstLockedIndex = this.puzzlePieces.findIndex(p => !p.unlocked);if (firstLockedIndex !== -1) {this.unlockPiece(firstLockedIndex);} else {uni.showToast({title: '所有拼图已解锁!',icon: 'success'});}},// 查看完整拼图viewCompletePuzzle() {this.$refs.completePopup.close();uni.navigateTo({url: '/pages/puzzle-preview/puzzle-preview'});}}
}
</script><style lang="scss" scoped>
.puzzle-container {padding: 20rpx;box-sizing: border-box;
}.puzzle-title {text-align: center;font-size: 36rpx;margin-bottom: 30rpx;color: #333;
}.puzzle-grid {display: grid;grid-template-columns: repeat(5, 1fr); /* 5列布局 */gap: 10rpx;
}.puzzle-piece {position: relative;aspect-ratio: 1; /* 保持正方形 */border-radius: 10rpx;overflow: hidden;display: flex;justify-content: center;align-items: center;background-color: #f5f5f5;&.unlocked {box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.1);}.piece-image, .lock-icon {width: 100%;height: 100%;}.lock-icon {width: 60% !important;height: 60% !important;opacity: 0.6;}.piece-number {position: absolute;bottom: 8rpx;right: 8rpx;font-size: 24rpx;color: #999;background-color: rgba(255, 255, 255, 0.7);border-radius: 50%;width: 36rpx;height: 36rpx;display: flex;justify-content: center;align-items: center;}
}/* 解锁动画 */
.unlock-animation {animation: unlockScale 0.6s ease-out;
}@keyframes unlockScale {0% { transform: scale(0.8); opacity: 0; }50% { transform: scale(1.1); }100% { transform: scale(1); opacity: 1; }
}/* 粒子效果 */
.particle-container {position: absolute;width: 100%;height: 100%;pointer-events: none;
}.particle {position: absolute;width: 10rpx;height: 10rpx;border-radius: 50%;animation: particleFly 1s ease-out forwards;
}@keyframes particleFly {to {transform: translate(calc((var(--tx, 0) - 50) * 1rpx),calc((var(--ty, 0) - 50) * 1rpx));opacity: 0;}
}/* 庆祝弹窗 */
.celebration-popup {background: white;padding: 40rpx;border-radius: 20rpx;display: flex;flex-direction: column;align-items: center;image {width: 200rpx;margin-bottom: 20rpx;}.celebration-text {font-size: 36rpx;margin-bottom: 30rpx;color: #ff6b81;font-weight: bold;}button {background: #ff6b81;color: white;border: none;}
}
</style>

相关文章:

uni-app实现完成任务解锁拼图功能

界面如下 代码如下 <template><view class"puzzle-container"><view class"puzzle-title">任务进度 {{completedCount}}/{{totalPieces}}</view><view class"puzzle-grid"><viewv-for"(piece, index) in…...

Vue3 中当组件嵌套层级较深导致 ref 无法直接获取子组件实例时,可以通过 provide/inject + 回调函数的方式实现子组件方法传递到父组件

需求&#xff1a;vue3中使用defineExposeref调用子组件方法报错不是一个function 思路&#xff1a;由于组件嵌套层级太深导致ref失效&#xff0c;通过provide/inject 回调函数来实现多层穿透 1. 父组件提供「方法注册函数」 父组件通过 provide 提供一个用于接收子组件方法…...

关于 js:3. 闭包、作用域、内存模型

一、闭包的本质&#xff1a;函数 其词法作用域环境 闭包&#xff08;Closure&#xff09;的本质可以概括为&#xff1a; 闭包是一个函数&#xff0c;以及它定义时捕获的词法作用域中的变量集合。 这意味着&#xff1a;即使外部函数已经返回或作用域结束&#xff0c;只要有内…...

数据链路层(MAC 地址)

目录 一、前言&#xff1a; 二、以太网&#xff1a; 三、MAC 地址的作用&#xff1a; 四、ARP协议&#xff1a; 一、前言&#xff1a; 数据链路层主要负责相邻两个节点之间的数据传输&#xff0c;其中&#xff0c;最常见数据链路层的协议有 以太网&#xff08;通过光纤 / 网…...

基于DQN的自动驾驶小车绕圈任务

1.任务介绍 任务来源: DQN: Deep Q Learning &#xff5c;自动驾驶入门&#xff08;&#xff1f;&#xff09; &#xff5c;算法与实现 任务原始代码: self-driving car 最终效果&#xff1a; 以下所有内容&#xff0c;都是对上面DQN代码的改进&#…...

terraform resource创建了5台阿里云ecs,如要使用terraform删除其中一台主机,如何删除?

在 Terraform 中删除阿里云 5 台 ECS 实例中的某一台&#xff0c;具体操作取决于你创建资源时使用的 多实例管理方式&#xff08;count 或 for_each&#xff09;。以下是详细解决方案&#xff1a; 方法一&#xff1a;使用 for_each&#xff08;推荐&#xff09; 如果创建时使…...

【Linux】Linux工具(1)

3.Linux工具&#xff08;1&#xff09; 文章目录 3.Linux工具&#xff08;1&#xff09;Linux 软件包管理器 yum什么是软件包关于 rzsz查看软件包——yum list命令如何安装软件如何卸载软件补充——yum如何找到要安装软件的下载地址 Linux开发工具Linux编辑器-vim使用1.vim的基…...

探索大语言模型(LLM):词袋法(Bag of Words)原理与实现

文章目录 引言一、词袋法原理1.1 核心思想1.2 实现步骤 二、数学公式2.1 词频表示2.2 TF-IDF加权&#xff08;可选&#xff09; 三、示例表格3.1 构建词汇表3.2 文本向量化&#xff08;词频&#xff09; 四、Python代码实现4.1 基础实现&#xff08;手动计算&#xff09;4.2 输…...

vue引入物理引擎matter.js

vue引入物理引擎matter.js 在 Vue 项目中集成 Matter.js 物理引擎的步骤如下: 1. 安装 Matter.js npm install matter-js # 或 yarn add matter-js2. 创建 Vue 组件 <template><div ref="physicsContainer" class="physics-container"><…...

基于 Spring Boot 瑞吉外卖系统开发(十一)

基于 Spring Boot 瑞吉外卖系统开发&#xff08;十一&#xff09; 菜品启售和停售 “批量启售”、“批量停售”、操作列的售卖状态绑定单击事件&#xff0c;触发单击事件时&#xff0c;最终携带需要修改售卖状态的菜品id以post请求方式向“/dish/status/{params.status}”发送…...

支持鸿蒙next的uts插件

*本文共四个功能函数&#xff0c;相当于四个插件。作者为了偷懒写成了一个插件&#xff0c;调对应的函数即可。 1、chooseImageHarmony函数&#xff1a;拉起相册选择图片并转为Base64 2、takePhotoAndConvertToBase64函数&#xff1a;拉起相机拍照并转为Base64 3、openBrows…...

深入理解负载均衡:传输层与应用层的原理与实战

目录 前言1. 传输层&#xff08;Layer 4&#xff09;负载均衡1.1 工作层级与核心机制1.2 实现方式详解1.3 优缺点分析1.4 典型实现工具 2. 应用层&#xff08;Layer 7&#xff09;负载均衡2.1 工作层级与核心机制2.2 实现方式解析2.3 优缺点分析2.4 常用实现工具 3. Layer 4 与…...

WPF之Slider控件详解

文章目录 1. 概述2. 基本属性2.1 值范围属性2.2 滑动步长属性2.3 刻度显示属性2.4 方向属性2.5 选择范围属性 3. 事件处理3.1 值变化事件3.2 滑块拖动事件 4. 样式和模板自定义4.1 基本样式设置4.2 控件模板自定义 5. 数据绑定5.1 绑定到ViewModel5.2 同步多个控件 6. 实际应用…...

极狐GitLab 如何将项目共享给群组?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;关于中文参考文档和资料有&#xff1a; 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 共享项目和群组 (BASIC ALL) 在极狐GitLab 16.10 中&#xff0c;更改为在成员页面的成员选项卡上显示被邀请群组成员&#xf…...

企业微信自建消息推送应用

企业微信自建应用来推送消息 前言 最近有个给特定部门推送消息的需求&#xff0c;所以配置一个应用专门用来推送消息。实现过程大致为&#xff1a;服务器生成每天的报告&#xff0c;通过调用API来发送消息。以前一直都是发邮件&#xff0c;整个邮箱里全是报告文件&#xff0c…...

【React】Hooks useReducer 详解,让状态管理更可预测、更高效

1.背景 useReducer是React提供的一个高级Hook,没有它我们也可以正常开发&#xff0c;但是useReducer可以使我们的代码具有更好的可读性&#xff0c;可维护性。 useReducer 跟 useState 一样的都是帮我们管理组件的状态的&#xff0c;但是呢与useState不同的是 useReducer 是集…...

日志之ClickHouse部署及替换ELK中的Elasticsearch

文章目录 1 ELK替换1.1 Elasticsearch vs ClickHouse1.2 环境部署1.2.1 zookeeper 集群部署1.2.2 Kafka 集群部署1.2.3 FileBeat 部署1.2.4 clickhouse 部署1.2.4.1 准备步骤1.2.4.2 添加官方存储库1.2.4.3 部署&启动&连接1.2.4.5 基本配置服务1.2.4.6 测试创建数据库和…...

亚远景-ASPICE vs ISO 21434:汽车软件开发标准的深度对比

ASPICE&#xff08;Automotive SPICE&#xff09;和ISO 21434是汽车软件开发领域的两大核心标准&#xff0c;分别聚焦于过程质量与网络安全。以下从核心目标、覆盖范围、实施重点、协同关系及行业价值五个维度进行深度对比分析&#xff1a; 一、核心目标对比 ASPICE&#xff1…...

51单片机快速成长路径

作为在嵌入式领域深耕18年的工程师&#xff0c;分享一条经过工业验证的51单片机快速成长路径&#xff0c;全程干货无注水&#xff1a; 一、突破认知误区&#xff08;新手必看&#xff09; 不要纠结于「汇编还是C」&#xff1a;现代开发90%场景用C&#xff0c;掌握指针和内存管…...

使用 NGINX 实现 HTTP Basic 认证ngx_http_auth_basic_module 模块

一、前言 在 Web 应用中&#xff0c;对部分资源进行访问控制是十分常见的需求。除了基于 IP 限制、JWT 验证、子请求校验等方式外&#xff0c;最经典也最简单的一种方式便是 HTTP Basic Authentication。NGINX 提供的 ngx_http_auth_basic_module 模块支持基于用户名和密码的基…...

解构与重构:自动化测试框架的进阶认知之旅

目录 一、自动化测试的介绍 &#xff08;一&#xff09;自动化测试的起源与发展 &#xff08;二&#xff09;自动化测试的定义与目标 &#xff08;三&#xff09;自动化测试的适用场景 二、什么是自动化测试框架 &#xff08;一&#xff09;自动化测试框架的定义 &#x…...

DockerDesktop替换方案

背景 由于DockerDesktop并非开源软件&#xff0c;如果在公司使用&#xff0c;可能就有一些限制&#xff0c;那是不是除了使用DockerDesktop外&#xff0c;就没其它办法了呢&#xff0c;现在咱们来说说替换方案。 WSL WSL是什么&#xff0c;可自行百度&#xff0c;这里引用WS…...

力扣热题100之搜索二维矩阵 II

题目 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 代码 方法一&#xff1a;直接全体遍历 这个方法很直接&#xff0c;但是居然没有超时&#xff0c…...

docker操作镜像-以mysql为例

Docker安装使用-CSDN博客 docker操作镜像-以mysql为例 当安装一个新的镜像时可以登录https://hub.docker.com/直接搜索想要安装的镜像&#xff0c;查看文档 1&#xff09;拉取镜像 docker pull mysql 或者 docker pull mysql:版本号 然后直接跳到第4&#xff09;步即可 2…...

使用OpenCV 和 Dlib 进行卷积神经网络人脸检测

文章目录 引言1.准备工作2.代码解析2.1 导入必要的库2.2 加载CNN人脸检测模型2.3 加载并预处理图像2.4 进行人脸检测2.5 绘制检测结果2.6 显示结果 3.完整代码4.性能考虑5.总结 引言 人脸检测是计算机视觉中最基础也最重要的任务之一。今天我将分享如何使用dlib库中的CNN人脸检…...

React 实现 JWT 登录验证的最小可运行示例

下面是一个用 React 实现 JWT 登录验证的最小可运行示例&#xff0c;包含&#xff1a; React 前端&#xff1a;登录、保存 Token、获取用户数据。模拟后端&#xff1a;用 mock API&#xff08;你也可以接真后端&#xff09;。 &#x1f9f1; 技术栈 React&#xff08;使用 Vi…...

Power Query精通指南1:查询结构设计、数据类型、数据导入与迁移(平面文件、Excel、Web)

文章目录 零、Power Query简介0.1 Power Query 主要功能0.2 Power Query 的优势0.3 Power Query 组件 一、Power Query数据处理基本流程1.1 前期准备1.2 提取1.3 转换1.3.1 Power Query 编辑器界面1.3.2 默认转换1.3.3 自定义转换 1.4 加载1.4.1 自动检测数据类型1.4.2 重命名查…...

vue2开发者sass预处理注意

vue2开发者sass预处理注意 sass的预处理器&#xff0c;早年使用node-sass&#xff0c;也就是vue2最初默认的编译器。 sass官方推出了dart-sass来替代。 node-sass已经停维很久了。 vue3默认使用的是dart-sass。 Uniapp的官方文档截图 从 HBuilderX 4.56 &#xff0c;vue2 …...

淘宝按图搜索商品(拍立淘)Java 爬虫实战指南

在电商领域&#xff0c;按图搜索商品功能为用户提供了更直观、便捷的购物体验。淘宝的拍立淘功能更是凭借其强大的图像识别技术&#xff0c;成为许多开发者和商家关注的焦点。本文将详细介绍如何利用 Java 爬虫技术实现淘宝按图搜索商品功能&#xff0c;包括注册账号、上传图片…...

安卓基础(封装引用)

​​情况 1&#xff1a;普通 Java 项目&#xff08;非 Android&#xff09;​​ src/ ├── com/ │ ├── example/ │ │ ├── utils/ │ │ │ └── A.java // 工具类 A │ │ └── main/ │ │ └── B.java // 主类 B ​​A…...