真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

使用canvas怎么實(shí)現(xiàn)一個(gè)扭蛋機(jī)動(dòng)畫效果

使用canvas怎么實(shí)現(xiàn)一個(gè)扭蛋機(jī)動(dòng)畫效果?相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。

創(chuàng)新互聯(lián)建站專注于成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)、網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站制作、網(wǎng)站開發(fā)。公司秉持“客戶至上,用心服務(wù)”的宗旨,從客戶的利益和觀點(diǎn)出發(fā),讓客戶在網(wǎng)絡(luò)營(yíng)銷中找到自己的駐足之地。尊重和關(guān)懷每一位客戶,用嚴(yán)謹(jǐn)?shù)膽B(tài)度對(duì)待客戶,用專業(yè)的服務(wù)創(chuàng)造價(jià)值,成為客戶值得信賴的朋友,為客戶解除后顧之憂。

布局

扭蛋機(jī)的布局比較簡(jiǎn)單,只需要在基礎(chǔ)背景上添加一些元素就可以,最主要的是canvas標(biāo)簽,其他都無所謂:


    點(diǎn)擊抽獎(jiǎng)
    
        
        
    

附上樣式表:

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繪制圖像上了。

扭蛋動(dòng)畫

先把各種變量定義好:

var canvas = document.getElementById('myCanvas');
var ctx = canvas.getContext('2d');
var ball1 = document.getElementById('ball1');//圖片對(duì)象
var ball2 = document.getElementById('ball2');//圖片對(duì)象
var ball3 = document.getElementById('ball3');//圖片對(duì)象
var ball4 = document.getElementById('ball4');//圖片對(duì)象
var ballList = [ball1, ball2, ball3, ball4];//圖片對(duì)象數(shù)組
var ballNum = 4;//扭蛋機(jī)里面的小球數(shù)
var awardList = [];//扭蛋機(jī)中的小球集合
var timer;//計(jì)時(shí)器
var award = document.getElementById('awardBall');
var message = document.getElementById('message');

扭蛋對(duì)象

扭蛋機(jī)里面每個(gè)扭蛋都是一個(gè)對(duì)象,所以需要定義一個(gè)扭蛋對(duì)象:

function Ball(index, img) {
    this.r = 30;//小球半徑
    this.x = this.rand(canvas.width - this.r * 2);//小球初始橫坐標(biāo)
    this.y = this.rand(canvas.height - this.r * 2);//小球初始縱坐標(biāo)
    this.color = index;//小球顏色,以下標(biāo)表示
    this.img = img;//小球素材
    do {
        this.speedX = this.rand(20) - 10;
    } while (this.speedX < 5);//小球橫坐標(biāo)改變速度
    do {
        this.speedY = this.rand(20) - 10;
    } while (this.speedY < 5);//小球縱坐標(biāo)改變速度
}

傳入扭蛋對(duì)象的值index為小球的顏色,用數(shù)字1~4表示,img是圖片對(duì)象,用來繪制扭蛋。

扭蛋方法

在上一步已經(jīng)為扭蛋添加了屬性,接下來就是給扭蛋添加方法:

Ball.prototype = {
    rand: function (num) {//隨機(jī)數(shù)
        return Math.random() * num;
    },
    run: function () {//小球運(yùn)動(dòng)函數(shù)
        this.x += this.speedX;
        this.y += this.speedY;
        if (this.x > canvas.width - this.r * 2) {//小球碰到右邊界,橫坐標(biāo)速度變?yōu)樨?fù)
            this.speedX = -this.speedX;
        }
        if (this.x < 0) {//小球碰到左邊界,橫坐標(biāo)速度變?yōu)檎?
            this.speedX = Math.abs(this.speedX);
        }
        if (this.y > canvas.height - this.r * 2) {//小球碰到下邊界,縱坐標(biāo)速度變?yōu)樨?fù)
            this.speedY = -this.speedY;
        }
        if (this.y < 0) {//小球碰到上邊界,縱坐標(biāo)速度變?yōu)檎?
            this.speedY = Math.abs(this.speedY);
        }
        ctx.drawImage(this.img, this.x, this.y, 60, 60);//繪制小球
    }
}

主要是為扭蛋對(duì)象的原型添加上運(yùn)動(dòng)函數(shù),運(yùn)動(dòng)函數(shù)的作用就是讓扭蛋根據(jù)其速度動(dòng)起來,并且在接觸到邊界的時(shí)候反彈。

初始化

接下來就是把扭蛋們放在扭蛋機(jī)里面:

function init() {//初始化
    for (let i = 0; i < ballNum; i++) {//隨機(jī)生成各色小球
        let index = Math.floor(4 * Math.random());
        awardList[i] = new Ball(index, ballList[index]);//新建小球?qū)ο?
    }
    window.clearInterval(timer);//清除計(jì)時(shí)器
    timer = setInterval(function () {
        ctx.clearRect(0, 0, canvas.width, canvas.height);//清空畫布
        for (let i = 0; i < awardList.length; i++) {
            awardList[i].run();
        }//使小球運(yùn)動(dòng)
    }, 15);
}

這樣子扭蛋機(jī)里面就已經(jīng)有了小球。

開始扭蛋

開始扭蛋主要經(jīng)歷的過程就是點(diǎn)擊按鈕,扭蛋機(jī)扭蛋減少,獲得相應(yīng)扭蛋,中獎(jiǎng)顯示:

function play() {
    if (awardList.length === 0) {//獎(jiǎng)池中沒有小球
        alert('重新開始!');
        init();
        message.innerText = '點(diǎn)擊抽獎(jiǎng)';
    } else {
        window.clearInterval(timer);//清除計(jì)時(shí)器
        let r = awardList.pop();//將獎(jiǎng)池中的小球減少
        timer = setInterval(function () {
            ctx.clearRect(0, 0, canvas.width, canvas.height);//清空畫布
            for (let i = 0; i < awardList.length; i++) {
                awardList[i].run();
            }//使小球運(yùn)動(dòng)
        }, 15);
        switch (r.color) {//小球掉落動(dòng)畫
            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);
    }
}

在這里扭蛋的掉落動(dòng)畫使用css動(dòng)畫的關(guān)鍵幀來完成:

.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);
    }
}

結(jié)束

當(dāng)然,需要最后加上init();來讓扭蛋機(jī)跑起來,到這里,這個(gè)簡(jiǎn)單的扭蛋機(jī)就算完成了,效果預(yù)覽

總結(jié)

雖然這個(gè)Demo比較簡(jiǎn)單,但是還是有一些注意點(diǎn)和一些可優(yōu)化的地方。

注意點(diǎn)

img對(duì)象

在html中的這些img標(biāo)簽:




樣式也寫成display: none;,這樣寫是為了在js中獲取img對(duì)象,當(dāng)然也可以不在html中寫這些img標(biāo)簽,直接在js文件中寫:

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

看完上述內(nèi)容,你們掌握使用canvas怎么實(shí)現(xiàn)一個(gè)扭蛋機(jī)動(dòng)畫效果的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!


網(wǎng)站標(biāo)題:使用canvas怎么實(shí)現(xiàn)一個(gè)扭蛋機(jī)動(dòng)畫效果
URL標(biāo)題:http://weahome.cn/article/geghgs.html

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部