亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁 > 知識庫 > canvas實現扭蛋機動畫效果的示例代碼

canvas實現扭蛋機動畫效果的示例代碼

熱門標簽:地圖標注軟件打印出來 智能電銷機器人被禁用了么 黃石ai電銷機器人呼叫中心 高德地圖標注商戶怎么標 ok電銷機器人 電話機器人技術 惡搞電話機器人 如何查看地圖標注 欣鼎電銷機器人 效果

轉眼間,已經實習了兩個月了,公司每個月都有個會員日的活動要做,這個月的任務是做一個扭蛋機抽獎的活動,數據什么的都有接口,那么前端剩下最大的任務就只剩下扭蛋機的動畫實現了。

背景

本來興高采烈地從網上找了一個扭蛋機動畫,但是發現它是直接用css動畫,把扭蛋們的動畫寫死了,這樣我不是很喜歡,于是還是選擇用canvas繪制扭蛋的隨機動畫。先寫了個簡單的扭蛋機Demo,效果預覽

開始

布局

扭蛋機的布局比較簡單,只需要在基礎背景上添加一些元素就可以,最主要的是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'; 

這樣子也可以得到img對象,也可以用來繪制扭蛋。

清除計時器

代碼中清除計時器都是在調用計時器之前,之所以這樣做的目的,是因為不清除計時器,計時器會一直計時,導致動畫越來越鬼畜。

畫布

在canvas畫布上繪制可能會出現圖像不清晰、放大的情況,這種情況可以通過將canvas標簽的width和height屬性設置成和樣式的width和height屬性相同來解決。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

標簽:赤峰 中山 阿壩 綏化 盤錦 聊城 金昌 萍鄉

巨人網絡通訊聲明:本文標題《canvas實現扭蛋機動畫效果的示例代碼》,本文關鍵詞  canvas,實現,扭蛋機,動畫,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《canvas實現扭蛋機動畫效果的示例代碼》相關的同類信息!
  • 本頁收集關于canvas實現扭蛋機動畫效果的示例代碼的相關信息資訊供網民參考!
  • 推薦文章
    日韩中文字幕在线亚洲一区| 四虎久久影院| 精品国产一区二区三区国产馆| 午夜激情视频在线播放| 亚洲第一色在线| 成人a大片在线观看| 高清一级片| 日韩字幕在线| 日本伦理网站| 国产一区二区精品在线观看| 日韩中文字幕在线播放| 久草免费在线视频| 国产极品白嫩美女在线观看看| 可以免费看污视频的网站| 欧美激情在线精品video| 国产视频久久久| 久久精品欧美一区二区| 青青久久精品| 国产麻豆精品视频| 天堂网中文在线| 99久久精品国产高清一区二区| 国产成a人片在线观看视频 | 九九干| 99久久精品国产国产毛片| 天堂网中文在线| 日韩中文字幕一区| 久草免费资源| 香蕉视频久久| 99色视频| 九九精品在线播放| 99久久精品国产麻豆| 九九国产| 91麻豆精品国产自产在线观看一区 | 国产精品自拍在线| 国产伦精品一区三区视频| 黄色免费三级| 精品视频在线观看一区二区| 成人高清视频在线观看| 欧美另类videosbestsex视频 | 99色视频| 色综合久久手机在线| 日本在线www| 欧美a级片视频| 欧美爱爱动态| 日韩免费在线| 国产成人女人在线视频观看| 日本特黄一级| 91麻豆精品国产自产在线| 欧美国产日韩久久久| 免费一级生活片| 欧美国产日韩精品| 日本在线www| 国产不卡精品一区二区三区| 中文字幕一区二区三区精彩视频| 91麻豆国产| 国产麻豆精品视频| 四虎久久影院| 国产成a人片在线观看视频 | 色综合久久久久综合体桃花网| 一级女性全黄生活片免费| 久久国产精品自由自在| 日韩欧美一二三区| 久久久久久久网| 美国一区二区三区| 日韩中文字幕一区| 国产伦理精品| 成人在免费观看视频国产| 高清一级毛片一本到免费观看| 高清一级淫片a级中文字幕| 一级女性全黄生活片免费| 精品视频一区二区| 久久久久久久免费视频| 免费毛片播放| 精品国产一区二区三区久久久狼| 日韩一级精品视频在线观看| 日韩综合| 精品国产一区二区三区久久久狼| 日韩中文字幕一区| 欧美激情伊人| 可以免费看污视频的网站| 二级片在线观看| 欧美大片一区| 青青青草影院| 可以免费看污视频的网站| 天天色成人| 韩国毛片 免费| 天堂网中文在线| 精品视频在线看 | 天天做日日爱夜夜爽| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 国产韩国精品一区二区三区| 青青久热| 国产麻豆精品免费密入口| 精品在线观看国产| 精品国产一区二区三区久| 成人a大片在线观看| 色综合久久天天综合| 精品国产一级毛片| 国产一区二区精品久| 国产网站免费视频| 一 级 黄 中国色 片| 四虎影视精品永久免费网站| 国产成人精品一区二区视频| 国产亚洲精品aaa大片| 99久久精品国产麻豆| 91麻豆爱豆果冻天美星空| 中文字幕97| 久久99青青久久99久久| 成人免费网站视频ww| a级毛片免费观看网站| 欧美激情伊人| 欧美激情在线精品video| 一本伊大人香蕉高清在线观看| 国产伦精品一区二区三区无广告| 久草免费在线观看| 国产高清在线精品一区二区| 在线观看导航| 国产一区二区福利久久| 四虎久久精品国产| 欧美国产日韩在线| 欧美一区二区三区性| 成人免费观看的视频黄页| 精品国产一区二区三区久久久狼| 亚洲第一视频在线播放| 日韩av片免费播放| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 成人免费高清视频| 日韩中文字幕一区二区不卡| 亚洲女人国产香蕉久久精品| 久久99这里只有精品国产| 成人免费高清视频| 国产一区免费在线观看| 黄视频网站免费观看| 美国一区二区三区| 亚洲女初尝黑人巨高清在线观看| 国产91精品露脸国语对白| 国产精品免费精品自在线观看| 国产综合91天堂亚洲国产| 国产国语对白一级毛片| 免费一级片网站| 精品久久久久久综合网| 91麻豆精品国产片在线观看| 成人免费观看男女羞羞视频| 欧美日本国产| 欧美一级视| 九九精品在线播放| 二级特黄绝大片免费视频大片| 黄色免费三级| 免费国产在线观看不卡| 韩国三级视频网站| 91麻豆精品国产综合久久久| 黄视频网站在线看| 国产一区二区精品久久91| 亚洲天堂一区二区三区四区| 精品久久久久久免费影院| 国产网站免费视频| 色综合久久手机在线| 日本免费乱理伦片在线观看2018| 黄视频网站在线看| 精品国产一区二区三区国产馆| 欧美一级视频免费观看| 可以免费看污视频的网站| 日本免费看视频| 久草免费在线观看| 国产不卡在线观看| 欧美另类videosbestsex| 国产亚洲精品aaa大片| 91麻豆tv| 国产国语在线播放视频| 国产网站免费观看| 久久99中文字幕久久| 可以免费看污视频的网站| 精品国产亚一区二区三区| 九九干| 国产一区免费在线观看| 国产激情一区二区三区| 麻豆网站在线看| 国产不卡在线观看| 午夜精品国产自在现线拍| 国产精品12| 99久久精品费精品国产一区二区| 国产一区二区精品尤物| 九九九网站| 日本免费区| 999精品在线| 你懂的在线观看视频| 久久精品大片| 韩国三级视频网站| 午夜欧美成人久久久久久| 亚洲 欧美 成人日韩| 麻豆午夜视频| 欧美一区二区三区在线观看| 日日夜夜婷婷| 一本高清在线| 午夜在线观看视频免费 成人| 青青久久国产成人免费网站| 午夜精品国产自在现线拍| 国产一区二区精品久久91| 九九久久国产精品大片| 成人免费观看网欧美片|