首页 > 其他分享 >canvas根据鼠标点击平滑移动案例

canvas根据鼠标点击平滑移动案例

时间:2024-12-06 20:28:54浏览次数:5  
标签:动画 canvas const 鼠标 平滑 点击 坐标 circle Math

1. 圆形绘制

在画布中心绘制一个圆形,并初始化圆形的坐标和半径。

2. 鼠标点击事件

为 Canvas 添加鼠标点击事件,记录点击的目标坐标。

3. 移动逻辑

  • 使用 Math.atan2 计算从圆心到点击位置的角度。
  • 通过三角函数(Math.cosMath.sin)逐帧更新圆的坐标,使其沿直线平滑移动。

4. 动画控制

  • 利用 requestAnimationFrame 实现动画。
  • 检测圆心与目标点之间的距离,若小于一定阈值,则停止动画。

代码实现

<canvas id="myCanvas" width="600" height="400" style="border:1px solid #000;"></canvas>
<script>
    const canvas = document.getElementById("myCanvas");
    const ctx = canvas.getContext("2d");

    // 初始化画布中心坐标
    const canvasWidth = canvas.width;
    const canvasHeight = canvas.height;

    // 圆的初始属性
    let circle = {
        x: canvasWidth / 2, // 圆心初始 x 坐标
        y: canvasHeight / 2, // 圆心初始 y 坐标
        radius: 20, // 圆的半径
        color: "blue", // 圆的颜色
        speed: 3, // 移动速度
        moving: false, // 是否正在移动
        targetX: null, // 目标点 x 坐标
        targetY: null // 目标点 y 坐标
    };

    // 绘制圆形
    function drawCircle() {
        ctx.clearRect(0, 0, canvasWidth, canvasHeight); // 清除画布
        ctx.beginPath();
        ctx.arc(circle.x, circle.y, circle.radius, 0, 2 * Math.PI);
        ctx.fillStyle = circle.color;
        ctx.fill();
    }

    // 计算圆的下一步位置
    function moveCircle() {
        if (!circle.moving) return;

        // 计算与目标点的距离
        const dx = circle.targetX - circle.x;
        const dy = circle.targetY - circle.y;
        const distance = Math.sqrt(dx * dx + dy * dy);

        // 如果距离小于速度,直接停止到目标点
        if (distance < circle.speed) {
            circle.x = circle.targetX;
            circle.y = circle.targetY;
            circle.moving = false;
            return;
        }

        // 计算移动角度
        const angle = Math.atan2(dy, dx);

        // 根据角度计算 x 和 y 方向的位移
        circle.x += circle.speed * Math.cos(angle);
        circle.y += circle.speed * Math.sin(angle);
    }

    // 动画循环
    function animate() {
        moveCircle();
        drawCircle();
        requestAnimationFrame(animate);
    }

    // 添加鼠标点击事件
    canvas.addEventListener("click", (event) => {
        // 获取鼠标点击坐标
        const rect = canvas.getBoundingClientRect(); // 获取画布位置
        const mouseX = event.clientX - rect.left;
        const mouseY = event.clientY - rect.top;

        // 设置目标点为点击位置,并开启移动
        circle.targetX = mouseX;
        circle.targetY = mouseY;
        circle.moving = true;
    });

    // 初始绘制并启动动画
    drawCircle();
    animate();
</script>

代码结构

1. 数据结构

circle 对象包含了圆形的所有关键属性:

  • 坐标: x, y
  • 目标位置: targetX, targetY
  • 状态: moving 用于控制动画。
  • 运动参数: speed 表示圆移动的速度。

2. 逻辑说明

2.1 鼠标点击事件
  • 点击时获取鼠标相对于 Canvas 的坐标。
  • 设置目标点为鼠标点击的坐标,并将 moving 设置为 true
2.2 角度计算
  • 使用 Math.atan2(dy, dx) 计算圆心与目标点之间的角度。
  • 用三角函数计算 x 和 y 的增量,保证圆沿直线方向移动。
2.3 动画更新
  • 动画由 requestAnimationFrame 驱动,每帧更新圆的坐标并重新绘制。
  • 当圆接近目标点时,停止动画。

动画效果特点

  1. 平滑移动

    • 使用逐帧更新,确保圆在屏幕上平滑移动。
    • 利用 Math.atan2 保证了移动方向的准确性。
  2. 自然停止

    • 距离判断 if (distance < circle.speed),当圆心与目标点的距离小于速度时,停止动画。
  3. 实时交互

    • 鼠标点击触发事件,更新目标点位置,随时重新移动圆形。

标签:动画,canvas,const,鼠标,平滑,点击,坐标,circle,Math
From: https://blog.csdn.net/lixin5456985/article/details/144295066

相关文章

  • 鼠标键盘游戏手柄的测试代码
    #include"QtWidgetsApplication2.h"#include<windows.h>#include<QDebug>#include<QVBoxLayout>QtWidgetsApplication2::QtWidgetsApplication2(QWidget*parent):QFrame(parent){ui.setupUi(this); //init();}QtWidget......
  • HS6621Cx 一款低功耗蓝牙SoC芯片应用于键盘、鼠标和遥控器消费
    HS6621Cx是一款功耗优化的真正片上系统(SOC)解决方案,适用于低功耗蓝牙和专有2.4GHz应用。它集成了高性能、低功耗射频收发器,具有蓝牙基带和丰富的外设IO扩展。HS6621Cx还集成了电源管理功能,可提供高效的电源管理。它面向2.4GHz蓝牙低功耗系统、专有2.4GHz系统、人机接口设备(键盘......
  • 如何使用css实现鼠标跟随?
    在CSS中,无法直接实现真正的鼠标跟随效果。CSS主要用于样式和布局,而鼠标跟随需要JavaScript来处理鼠标事件和元素定位。以下是结合CSS和JavaScript实现鼠标跟随效果的几种常见方法:1.使用JavaScript和position:absolute;这是最常用的方法。JavaScript监听鼠标移动......
  • 使用canvas制作一个印章
    <!DOCTYPEhtml><html><head><title>Canvas印章</title><style>body{font-family:sans-serif;}#canvas{border:1pxsolid#ccc;}</style></head><body><h1>Canvas印章</h1><can......
  • 请使用css3实现图片的平滑转换
    可以使用CSS3的transition属性来实现图片的平滑过渡效果。以下是一些常见的应用场景和示例代码:1.鼠标悬停时放大图片:<imgsrc="image.jpg"alt="MyImage">img{width:200px;height:150px;transition:transform0.3sease;/*定义过渡效果*/}img:hover......
  • 前端资源发布路径怎么实现非覆盖式发布(平滑升级)?
    前端资源发布路径实现非覆盖式发布(平滑升级)是为了避免用户在升级过程中访问到旧的资源或者出现资源加载错误,保证用户体验的流畅性。常用的方法主要有以下几种:1.基于文件名的版本控制(Hashing)这是最常用的方法,也是推荐的方法。每次构建项目时,使用工具(例如Webpack、Rollup等)根......
  • 如何使用html5实现雪花效果?通过canvas实现雪花飘动效果案例分享!
    不知道各位小伙伴们是否有见过雪花,没有见到过的小伙伴们今天小编就来和大家讲讲有关于:“如何使用html5实现雪花效果?”这个问题的相关内容分享!一、canvas是什么?HTML5<canvas>元素用于图形的绘制,通过脚本(通常是JavaScript)来完成.<canvas>标签只是图形容器,您必须使用脚......
  • 揭秘UGO SQL审核功能4大特性,让业务平滑迁移至GaussDB
    业务挑战数据库是企业应用系统的核心,SQL作为数据库查询、更新等操作的标准语言,重要性不言而喻。然而在实际的SQL开发过程中,也面临着诸多挑战:数据库应用开发人员的SQL能力良莠不齐,经常写出不符合标准、执行性能差的SQL,当这些风险SQL流入生产环境,必然会对应用系统造成极大影响。......
  • html2canvas 解决某些站点截图空白问题
    业务场景介绍  点击浏览器右上角已安装的chrome插件图标,这个时候会出现一个界面,我们称这个界面为popup,界面上有个"从页面获取产品信息"按钮,单机它会对当前标签页面内容进行截图,最后将截图的图片转成base64发送至xx接口部分核心代码解读:截取当前可视区域的图片,为了能够截图......
  • 写一个方法,实现使用canvas播放视频?
    functionplayVideoOnCanvas(videoUrl,canvasId){constcanvas=document.getElementById(canvasId);constctx=canvas.getContext('2d');constvideo=document.createElement('video');video.src=videoUrl;video.crossOrigin=......