前端:用javascript實現一個轉盤小遊戲?

2020-12-16 酷扯兒

本文轉載自【微信公眾號:趣談前端,ID:beautifulFront】經微信公眾號授權轉載,如需轉載與原文作者聯繫

本文主要介紹如何使用原生javascript和Css3來實現一個在各大移動應用中經常出現的轉盤遊戲,由於改實現可以有不同方式,如果熟悉canvas的話也可以用canvas實現,本文採用js和css實現主要考慮到複雜度較小性能較好,所以如果有更好的方案,也可以隨時和我交流。

前言

本文技術路線採用和上篇文章教你用200行代碼寫一個愛豆拼拼樂H5小遊戲(附源碼)同樣的技術,即均使用本人自己寫的dom庫去簡化dom操作,具體需要掌握的知識點有:

css3 背景漸變,transform,transitionless循環的使用javascript基本隨機算法文檔片段 documentFragment的使用由於文章沒有太高深的技術,關鍵是思路,所以接下來開始我們的實現介紹。

效果圖

實現思路

實現思路分兩部分,第一部分是用css繪製轉盤背景,第二部分是通過js實現轉盤的轉動以及轉動隨機性的實現。

1. 繪製轉盤背景

我們採用背景漸變的方式去實現條紋交替的扇形,原理就是通過繪製一個半圓,並在半圓裡加漸變來實現,如下圖:

實現將方形變成半圓的css我們通過border-radius來實現:

width: 150px;

height: 300px;

border-radius: 0 150px 150px 0;

我們再通過css的線性漸變,這樣本基本上可以實現一個小的扇形區域:

漸變的代碼如下:

background-image: linear-gradient(120deg, #f6d365, #f6d365 75px, transparent 75px);

實現了一個扇形,我們自然可以通過計算,比如我們扇形弧度為30deg,那麼我們需要12個扇形即可組成一個圓,為了方便,我們使用less的循環來實現:

.loop(@n) when (@n >= 0) {

.loop(@n - 1);

.piece-@{n} {

transform: rotate(-30deg * (@n + 1));

}

}

還有一個細節是,我們需要改變變換的中心點,讓每個扇形都以一個中心點渲染,這樣才可以組成一個完整的圓:

transform-origin: left center;

完整的css大致如下:

.piece-wrap {

position: relative;

width: 300px;

margin: 100px auto auto 173px;

transform-origin: left center;

transition: transform 16s cubic-bezier(0,.47,.31,1.03);

.piece {

position: absolute;

left: 0;

top: 0;

width: 150px;

height: 300px;

border-radius: 0 150px 150px 0;

transform-origin: left center;

span {

margin-left: 16px;

margin-top: 20px;

display: inline-block;

color: #fff;

}

&:nth-child(2n) {

background-image: linear-gradient(120deg, #f6d365, #f6d365 75px, transparent 75px);

&:nth-child(2n+1) {

background-image: linear-gradient(120deg, #ff5858, #ff5858 75px, transparent 75px);

}

.loop(@n) when (@n >= 0) {

.loop(@n - 1);

.piece-@{n} {

transform: rotate(-30deg * (@n + 1));

}

.loop(11);

2.javascript實現轉盤邏輯

由於轉盤的轉動是隨機的,所以我們需要每次點擊開始按鈕都要隨機生成一個角度,但是仔細分析一些平臺會發現轉盤每次都至少轉動n圈後才會慢慢開始停下,所以我們會給轉盤一個初始的角度,比如720deg,1080deg,這樣能保證轉盤至少轉動n圈才停下來。

另一個注意點是我們要如何通過轉動角度知道轉盤停下來後的位置?這裡處於性能問題,我們儘量不操作dom,通過數據控制,我們可以通過每次隨機後得到的角度和單位扇形區域的弧度來計算停下來的位置,公式如下:

totalRadis = initRadis + radis * n + radis/2

totalRadis為轉動的角度,initRadis為初始化角度,radis為扇形的角度,radis/2是中獎的範圍,這裡主要用來定位用的,n是隨機數,接下來我將解釋n的作用。

那麼怎麼實現隨機角度呢?我們一般會想通過寫個隨機函數去做,不過這裡有一種新的思路,就是通過隨機生成中獎的位置來實現隨機角度,由於我的扇形為30度,一共有12個扇形獎品區,所以索引為0-11。因此,上面講到的n,就是我們的隨機索引,我們只需要寫個生成指定範圍的隨機數就可以了。

了解了以上知識,我們開始準備初始化數據:

// 轉盤抽獎數據

var wards = ['1元', '2元', '3元', '5元', '再來',

'算法', '0.5元', '0.1元', '0.2元', '0.6元',

'0.5元', '來'];

渲染獎品數據,這裡我們用了DocumentFragment,雖然對簡單渲染沒有必要,但是後期可能會很有用:

// 渲染dom

var fragment = document.createDocumentFragment();

for(var i=0, len = wards.length; i < len; i++) {

var piece = document.createElement('div');

piece.className = 'piece piece-' + i;

piece.innerHTML = '<span>' + wards[i] + '</span>';

fragment.appendChild(piece);

$('#piece_wrap')[0].appendChild(fragment);

生成指定範圍的隨機數的方法:

// 生成從 start到end的隨機數

function randomArr(start, end) {

return Math.round(start + Math.random()* (end - start))

當我們點擊開始按鈕時,我將通過改變轉盤的transform來讓其運動起來:

// 轉動邏輯

var radis = 30, // 每個扇形區域的度數

n = randomArr(0, 360/radis), // 計算隨機中獎的位置

initRadis = 720, // 初始轉動的角度

time = 16 * 1000, // 轉動時間

once = true, // 限制一個轉動周期只能點擊一次

totalRadis = initRadis + radis * n + radis/2; // 轉動角度計算公式

$('.start').on('click', function(){

if(once) {

once = false;

$('#piece_wrap').css({

'transform':'rotate(' + totalRadis + 'deg)',

'transition': 'transform 16s cubic-bezier(0,.47,.31,1.03)'

});

setTimeout(function(){

once = true;

alert('恭喜你抽中了' + wards[n] + '!');

$('#piece_wrap').css({

'transform':'rotate(' + 0 + 'deg)',

'transition': 'none'

});

}, time)

})

相關焦點

  • 如何使用JavaScript實現前端導入和導出excel文件
    接下來我們直接開始我們的方案實現.1. 使用JavaScript實現前端導入excel文件並自動生成可編輯的Table組件在開始實現之前, 我們先來看看實現效果.1.2 實現一鍵導入excel文件並生成table表格導入excel文件的功能我們可以用javascript原生的方式實現解析, 比如可以用fileReader這些原生api,但考慮到開發效率和後期的維護, 筆者這裡採用antd的Upload組件和XLSX來實現上傳文件並解析的功能.
  • javascript這些特點你知道其中幾個?建議前端小白好好看看!
    它是web開發中常用的腳本語言,特別是前端。 JavaScript主要功能是增強網頁互動性能,從而增加網站的用戶粘性。這是開發的初衷,但是後來就偏了大部分用到了web廣告上(各種彈窗廣告)。javascript有哪些特點?
  • 基於Vue實現一個有點意思的拼拼樂小遊戲
    回到我們的小遊戲開發,我們更多的是javascript和css3的掌握程度,在學習完這篇文章之後相信大家對javascript和css3的編程能力都會有極大的提升,後面還會介紹如何使用canvas實現生成戰績海報圖的功能。
  • b站直播講解,「web前端新人如何閱讀《JavaScript高級程序設計》」?
    《JavaScript高級程序設計》這本書,很多前端新人不敢看它,太厚了。很多地方也在說它不適合前端新人。我倒是覺得,這本書挺適合前端新人的,就在直播中給大家講一講,該怎麼讀這本書。下面是今天上午、下午的直播視頻,在b站也一樣可以看到1-閱讀的目的與結構講解2-js的簡介與歷史3-在html中使用javascript講課方式:一對一的視頻直播 + 錄播不限時、不限次、一對一的視頻答疑課後錄像在線回看上課時間、內容、進度,根據學生需求-【自定】
  • 這一次,徹底弄懂 JavaScript 執行機制
    因為javascript是一門單線程語言,所以我們可以得出結論:javascript是按照語句出現的順序執行的看到這裡讀者要打人了:我難道不知道js是一行一行執行的?還用你說?所以一切javascript版的"多線程"都是用單線程模擬出來的,一切javascript多線程都是紙老虎!2.javascript事件循環既然js是單線程,那就像只有一個窗口的銀行,客戶需要排隊一個一個辦理業務,同理js任務也要一個一個順序執行。如果一個任務耗時過長,那麼後一個任務也必須等著。
  • 《前端5分鐘》之使用解釋器模式實現獲取元素Xpath路徑的算法
    本文轉載自【微信公眾號:趣談前端,ID:beautifulFront】經微信公眾號授權轉載,如需轉載與原文作者聯繫前端領域裡基於javascript的設計模式和算法有很多,在很多複雜應用中也扮演著很重要的角色,接下來就介紹一下javascript設計模式中的解釋器模式,並用它來實現一個獲取元素Xpath路徑的算法
  • 2020Web前端面試題匯總-開課吧
    Web前端面試題說說前端中的事件流HTML中與javascript交互是通過事件驅動來實現的,例如滑鼠點擊事件onclick、頁面的滾動事件onscroll等等,可以向文檔或者文檔中的元素添加事件偵聽器來預訂事件。想要知道這些事件是在什麼時候進行調用的,就需要了解一下「事件流」的概念。
  • 如何在javascript中創建一個對象?
    javascript是一門基於對象而不是面向對象的語言,由於它的這個缺陷,在javascript中實現面向對象時十分彆扭,就比如創建對象,由於在ES6之前沒有class關鍵字,想要創建對象必須依賴以下幾種間接方式。
  • 使用HTML5畫布實現的超棒javascript動畫儀錶板:gauge.js
    使用HTML5畫布實現的超棒javascript動畫儀錶板:gauge.js 在線演示今天我們分享來自guage.js的超棒動畫儀錶板實現,這個類庫使用html5畫布來生成動態的自定義儀錶板
  • javascript中那些奇怪的特性
    比如下圖,讓很多前端程式設計師感到很無奈。所有括號都有什麼用?事實證明,這些額外的括號僅僅是為了告訴JavaScript解析器,即將到來的代碼是一個函數表達式,而不是一個函數。可以想像,知道了這一點,有很多方法可以跳過這些額外的括號,仍然可以生成一個有效的立即調用的函數表達式。void操作符告訴解析器代碼是函數表達式,因此,我們可以跳過函數定義的括號。你猜怎麼著?
  • 你應該知道的前端小知識
    在這些表象的背後呢,實際上是行業對開發人員的要求發生了天翻地覆的變化,以往前端寫demo,套模板,調頁面這種刀耕火種的方式已經完全不符合當下對開發效率的要求,前端工程化就是在這樣一個背景下被提上檯面,成為前端工程師必備的手段之一。一般來說前端工程包含,項目初始化,項目開發,集成,構建,打包,測試,部署,監控等流程。
  • 前端設計-JavaScript簡單數字時鐘開發實例
    簡單數字時鐘開發實例藉助於JavaScript window對象所提供的計時觸發函數setInterval可以實現前端動畫效果的設計與製作。由於我們數字時鐘相關素材都在統一圖片中,因此我們在設置展示數字與字符的過程中需要對每一個樣式中的背景截取位置通過background-position屬性進行精確控制。完成9個數字與一個分隔符樣式定義之後,可以將8個時鐘顯示DIV設置對應的ID標籤,實現內容展示,如我們將以上時鐘布局DIV標籤全部設置為展示數字0的ID標籤,效果如下:
  • 前端組件/庫打包利器rollup使用與配置實戰
    本文轉載自【微信公眾號:趣談前端,ID:beautifulFront】經微信公眾號授權轉載,如需轉載與原文作者聯繫目前主流的前端框架vue和react都採用rollup來打包,為了探索rollup的奧妙,接下來就讓我們一步步來探索,並基於rollup搭建一個庫打包腳手架,來發布自己的庫和組件。
  • 0基礎學習JavaScript一定要知道如何使用VS2019去編寫代碼
    編寫JS代碼對於.NET開發者來說,前端技術也是不能少的,0基礎的開發者來說,使用Visual Studio 2019開發工具是非常容易上手的。這裡創建一個空白的Web應用程式項目,ASP.NET Web應用程式是完全支持JavaScript代碼編寫的。
  • Canvas入門實戰之實現一個圖形驗證碼
    本文轉載自【微信公眾號:趣談前端,ID:beautifulFront】經微信公眾號授權轉載,如需轉載與原文作者聯繫本文主要介紹用canvas實現圖形驗證碼的一些思路以及如何用javascript面向對象的方式更友好的實現canvas的功能,關於canvas的一些基本使用方法和API我整理了一個思維導圖,大家感興趣的可以參考學習
  • 《前端5分鐘》之使用純css實現網站換膚和焦點圖切換動畫
    本文轉載自【微信公眾號:趣談前端,ID:beautifulFront】經微信公眾號授權轉載,如需轉載與原文作者聯繫今天我們來繼續復盤一些工作中常用的css技巧和知識,以便我們可以更加優雅的用css實現富有動感的網站.
  • Javascript 生成器
    在 javascript 中,如果想要使用生成器,則需要: 定義特殊的生成器函數 調用該函數創建一個生成器對象 在循環中使用該生成器對象,或直接調用其 方法 我們以下面這個簡單的程序做為起點,並執行以下每個步驟:
  • 僅用兩名前端開發,聯機小遊戲一周內上線,如何做到?
    ​從1月底爆發至今的新冠肺炎病毒疫情牽動著每一個人的心。2月初,騰訊雲的遊戲雲團隊想到,可以通過一款小遊戲來普及抗疫知識。想法獲得認可後,開發團隊快速行動起來。最終2個前端開發、1個美術和1個策劃,僅用1周時間內,就完成了「一起來戰疫」小遊戲的開發、上線。
  • 2020年最熱度最高的5個JavaScript框架
    2019年的優秀框架什麼是框架,為什麼我們需要它?簡而言之,框架是由一組開發人員編寫的代碼塊,以使整個開發過程變得簡單且易於實現。從業務角度看,它使開發人員能夠滿足相應客戶的需求,並使用框架來解決客戶項目開發階段所面臨的挑戰。
  • 大轉盤抽獎,為何每次都是手滑了一點點
    一般來說,大轉盤之類會比刮刮樂更加吸引人心理優勢1. 獎品明明白白的展示在界面上,用戶看到高價的、喜歡的,難免心痒痒2.這其實是一種障眼法,懂程序的朋友都知道,前端的數據是不安全的,所以抽獎的邏輯全部在服務端處理,千萬不要被頁面的展示給騙了。下面是重點1. 用戶點擊抽獎後,表面上看是大轉盤在轉動,轉動停止後才知道抽中什麼。2.