中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何用JavaScript制作大轉盤游戲

發布時間:2023-02-03 09:10:37 來源:億速云 閱讀:152 作者:iii 欄目:開發技術

今天小編給大家分享一下如何用JavaScript制作大轉盤游戲的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

一、開始前的準備

首先就是確定產品需求,仔細一看,emmm,就是正常的一個大轉盤該有的東西,也沒啥特殊要求,唯一需要注意的是大轉盤的轉盤個數需要動態變化,即用戶設置多少獎品我就需要顯示多少塊區域。

既然要做大轉盤,不外乎三個步驟:

  • 畫出大轉盤

  • 把獎勵放上去

  • 讓大轉盤滾起來

二、畫出大轉盤

畫出大轉盤底圖部分就不必多說了,最難的部分在于把一個圓動態平均分成N份,并讓其在底圖上正常顯示。

我采用的方法是:用戶選擇了多少獎品(除2個獎品以外)我就在底圖上生成多少個寬高為底圖50%的div,目的是使每個div的右下角正好與底圖的中心點重合(這里有個坑,看下去就知道了),接著計算出對應的圓心角 angle = 360 / n ,然后將其形變后以右下角為圓心旋轉對應的角度拼成一個圓形。其中,形變和旋轉分別采用skew與rotate進行實現。

注:

  • skew形變的角度為(90 - angle)deg

  • 如果要給每一塊加上漸變色的話,由于使用了skew形變,所以要顯示從左到右的漸變的效果,就需要從原先正方形的底邊變到右邊,即:background: linear-gradient('45deg', color1, color2)

// 以下為N為8時,用純JS寫的一個測試demo
const n = 8; // 獎品數量
const circle = document.getElementById('circle');
for(let i = 0; i < n ; i++) {
    let item = document.createElement('div');
    item.className = `circle-item  circle-item-${n}`;
  	// n為2時,旋轉原點不在右下角改為底部中點,不需要skew形變,并且寬度不是50%而是100%
    if(n !== 2) {
      item.style=
        `transform: rotate(${i * angle}deg) skew(${90 - angle}deg);
         transform-origin: bottom right;
         background-color: ${colorList[i % colorList.length]}; //設置了每個格子的背景色,可以不設置
        `
    } else {
      item.style=
        `transform: rotate(${i * angle}deg);
         transform-origin: bottom;
         background-color: ${colorList[i % colorList.length]};
        `
    }
    circle.appendChild(item);
  }

如何用JavaScript制作大轉盤游戲

本以為算解決了一個難題,直到我開始測試時,發現 n == 3時出現了奇怪的現象:

如何用JavaScript制作大轉盤游戲

好嘛,當 n == 3時,只設置50%的寬高顯然并不能填充滿整個背景圖。于是更改了當 n != 2時的樣式,改為寬高的60%,并設置其初始位置往左和上各平移10%。

.circle-item {
    border: 1px solid;
    height: 60%;
    width: 60%;
    position: absolute;
    left: -10%;
    top: -10%;
}

如何用JavaScript制作大轉盤游戲

這樣乍一看是實現了平均分的問題,但仔細一想還有一個問題,那便是如果加上指針,指針永遠是向上的,這樣看起來就怪怪的了,所以還需要將整個圖像進行一個旋轉,使初始指針默認指向第一塊的中心位置。

旋轉角度為: (180 - angle) / 2

如何用JavaScript制作大轉盤游戲

三、把獎勵放上去

把獎勵放上去我想到兩種方法:

1、給每個獎勵生成一個與底部背景圖寬高一樣的正方形,然后將其對著中心點旋轉對應的角度,將其一層層的放在底部背景圖上,即可完成。如下圖1所示,每一個正方形的大小都是與底部的背景圖的寬高是一樣的,只是將其進行一個旋轉即可。(當時以為不好顯示用戶抽中的扇形的部分,就沒采用這種方法,現在總結了才發現只需要將顏色填充在每個扇形中即可,不用填充在獎勵背景上,如下圖2所示,應該也是能實現的)

如何用JavaScript制作大轉盤游戲

圖1 每一層獎勵的范圍

如何用JavaScript制作大轉盤游戲

圖2 總結時想到的實現方法

2、將獎勵直接放在每一個扇形區域里面,這樣我就直接修改每個扇形的背景色即可。看上去很簡單,但實際開始操作了就發現了兩個問題:

  • 由于每一塊方格是skew形變出來的,獎勵直接放上去也會產生形變,需要將形變消除;

  • 獎勵居中顯示很麻煩,到現在我也沒有找到可以套用的公式;

第一點解決起來較為簡單,只需要將獎勵進行一個反向的skew變形,旋轉角度為:-(90 &ndash; (angle / 2))deg。 第二點我到現在也沒有找到可以套用的公式,是每一種給他寫了一個樣式居中的。(還好產品只要求2-6的獎勵數量,不然可能就沒有這篇文章了,如果大家有好的方法也可以教教我)

兩種方法各有優點: 方法一的優點是不需要將獎勵進行反向形變,怎么放上去就是怎么顯示; 方法二的優點是獎勵與扇形不分離,我不需要額外的添加太多的div來實現獎勵正確顯示。

四、讓大轉盤滾起來

大轉盤到現在已經完成了七七八八了,現在就差最后一步,讓其滾起來,點擊一次后滾動到對應的位置然后停下。

采用的方法是給大轉盤添加一個旋轉的動畫,突然想起來 transform 中有 ease-in-out 這個過渡方法,即慢-快-慢的過渡效果,正好滿足我抽獎所需,于是直接采用了這種方法。

這里有個小細節,由于大轉盤上本來就設置了transform的動畫效果,如果不想現在的旋轉動畫覆蓋掉之前的動畫,就需要單獨給動畫加上一層div,放在大轉盤底圖的外邊一層。

const circle = 8; // 旋轉圈數
let circleAdd = 0; // 抽獎次數,每次抽完自增
let rotateAngle = 0; // 旋轉角度
let getPrizeIndex = 0; // 抽到的獎品的index

在定義完上面的內容之后計算需要旋轉的角度: rotateAngle = circle * 360 * circleAdd - angle * getPrizeIndex,將這個rotateAngle放入需要旋轉的style中即可完成旋轉。

這里走了兩次彎路,一次是沒有加上circleAdd,然后就發現第一次大轉盤會正常旋轉,第二次開始就不動或者只往前滾不到360&deg;甚至往回滾!原因是因為每一次給style賦新值的時候,由于已經有旋轉的角度了,他會在你設置新的旋轉角度的時候從上一個旋轉角度開始執行動畫。

第二次是我在寫計算公式的時候,想當然的把上面的“-”寫成了“+”,想的是我先旋轉了circle * circleAdd圈,然后還要滾 getPrizeIndex 個獎勵就是我需要顯示的獎勵,然后發現指針指向的獎勵與我需要選擇的 getPrizeIndex 并不相符。仔細檢查了才發現雖然大轉盤旋轉是順時針方向的,但是獎勵的讀取方向應該是逆向的,所以應該是“-”而不是“+”。

以上就是“如何用JavaScript制作大轉盤游戲”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

惠东县| 逊克县| 霍山县| 班戈县| 平邑县| 资溪县| 井冈山市| 文成县| 航空| 崇信县| 道孚县| 桃江县| 秦皇岛市| 长沙市| 宣威市| 凤山市| 上饶市| 洪江市| 绵竹市| 鄯善县| 桃园市| 张北县| 陵川县| 依兰县| 五原县| 阜平县| 武威市| 万州区| 舞阳县| 天镇县| 皋兰县| 甘孜县| 青阳县| 台中县| 灵宝市| 禄劝| 安仁县| 锦州市| 长宁县| 山西省| 文成县|