花潮论坛

搜索
热搜: 活动 交友 discuz
查看: 57|回复: 14

canvas画布上模拟缓动

[复制链接]
  • TA的每日心情
    慵懒
    2025-12-14 13:47
  • 签到天数: 1669 天

    [LV.Master]伴坛终老

    3048

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

    发表于 2022-8-24 21:06 | 显示全部楼层 |阅读模式

    请马上登录,朋友们都在花潮里等着你哦:)

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x
    本帖最后由 马黑黑 于 2022-8-24 21:08 编辑

    缓动就是加速度的反例。由于阻力的作用,一个物体在获得第一推动力之后,如果不再有动力,则它的行进过程属于一种缓动过程,其运动亦称减速度运动,直至停下。

    我们可以在画布上模拟这一过程。为了简便,我们只设置一个方向的运动,让小球从左边运动到右边,运动过程中不断减速,最后停下。

    我们先准备一下一个画布、一个按钮,画布的作用不必多说,按钮是用来给小球下运动指令的。CSS和HTML代码如下:

    css:

    <style>
            #canv { margin: auto; display: block; border: 1px solid; }
            #btn { margin: 10px auto; display: block; }
    </style>

    html:

    <canvas id="canv"></canvas>
    <button id="btn">Go</button>


    下面进入JS部分。先大体说一下思路:小球前进当中,距离目的地越来越近,我们就用剩下的路程乘以一个缓动系数,所得乘积累加到小球的X坐标中。缓动系数一般极小,它是一个固定不变的浮点数值,比如可以是 0.05 或其他的数值,由于小球当前剩余的路程越来越短,路程乘以缓动系数所得的累加给小球X坐标的值也越来越小,从而速度变得越来越缓慢。下面进入具体实现环节:

    首先,声明相关变量:

    let ctx = canv.getContext("2d"), //画笔
            w = canv.width = 740, //定义画布宽度并获取其值
            h = canv.height = 200, //定义画布高度并获取其值
            ball = { x: 20, y: 100, r: 10, easing: 0.01, color: 'red' }, //创建一个 ball 实体对象
            targetX = w - ball.r; // 设定小球的目的地


    ball 对象我们写在了一行(为了简洁),可能不便理解,下面将其拆解瞧瞧:

    ball = {
            x: 10, //X坐标
            y: 100, //Y坐标
            r: 10, //半径
            easing: 0.01, //缓动系数
            color: 'red', //小球颜色
    }

    下来,我们给 ball 实体对象添加一个绘制圆形的函数,非常简单:

    ball.draw = function () {
            ctx.beginPath(); //画笔开启路径
            ctx.arc(this.x, this.y, this.r, 0, Math.PI*2); //按自身尺寸绘制圆
            ctx.fillStyle = this.color; //用自身颜色赋值给画笔
            ctx.fill(); //填色
    }


    ball 实体对象的东东处理到这,接下来,定义一个函数,用于改变小球的X坐标,实现减速度运动;同时,函数中还处理一下按钮的可用和禁用状态:

    function update() {
            ctx.clearRect(0, 0, w, h); //清空画布
            ball.x += (targetX - ball.x) * ball.easing; //X坐标缓动增速
            ball.draw(); //每次更新都重新绘制小球
            if(ball.x + ball.r < targetX) { //如果小球X坐标+半径小于目标位置
                    requestAnimationFrame(update); //则调用定时器运行本函数
                    btn.disabled = true; //此时按钮不可用
            } else { //否则,如果小球X坐标+半径如果大于等于目的地
                    btn.disabled = false; //按钮禁用状态解除
            }
    }


    关于缓动增速,前面已做铺垫,这里不再重复解释。其他的语句,注释自身基本都讲清楚了。

    按钮点击事件也得有:

    btn.onclick = function() {
            ball.x = 20; //恢复小球X坐标
            ball.y = 100;  //恢复小球Y坐标
            update(); //运行小球状态更新函数
    }


    最后,我们还得运行一次 ball.draw 函数,下面函数可以放在JS所有代码的最后,也可以放在 ball 对象及方法已被完全声明过的代码区域的后面:

    ball.draw();

    效果演示和完整代码将附后。

    评分

    参与人数 1威望 +50 金钱 +100 经验 +50 收起 理由
    红影 + 50 + 100 + 50 赞一个!

    查看全部评分

  • TA的每日心情
    慵懒
    2025-12-14 13:47
  • 签到天数: 1669 天

    [LV.Master]伴坛终老

    3048

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2022-8-24 21:07 | 显示全部楼层
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-14 13:47
  • 签到天数: 1669 天

    [LV.Master]伴坛终老

    3048

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2022-8-24 21:09 | 显示全部楼层
    附:二楼完整代码
    1. <style>
    2.         #canv { margin: auto; display: block; border: 1px solid; }
    3.         #btn { margin: 10px auto; display: block; }
    4. </style>

    5. <canvas id="canv"></canvas>
    6. <button id="btn">Go</button>

    7. <script>

    8. let ctx = canv.getContext("2d"),
    9.         w = canv.width = 740,
    10.         h = canv.height = 200,
    11.         ball = { x: 20, y: 100, r: 10, easing: 0.01, color: 'red' },
    12.         targetX = w - ball.r;

    13. ball.draw = function () {
    14.         ctx.beginPath();
    15.         ctx.arc(this.x, this.y, this.r, 0, Math.PI*2);
    16.         ctx.fillStyle = this.color;
    17.         ctx.fill();
    18. }

    19. ball.draw();

    20. btn.onclick = function() {
    21.         ball.x = 10;
    22.         ball.y = 100;
    23.         update();
    24. }

    25. function update() {
    26.         ctx.clearRect(0, 0, w, h);
    27.         ball.x += (targetX - ball.x) * ball.easing;
    28.         ball.draw();
    29.         if(ball.x + ball.r < targetX) {
    30.                 requestAnimationFrame(update);
    31.                 btn.disabled = true;
    32.         } else {
    33.                 btn.disabled = false;
    34.         }
    35. }

    36. </script>
    复制代码


    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-1 20:32
  • 签到天数: 1052 天

    [LV.10]以坛为家III

    1881

    主题

    32万

    回帖

    37万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

    发表于 2022-8-24 21:17 | 显示全部楼层
    原来创建小球实体的语句里有那么多内容。点了一下,缓动效果十分明显。
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-14 13:47
  • 签到天数: 1669 天

    [LV.Master]伴坛终老

    3048

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2022-8-24 22:03 | 显示全部楼层
    红影 发表于 2022-8-24 21:17
    原来创建小球实体的语句里有那么多内容。点了一下,缓动效果十分明显。

    直接这样创建实体对象,它的属性和方法是可以不按顺序的,方便。不过这样的对象是个案的,不方便扩展。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-1 20:32
  • 签到天数: 1052 天

    [LV.10]以坛为家III

    1881

    主题

    32万

    回帖

    37万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

    发表于 2022-8-25 09:19 | 显示全部楼层
    马黑黑 发表于 2022-8-24 22:03
    直接这样创建实体对象,它的属性和方法是可以不按顺序的,方便。不过这样的对象是个案的,不方便扩展。

    能适合一个个个案也很不错呀
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-14 13:47
  • 签到天数: 1669 天

    [LV.Master]伴坛终老

    3048

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2022-8-25 12:25 | 显示全部楼层
    红影 发表于 2022-8-25 09:19
    能适合一个个个案也很不错呀

    这不是最科学的方法。关于创建对象,我喜欢用原形法。我一直没介绍的还有工厂模式。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-1 20:32
  • 签到天数: 1052 天

    [LV.10]以坛为家III

    1881

    主题

    32万

    回帖

    37万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

    发表于 2022-8-25 16:17 | 显示全部楼层
    马黑黑 发表于 2022-8-25 12:25
    这不是最科学的方法。关于创建对象,我喜欢用原形法。我一直没介绍的还有工厂模式。

    工厂模式就跟装配式差不多的吧?
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-14 13:47
  • 签到天数: 1669 天

    [LV.Master]伴坛终老

    3048

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2022-8-25 18:51 | 显示全部楼层
    红影 发表于 2022-8-25 16:17
    工厂模式就跟装配式差不多的吧?

    所以才叫工厂模式
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-1 20:32
  • 签到天数: 1052 天

    [LV.10]以坛为家III

    1881

    主题

    32万

    回帖

    37万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

    发表于 2022-8-25 19:01 | 显示全部楼层
    马黑黑 发表于 2022-8-25 18:51
    所以才叫工厂模式

    这倒是方便。
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-14 13:47
  • 签到天数: 1669 天

    [LV.Master]伴坛终老

    3048

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2022-8-25 19:02 | 显示全部楼层

    也有缺陷。这里不说这个。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-1 20:32
  • 签到天数: 1052 天

    [LV.10]以坛为家III

    1881

    主题

    32万

    回帖

    37万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

    发表于 2022-8-25 19:11 | 显示全部楼层
    马黑黑 发表于 2022-8-25 19:02
    也有缺陷。这里不说这个。

    是适应性方面的缺陷么?
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-14 13:47
  • 签到天数: 1669 天

    [LV.Master]伴坛终老

    3048

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2022-8-25 19:12 | 显示全部楼层
    红影 发表于 2022-8-25 19:11
    是适应性方面的缺陷么?

    不说这个了,我们暂时不用它。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-1 20:32
  • 签到天数: 1052 天

    [LV.10]以坛为家III

    1881

    主题

    32万

    回帖

    37万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

    发表于 2022-8-25 19:17 | 显示全部楼层
    马黑黑 发表于 2022-8-25 19:12
    不说这个了,我们暂时不用它。

    好的。
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-14 13:47
  • 签到天数: 1669 天

    [LV.Master]伴坛终老

    3048

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2022-8-25 19:23 | 显示全部楼层
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    小黑屋|手机版|Archiver|服务支持:DZ动力|huachaowang.com Inc. ( 蜀ICP备17032287号-1 )

    GMT+8, 2025-12-15 06:31 , Processed in 0.079764 second(s), 28 queries .

    Powered by Discuz! X3.4

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表