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

解压小游戏“动态禅意沙画“

<!DOCTYPE html>
<html>
<head>
    <title>动态禅意沙画</title>
    <style>
        body {
            margin: 0;
            height: 100vh;
            background: #2c3e50;
            overflow: hidden;
            display: flex;
            justify-content: center;
            align-items: center;
        }

        #canvas {
            width: 800px;
            height: 500px;
            background: #ecf0f1;
            border-radius: 10px;
            box-shadow: 0 0 30px rgba(0,0,0,0.3);
            position: relative;
        }

        .sand {
            position: absolute;
            pointer-events: none;
            border-radius: 50%;
            mix-blend-mode: multiply;
            animation: fade 3s forwards;
        }

        .tool {
            position: fixed;
            bottom: 30px;
            padding: 15px 30px;
            background: rgba(255,255,255,0.9);
            border-radius: 25px;
            cursor: pointer;
            transition: all 0.3s;
            font-family: Arial;
        }

        .tool:hover {
            transform: scale(1.1);
            box-shadow: 0 0 15px rgba(255,255,255,0.5);
        }

        @keyframes fade {
            0% { opacity: 1; transform: scale(1); }
            100% { opacity: 0; transform: scale(3); }
        }

        .pattern {
            position: absolute;
            width: 50px;
            height: 50px;
            background: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI1MCIgaGVpZ2h0PSI1MCI+PGNpcmNsZSBjeD0iMjUiIGN5PSIyNSIgcj0iMjAiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLXdpZHRoPSIyIi8+PC9zdmc+');
            animation: spin 20s linear infinite;
            opacity: 0.1;
        }

        @keyframes spin {
            from { transform: rotate(0deg); }
            to { transform: rotate(360deg); }
        }
    </style>
</head>
<body>
    <div id="canvas"></div>
    <div class="tool" id="clearBtn">清空画布</div>
    
    <!-- 内嵌音频 -->
    <audio id="sound" src="data:audio/wav;base64,UklGRl9vT19XQVZFZm10IBAAAAABAAEAQB8AAEAfAAABAAgAZGF0YQ..."></audio>

    <script>
        const canvas = document.getElementById('canvas');
        const colors = ['#e74c3c', '#3498db', '#2ecc71', '#f1c40f', '#9b59b6'];
        let currentColor = 0;
        let isDrawing = false;

        // 生成背景图案
        for(let i=0; i<8; i++) {
            const pattern = document.createElement('div');
            pattern.className = 'pattern';
            pattern.style.left = Math.random() * 90 + '%';
            pattern.style.top = Math.random() * 90 + '%';
            pattern.style.animationDuration = Math.random() * 10 + 10 + 's';
            canvas.appendChild(pattern);
        }

        canvas.addEventListener('mousedown', startDrawing);
        canvas.addEventListener('mousemove', draw);
        canvas.addEventListener('mouseup', stopDrawing);
        canvas.addEventListener('mouseleave', stopDrawing);

        document.getElementById('clearBtn').addEventListener('click', () => {
            canvas.querySelectorAll('.sand').forEach(s => s.remove());
        });

        function startDrawing(e) {
            isDrawing = true;
            createSand(e);
        }

        function draw(e) {
            if(!isDrawing) return;
            createSand(e);
        }

        function stopDrawing() {
            isDrawing = false;
        }

        function createSand(e) {
            const rect = canvas.getBoundingClientRect();
            const x = e.clientX - rect.left;
            const y = e.clientY - rect.top;

            for(let i=0; i<3; i++) {
                const sand = document.createElement('div');
                sand.className = 'sand';
                sand.style.left = x + 'px';
                sand.style.top = y + 'px';
                sand.style.background = colors[currentColor];
                sand.style.width = Math.random() * 15 + 5 + 'px';
                sand.style.height = sand.style.width;
                sand.style.animation = `fade ${Math.random()*2 + 1}s linear`;

                // 添加物理效果
                const angle = Math.random() * Math.PI * 2;
                const velocity = Math.random() * 10;
                sand.style.transform = `translate(${Math.cos(angle)*velocity}px, ${Math.sin(angle)*velocity}px)`;

                canvas.appendChild(sand);
                playSound();
            }

            // 颜色循环
            currentColor = (currentColor + 1) % colors.length;
        }

        function playSound() {
            const sound = document.getElementById('sound').cloneNode();
            sound.volume = Math.random() * 0.3;
            sound.play();
        }

        // 动态改变背景
        let hue = 0;
        setInterval(() => {
            hue = (hue + 0.5) % 360;
            canvas.style.background = `hsl(${hue}, 70%, 90%)`;
        }, 50);
    </script>
</body>
</html>

游戏特色和创新点:

  1. 动态沙画系统:
  • 鼠标拖动生成彩色沙粒
  • 自动渐隐效果
  • 物理扩散动画
  • 颜色自动循环变化
  1. 沉浸式体验:
  • 缓慢变化的背景色
  • 随机旋转的背景图案
  • 粒子碰撞物理效果
  • 混合叠加模式模拟真实沙画
  1. 感官反馈:
  • 内嵌的沙粒摩擦音效(模拟真实沙子声音)
  • 平滑的颜色过渡
  • 清空画布时的瞬间解压感
  1. 创新交互:
  • 按住鼠标可连续作画
  • 清空按钮提供"一键重置"的爽快感
  • 自动生成的背景动态元素
  • 随机扩散方向模拟真实沙粒洒落
  1. 技术亮点:
  • 纯CSS物理动画
  • 动态背景色变化
  • 内嵌SVG图案
  • 自包含音频资源
  • 自动内存管理(渐隐后自动移除元素)

玩法说明:

  1. 在画布区域按住鼠标拖动绘制
  2. 观察彩色沙粒的物理扩散效果
  3. 点击清空按钮重置画布
  4. 感受背景色和图案的缓慢变化
  5. 体验不同颜色叠加的混合效果

相关文章:

  • VSCode详细安装步骤,适用于 Windows/macOS/Linux 系统
  • ES 分布式搜索引擎【一】
  • Nest系列:从环境变量到工程化实践-2
  • 大模型管理工具:LLaMA-Factory
  • 深入理解C++ stl::list 底层实现+模拟实现
  • 多线程与异步任务处理(二):Kotlin协程
  • 深入解析EfficientNet:高效深度学习网络与ResNet的对比(使用keras进行代码复现,并使用cifar10数据集进行实战)
  • 小型充气泵方案:充气泵pcba结构组成
  • Chrome扩展background.js访问剪贴板指南
  • 文本处理Bert面试内容整理-BERT的预训练任务是什么?
  • VulnHub-FristiLeaks_1.3靶机-信息泄露图片base加解密+文件上传+反向shel
  • Qt命名规范制-name() or getName()
  • springboot宠物服务系统-计算机毕业设计源码29146
  • 计算机毕业设计SpringBoot+Vue.js网上服装商城(源码+文档+PPT+讲解)
  • 在 Ubuntu 系统 22.04 上安装 Docker
  • 让 LabVIEW 程序更稳定
  • Python:函数,return返回值与形参实参
  • Excel-to-JSON v2.0.0发布,可以在Excel内部,把Excel表格转换成JSON,嵌套的JSON也能转
  • 我如何从 Java 和 Python 转向 Golang 的脚本和 GUI 工具开发
  • 日历c++自增/自减操作详解
  • 建设公司网站多少钱/2024小学生时事新闻十条
  • 武汉代做企业网站/网站设计师
  • 完善网站建设的目的是/苏州百度 seo
  • 本地拖拽网站建设/公司管理培训课程大全
  • 门户做网站/seo怎么做优化方案
  • 起名网站怎么做/自动点击竞价广告软件