iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >使用canvas怎么实现一个扭蛋机动画效果
  • 840
分享到

使用canvas怎么实现一个扭蛋机动画效果

2023-06-09 13:06:07 840人浏览 独家记忆
摘要

使用canvas怎么实现一个扭蛋机动画效果?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。布局扭蛋机的布局比较简单,只需要在基础背景上添加一些元素就可以,最主要的是canvas标

使用canvas怎么实现一个扭蛋机动画效果?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

布局

扭蛋机的布局比较简单,只需要在基础背景上添加一些元素就可以,最主要的是canvas标签,其他都无所谓:

<div class="bg">    <span id="message">点击抽奖</span>    <div class="lotterybg">        <canvas id="myCanvas" width="285px" height="170px"></canvas>        <img src="img/lighting.png" class="lighting"/>    </div></div><img src="img/start-btn.png" id="start" onclick="play()"/><div class="award"><span id="awardBall"></span></div><img src="img/1.png" id="ball1" class="imgSrc"><img src="img/2.png" id="ball2" class="imgSrc"><img src="img/3.png" id="ball3" class="imgSrc"><img src="img/4.png" id="ball4" class="imgSrc">

附上样式表:

body {margin: 0;padding: 0;border: none;}.bg {background: url(../img/bg.png) top no-repeat;background-size: 100%;overflow: hidden;position: absolute;width: 400px;height: 100%;margin-top: 0;margin-left: 50%;-WEBkit-transfORM: translate(-50%);-moz-transform: translate(-50%);-ms-transform: translate(-50%);-o-transform: translate(-50%);transform: translate(-50%);}#message {position: absolute;text-align: center;height: 25px;font-size: 22px;margin-top: 110px;margin-left: 50%;-webkit-transform: translate(-50%);-moz-transform: translate(-50%);-ms-transform: translate(-50%);-o-transform: translate(-50%);transform: translate(-50%);}.lotterybg {background: url(../img/lotterybg.png) top no-repeat;background-size: 100%;overflow: visible;width: 80%;height: 100%;margin-top: 160px;margin-left: 50%;-webkit-transform: translate(-50%);-moz-transform: translate(-50%);-ms-transform: translate(-50%);-o-transform: translate(-50%);transform: translate(-50%);}#myCanvas {position: absolute;border: none;width: 285px;height: 170px;margin-top: 15px;margin-left: 50%;-webkit-transform: translate(-50%);-moz-transform: translate(-50%);-ms-transform: translate(-50%);-o-transform: translate(-50%);transform: translate(-50%);}.lighting {display: block;max-width: 99%;margin-top: 0;margin-left: 0;}#start {position: absolute;z-index: 3;width: 202px;margin-top: 413px;margin-left: 50%;-webkit-transform: translate(-50%);-moz-transform: translate(-50%);-ms-transform: translate(-50%);-o-transform: translate(-50%);transform: translate(-50%);}.imgSrc {display: none;position: absolute;}.award {position: absolute;border: none;width: 60px;height: 200px;top: 470px;margin-left: 50%;-webkit-transform: translate(-50%);-moz-transform: translate(-50%);-ms-transform: translate(-50%);-o-transform: translate(-50%);transform: translate(-50%);}

这样子布局就算完成了,接下来主要工作就在canvas绘制图像上了。

扭蛋动画

先把各种变量定义好:

var canvas = document.getElementById('myCanvas');var ctx = canvas.getContext('2d');var ball1 = document.getElementById('ball1');//图片对象var ball2 = document.getElementById('ball2');//图片对象var ball3 = document.getElementById('ball3');//图片对象var ball4 = document.getElementById('ball4');//图片对象var ballList = [ball1, ball2, ball3, ball4];//图片对象数组var ballNum = 4;//扭蛋机里面的小球数var awardList = [];//扭蛋机中的小球集合var timer;//计时器var award = document.getElementById('awardBall');var message = document.getElementById('message');

扭蛋对象

扭蛋机里面每个扭蛋都是一个对象,所以需要定义一个扭蛋对象:

function Ball(index, img) {    this.r = 30;//小球半径    this.x = this.rand(canvas.width - this.r * 2);//小球初始横坐标    this.y = this.rand(canvas.height - this.r * 2);//小球初始纵坐标    this.color = index;//小球颜色,以下标表示    this.img = img;//小球素材    do {        this.speedX = this.rand(20) - 10;    } while (this.speedX < 5);//小球横坐标改变速度    do {        this.speedY = this.rand(20) - 10;    } while (this.speedY < 5);//小球纵坐标改变速度}

传入扭蛋对象的值index为小球的颜色,用数字1~4表示,img是图片对象,用来绘制扭蛋。

扭蛋方法

在上一步已经为扭蛋添加了属性,接下来就是给扭蛋添加方法:

Ball.prototype = {    rand: function (num) {//随机数        return Math.random() * num;    },    run: function () {//小球运动函数        this.x += this.speedX;        this.y += this.speedY;        if (this.x > canvas.width - this.r * 2) {//小球碰到右边界,横坐标速度变为负            this.speedX = -this.speedX;        }        if (this.x < 0) {//小球碰到左边界,横坐标速度变为正            this.speedX = Math.abs(this.speedX);        }        if (this.y > canvas.height - this.r * 2) {//小球碰到下边界,纵坐标速度变为负            this.speedY = -this.speedY;        }        if (this.y < 0) {//小球碰到上边界,纵坐标速度变为正            this.speedY = Math.abs(this.speedY);        }        ctx.drawImage(this.img, this.x, this.y, 60, 60);//绘制小球    }}

主要是为扭蛋对象的原型添加上运动函数,运动函数的作用就是让扭蛋根据其速度动起来,并且在接触到边界的时候反弹。

初始化

接下来就是把扭蛋们放在扭蛋机里面:

function init() {//初始化    for (let i = 0; i < ballNum; i++) {//随机生成各色小球        let index = Math.floor(4 * Math.random());        awardList[i] = new Ball(index, ballList[index]);//新建小球对象    }    window.clearInterval(timer);//清除计时器    timer = setInterval(function () {        ctx.clearRect(0, 0, canvas.width, canvas.height);//清空画布        for (let i = 0; i < awardList.length; i++) {            awardList[i].run();        }//使小球运动    }, 15);}

这样子扭蛋机里面就已经有了小球。

开始扭蛋

开始扭蛋主要经历的过程就是点击按钮,扭蛋机扭蛋减少,获得相应扭蛋,中奖显示:

function play() {    if (awardList.length === 0) {//奖池中没有小球        alert('重新开始!');        init();        message.innerText = '点击抽奖';    } else {        window.clearInterval(timer);//清除计时器        let r = awardList.pop();//将奖池中的小球减少        timer = setInterval(function () {            ctx.clearRect(0, 0, canvas.width, canvas.height);//清空画布            for (let i = 0; i < awardList.length; i++) {                awardList[i].run();            }//使小球运动        }, 15);        switch (r.color) {//小球掉落动画            case 0:                award.setAttribute('class', 'dropBall1');                break;            case 1:                award.setAttribute('class', 'dropBall2');                break;            case 2:                award.setAttribute('class', 'dropBall3');                break;            case 3:                award.setAttribute('class', 'dropBall4');                break;        }        setTimeout(function () {//扭蛋成功提示            award.setAttribute('class', '');            switch (r.color) {                case 0:                    message.innerText = '紫球!';                    break;                case 1:                    message.innerText = '绿球!';                    break;                case 2:                    message.innerText = '黄球!';                    break;                case 3:                    message.innerText = '红球!';                    break;            }        }, 1100);    }}

在这里扭蛋的掉落动画使用CSS动画的关键帧来完成:

.dropBall1 {content: "";position: absolute;left: 0;top: 0;width: 60px;height: 60px;display: block;background: url(../img/1.png) no-repeat;background-size: contain;animation: drop 1s ease-out forwards;-webkit-animation: drop 1s ease-out forwards;}.dropBall2 {content: "";position: absolute;left: 0;top: 0;width: 60px;height: 60px;display: block;background: url(../img/2.png) no-repeat;background-size: contain;animation: drop 1s ease-out forwards;-webkit-animation: drop 1s ease-out forwards;}.dropBall3 {content: "";position: absolute;left: 0;top: 0;width: 60px;height: 60px;display: block;background: url(../img/3.png) no-repeat;background-size: contain;animation: drop 1s ease-out forwards;-webkit-animation: drop 1s ease-out forwards;}.dropBall4 {content: "";position: absolute;left: 0;top: 0;width: 60px;height: 60px;display: block;background: url(../img/4.png) no-repeat;background-size: contain;animation: drop 1s ease-out forwards;-webkit-animation: drop 1s ease-out forwards;}@keyframes drop {    0% {        transform: scale(0.7);    }    50% {        transform: scale(1);    }    51% {        transform: translateY(0px);    }    100% {        transform: translateY(100px);    }}@-webkit-keyframes drop {    0% {        -webkit-transform: scale(0.7);    }    50% {        -webkit-transform: scale(1);    }    51% {        -webkit-transform: translateY(0px);    }    100% {        -webkit-transform: translateY(100px);    }}

结束

当然,需要最后加上init();来让扭蛋机跑起来,到这里,这个简单的扭蛋机就算完成了,效果预览

总结

虽然这个Demo比较简单,但是还是有一些注意点和一些可优化的地方。

注意点

img对象

html中的这些img标签:

<img src="img/1.png" id="ball1" class="imgSrc"><img src="img/2.png" id="ball2" class="imgSrc"><img src="img/3.png" id="ball3" class="imgSrc"><img src="img/4.png" id="ball4" class="imgSrc">

样式也写成display: none;,这样写是为了在js中获取img对象,当然也可以不在html中写这些img标签,直接在js文件中写:

var img = new Image(); img.src = 'img/1.png';

看完上述内容,你们掌握使用canvas怎么实现一个扭蛋机动画效果的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网精选频道,感谢各位的阅读!

--结束END--

本文标题: 使用canvas怎么实现一个扭蛋机动画效果

本文链接: https://www.lsjlt.com/news/256190.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++ 生态系统中流行库和框架的贡献指南
    作为 c++++ 开发人员,通过遵循以下步骤即可为流行库和框架做出贡献:选择一个项目并熟悉其代码库。在 issue 跟踪器中寻找适合初学者的问题。创建一个新分支,实现修复并添加测试。提交...
    99+
    2024-05-15
    框架 c++ 流行库 git
  • C++ 生态系统中流行库和框架的社区支持情况
    c++++生态系统中流行库和框架的社区支持情况:boost:活跃的社区提供广泛的文档、教程和讨论区,确保持续的维护和更新。qt:庞大的社区提供丰富的文档、示例和论坛,积极参与开发和维护。...
    99+
    2024-05-15
    生态系统 社区支持 c++ overflow 标准库
  • c++中if elseif使用规则
    c++ 中 if-else if 语句的使用规则为:语法:if (条件1) { // 执行代码块 1} else if (条件 2) { // 执行代码块 2}// ...else ...
    99+
    2024-05-15
    c++
  • c++中的继承怎么写
    继承是一种允许类从现有类派生并访问其成员的强大机制。在 c++ 中,继承类型包括:单继承:一个子类从一个基类继承。多继承:一个子类从多个基类继承。层次继承:多个子类从同一个基类继承。多层...
    99+
    2024-05-15
    c++
  • c++中如何使用类和对象掌握目标
    在 c++ 中创建类和对象:使用 class 关键字定义类,包含数据成员和方法。使用对象名称和类名称创建对象。访问权限包括:公有、受保护和私有。数据成员是类的变量,每个对象拥有自己的副本...
    99+
    2024-05-15
    c++
  • c++中优先级是什么意思
    c++ 中的优先级规则:优先级高的操作符先执行,相同优先级的从左到右执行,括号可改变执行顺序。操作符优先级表包含从最高到最低的优先级列表,其中赋值运算符具有最低优先级。通过了解优先级,可...
    99+
    2024-05-15
    c++
  • c++中a+是什么意思
    c++ 中的 a+ 运算符表示自增运算符,用于将变量递增 1 并将结果存储在同一变量中。语法为 a++,用法包括循环和计数器。它可与后置递增运算符 ++a 交换使用,后者在表达式求值后递...
    99+
    2024-05-15
    c++
  • c++中a.b什么意思
    c++kquote>“a.b”表示对象“a”的成员“b”,用于访问对象成员,可用“对象名.成员名”的语法。它还可以用于访问嵌套成员,如“对象名.嵌套成员名.成员名”的语法。 c++...
    99+
    2024-05-15
    c++
  • C++ 并发编程库的优缺点
    c++++ 提供了多种并发编程库,满足不同场景下的需求。线程库 (std::thread) 易于使用但开销大;异步库 (std::async) 可异步执行任务,但 api 复杂;协程库 ...
    99+
    2024-05-15
    c++ 并发编程
  • 如何在 Golang 中备份数据库?
    在 golang 中备份数据库对于保护数据至关重要。可以使用标准库中的 database/sql 包,或第三方包如 github.com/go-sql-driver/mysql。具体步骤...
    99+
    2024-05-15
    golang 数据库备份 mysql git 标准库
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作