基於Vue實現一個有點意思的拼拼樂小遊戲

2020-12-23 酷扯兒

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

前言

為了加深大家對vue的了解和vue項目實戰,筆者採用vue生態來重構此項目,方便大家學習和探索。技術棧如下:

vue-cli4 基於vue的腳手架Xuery 筆者基於原生js二次封裝的dom庫vue mvvm庫因為該應用屬於H5遊戲,為了清亮化筆者沒有採用第三方ui庫, 如果大家想採用基於vue的第三方移動端ui庫,筆者推薦如下:

Mint 餓了麼推出的移動端ui庫NutUI 一套京東風格的移動端組件庫muse-ui 基於MaterialUI風格的移動端UI組件cube-ui 滴滴團隊開發的移動端UI組件庫vant 有贊團隊的電商風格的移動端組件庫atom-design atom風格的移動端ui組件庫mand-mobile 滴滴團隊研發的基於金融場景的移動端ui組件庫以上筆者推薦的都是社區比較完善,bug比較少的組件庫,大家可以感受一下。

回到我們的小遊戲開發,我們更多的是javascript和css3的掌握程度,在學習完這篇文章之後相信大家對javascript和css3的編程能力都會有極大的提升,後面還會介紹如何使用canvas實現生成戰績海報圖的功能。

正文

我們先來看看遊戲的預覽界面:

在線體驗地址:傳送門

本文的算法實現方式在之前的拼拼樂文章中已經說明,這裡主要介紹核心算法, 至於vue-cli的使用方法,筆者之前也寫過對應的文章,大家可以研究學習一下。vue-cli搭建項目方式如下:

// 安裝

yarn global add @vue/cli

// 創建項目

vue create pinpinle

// 進入項目並啟動

cd pinpinle && yarn start

複製代碼

關於vue-cli3配置實戰,可以移步 一張圖教你快速玩轉vue-cli3

H5遊戲核心功能介紹

目前筆者主要整理樂如下核心功能,接下來筆者會一一帶大家實現:

實現純javascript上傳預覽圖片實現拼圖分割功能實現洗牌算法實現生成戰績海報功能1. 實現純javascript上傳預覽圖片

文件上傳預覽主要採用FileReader API實現,原理就是將file對象傳給FileReader的readAsDataURL然後轉化為data:URL格式的字符串(base64編碼)以表示所讀取文件的內容。 具體代碼如下:

// 2.文件上傳解析

let file = $('#file');

file.on('change', function(e){

var file = this.files[0];

var fileReader = new FileReader();

// 讀取完成觸發的事件

fileReader.onload = function(e) {

$('.file-wrap')[0].style.backgroundImage = 'url(' + fileReader.result + ')';

imgSrc = fileReader.result;

}

file && fileReader.readAsDataURL(file);

})

複製代碼

2. 實現拼圖分割功能

一般我們處理這種拼圖遊戲都會有如下方案:

用canvas分割圖片採用n張不同的切好的切片圖片(方法簡單,但是會造成多次請求)動態背景分割經過權衡,筆者想出了第三種方法,也是自認為比較優雅的方法,即動態背景分割,我們只需要使用1張圖片,然後利於css的方式切割圖片,有點經典的雪碧圖的感覺,如下:

本質就是我們設置九個div,每個div都使用同一張圖片,並且圖片大小等於遊戲畫布大小,但是我們通過backgroundPosition(背景定位)的方式來實現切割圖片。這樣做的另一個好處是方便我們實現洗牌邏輯。

3. 實現洗牌算法

洗牌邏輯依託於隨機算法,這裡我們結合坐標系,實現一個隨機生成二維坐標系的邏輯,然後通過改變每個切片的translate位置,配合過渡動畫,即可實現洗牌功能和洗牌動畫。

3.1 數組亂序算法

數組亂序比較簡單,代碼如下:

// 數組亂序

function upsetArr(arr) {

arr.sort(function(a,b){

return Math.random() > 0.5 ? -1 : 1

})

}

複製代碼

3.2 洗牌邏輯

洗牌邏輯基於數組亂序,具體邏輯如下:

// 洗牌方法

function shuffle(els, arr) {

upsetArr(arr);

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

var el = els[i];

el.setAttribute('index', i); // 將打亂後的數組索引緩存到元素中

el.style.transform = 'translate(' + arr[i].x + 'vw,' + arr[i].y + 'vh'+ ')';

}

}

複製代碼

3.3 生成n緯矩陣坐標

n維矩陣主要用來做洗牌和計算成功率的,具體實現如下:

// 生成n維矩陣坐標

function generateMatrix(n, dx, dy) {

var arr = [], index = 0;

for(var i = 0; i< n; i++) {

for(var j=0; j< n; j++) {

arr.push({x: j*dx, y: i*dy, index: index});

index++;

}

}

return arr

}

複製代碼

3.4 置換算法

置換算法主要用來切換拼圖的,比如用戶想移動拼圖,可以用過置換來實現:

// 數組置換

function swap(arr, indexA, indexB) {

let cache = arr[indexA];

arr[indexA] = arr[indexB];

arr[indexB] = cache;

}

複製代碼

4. 實現生成戰績海報功能

生成戰績海報筆者採用canvas來實現,對於canvas的api不熟悉的可以查看MDN,講的比較詳細。這裡筆者簡單實現一個供大家參考:

function generateImg() {

var canvas = document.createElement("canvas");

if(canvas.getContext) {

var winW = window.innerWidth,

winH = window.innerHeight,

ctx = canvas.getContext('2d');

canvas.width = winW;

canvas.height = winH;

// 繪製背景

// ctx.fillStyle = '#06c';

var linear = ctx.createLinearGradient(0, 0, 0, winH);

linear.addColorStop(0, '#a1c4fd');

linear.addColorStop(1, '#c2e9fb');

ctx.fillStyle = linear;

ctx.fillRect(0, 0, winW, winH);

ctx.fill();

// 繪製頂部圖像

var imgH = 0;

img = new Image();

img.src = imgSrc;

img.onload = function(){

// 繪製的圖片寬為.7winW, 根據等比換算繪製的圖片高度為 .7winW*imgH/imgW

imgH = .6*winW*this.height/this.width;

ctx.drawImage(img, .2*winW, .1*winH, .6*winW, imgH);

drawText();

drawTip();

drawCode();

}

// 繪製文字

function drawText() {

ctx.save();

ctx.fillStyle = '#fff';

ctx.font = 20 + 'px Helvetica';

ctx.textBaseline = 'hanging';

ctx.textAlign = 'center';

ctx.fillText('我只用了' + (180 -dealtime) + 's,' + '快來挑戰!', winW/2, .15*winH + imgH);

ctx.restore();

}

// 繪製提示文字

function drawTip() {

ctx.save();

ctx.fillStyle = '#000';

ctx.font = 14 + 'px Helvetica';

ctx.textBaseline = 'hanging';

ctx.textAlign = 'center';

ctx.fillText('關注下方二維碼開始遊戲', winW/2, .25*winH + imgH);

ctx.restore();

}

// 繪製二維碼

function drawCode() {

var imgCode = new Image();

imgCode.src = '/piecePlay/images/logo.png';

imgCode.onload = function(){

ctx.drawImage(imgCode, .35*winW, .3*winH + imgH, .3*winW, .3*winW);

// 生成預覽圖

var img = new Image();

img.src= convertCanvasToImage(canvas, 1).src;

img.className = 'previewImg';

img.onload = function(){

$('.preview-page')[0].appendChild(this);

startDx = startDx - 100;

transformX(wrap, startDx + 'vw');

}

}

}

} else {

alert('瀏覽器不支持canvas!')

}

}

複製代碼

H5拼圖小遊戲筆者已在github開源, 感興趣的可以學習參考。以上的邏輯部分的代碼可以直接整合到vue項目中即可,由於實現比較簡單, 這裡筆者就不詳細介紹了。

H5可視化編輯器Dooring功能迭代說明

目前筆者實現的H5可視化編輯器H5-Dooring功能新增如下:

實時保存功能添加進度條組件添加websocket通信實現在線下載代碼功能預覽地址:基於React+Koa實現一個h5頁面可視化編輯器-Dooring

github地址:基於React+Koa實現一個h5頁面可視化編輯器-Dooring

最後

如果想學習更多H5遊戲, webpack,node,gulp,css3,javascript,nodeJS,canvas數據可視化等前端知識和實戰,歡迎在《趣談前端》一起學習討論,共同探索前端的邊界。

相關焦點

  • 《魔獸世界》憎惡拼拼樂在哪接
    18183首頁 魔獸世界 《魔獸世界》憎惡拼拼樂在哪接 《魔獸世界》憎惡拼拼樂在哪接 來源:網絡
  • 「拼拼樂」拼圖大賽——中班組
    在班級的區域遊戲時間,孩子們也不忘專心備戰,在同伴的互相交流分享中、在老師的引導下還總結了很多「拼圖小竅門」。      孩子們發現可以先拼拼圖的邊框,因為邊框沒有凹凸不平的地方,非常好區分。      邊框上也會有不同的顏色,我們可以先把所有的邊框按照顏色分一下再去合作拼不同顏色的邊框。
  • 黃崢想說什麼:為什麼創辦拼多多,拼多多能實現怎樣的社會理想
    遊戲化能夠成為趨勢興起,很大程度上是因為網際網路快速發展後,沉澱了大量真實、全景的用戶數據。基於這些數據,才能夠進行遊戲化所需的各種機制設計。黃崢對遊戲並不陌生。成立拼多多之前,黃崢曾經成立電商代運營公司樂其,2013年樂其的一部分核心員工開始涉足遊戲,成立了上海尋夢。這家公司主要針對海外市場進行頁遊和手遊的研發與發行。
  • 《魔獸世界》憎惡拼拼樂任務攻略 9.0憎惡拼拼樂任務流程
    魔獸世界9.0重開放了憎惡工廠,玩家需要完成憎惡拼拼樂的任務。在這個任務中,最難得地方在於找到拉薩恩和獲得零件,這兩點都做到了基本上任務就完成的差不多了。下面為大家具體的介紹一下憎惡拼拼樂任務完成攻略,以及在憎惡工廠玩的時候有哪些注意事項,不了解的玩家可以參考一下下面的內容。  此任務開始並結束於瑪卓克薩斯。
  • 魔獸世界憎惡拼拼樂任務怎麼完成 9.0憎惡拼拼樂任務製作方法教程
    魔獸世界9.0重開放了憎惡工廠,玩家需要完成憎惡拼拼樂的任務。在這個任務中,最難得地方在於找到拉薩恩和獲得零件,這兩點都做到了基本上任務就完成的差不多了。下面為大家具體的介紹一下憎惡拼拼樂任務完成攻略,以及在憎惡工廠玩的時候有哪些注意事項,不了解的玩家可以參考一下下面的內容。 此任務開始並結束於瑪卓克薩斯。
  • 《精通react/vue組件設計》之快速實現一個可定製的進度條組件
    今天要來實現一個高可定製的進度條組件,在介紹組件設計之前,我們先牢記以下幾個原則.每一個組件只負責某一特定的表現或者功能)正文在開始組件設計之前希望大家對css3和js有一定的基礎.我們先看看實現後的組件效果:上圖可以知道封裝後的進度條組件通過對外暴露的接口(react/vue裡面可以看做
  • 拼拼優米是什麼?拼拼優米怎麼加入?拼拼優米2020逆襲的機會
    「拼拼優米」有什麼優勢?拼拼優米有什麼優勢?這我來介紹一下拼拼優米這個項目的優勢:這個項目就是一個微信小程序淘客項目。用戶直接在小程序上就可以購物,買的產品都是淘寶的商品,因為獨家技術,不需要跳轉,微信小程序下單,買的東西都是淘寶上對應同樣的商品。
  • 被「玩壞」了的拼多多:一文看懂拼多多是怎樣把遊戲化運營做到極致的
    但拼多多的遊戲化,是基於對用戶心理的深入洞察,否則它也難以在淘寶和京東的夾擊中,殺出一條血路。跳出抽象的概念,回歸到產品本身,我們可以借用「八角行為分析法」,來拆解拼多多的遊戲內核。基於此觀點,他將用戶的心理量化總結為8種核心驅動力,並創建出遊戲化設計框架——八角行為分析法,此方法從心理角度對一個遊戲化產品進行設計和評測。接下來,我們將用這種方法對拼多多每一個模塊的遊戲化內核進行拆解。
  • 基於SpringBoot和Vue的企業級中後臺項目
    、部門、角色、菜單管理等等優化基於Keepalive的標籤頁,做到標籤頁該緩存的時候緩存,比如左右切換等,不該緩存的時候不緩存,比如新建,表單提交結束等前端常量維護: vue-enum,拒絕出現魔法數字,代碼不可維護的現象全新的基於前端的權限設計
  • 「樂高」訴「樂拼」案判決:「樂拼」賠470萬元
    廣州日報訊 (全媒體記者章程 通訊員梁豔華)「樂高」起訴「樂拼」侵權案有了終審判決。記者昨日獲悉,廣州智慧財產權法院對「樂高」訴「樂拼」侵犯著作權及不正當競爭糾紛共19宗系列案作出「駁回上訴,維持原判」的終審判決,「樂拼」需向「樂高」賠償470萬元。
  • 聯商頭條:松鼠拼拼裁員2/3 星力集團推出樂品便利
    松鼠拼拼裁員2/3 曾想超越拼多多 近日,近一年來在社區拼團賽道上一路高歌猛進的松鼠拼拼被曝大裁員。在此之前,松鼠拼拼員工總量一度超越2000人,裁後縮水約三分之二。關於松鼠拼拼突然進行人員緊縮的原因,數位內部員工認為原因有二:其一,松鼠拼拼原本計劃收購另一家社區團購品牌「你我您」,並已經派審計部門入駐「你我您」進行核算和查帳,收購過程中發現「你我您」本身現金流並不健康,松鼠拼拼已經幫其償還部分債款,導致自身現金流愈發緊張;其二,松鼠拼拼自身融資失利。
  • 拼顏值 拼才華?伊旗疫情防護拼圖小遊戲來了
    拼顏值 拼才華?伊旗疫情防護拼圖小遊戲來了 2021-01-16 13:27 來源:澎湃新聞·澎湃號·政務
  • 「樂高」訴「樂拼」系列案終審:「樂拼」賠470萬元!
    記者今天(4月21日)從廣州市越秀區法院獲悉,日前,廣州智慧財產權法院對「樂高」訴「樂拼」侵犯著作權及不正當競爭糾紛共19宗系列案作出「駁回上訴,維持原判」的終審判決。據此,「樂拼」需向「樂高」賠償470萬元,這一場「玩具王國」的糾紛終於落下了帷幕。
  • 貝殼鏈商老項目,新出一個拼拼樂環節,下面玩法如下,實驗期我先提你們試試水
    🔴🔴🔴貝殼拼拼樂五大獎項:  1⃣拼團參與獎20人參團,每人投100,1人中獎,19人不中不中的,返101元中獎的,返1元+產品累計中5次,返一個廣告分紅包,無論中還是不中,都可以提成0.25--1元,團隊大的話,每天團隊參與拼團的人多,按次數計佣金,那麼,單單是團隊佣金,一天收入破萬破十萬!!!
  • 阿里國內消費者已接近10億、拼多多直播加大馬力、日日順樂農攜手...
    據悉,改版後,拼多多APP底部的第二個Tab將由現在的「關注」改為「直播」,用戶點擊這個Tab就可進入一個專門呈現商家直播的廣場。商家只要做到封面優質、標題優質、有直播間互動、有粉絲回放就可以獲得直播廣場浮現權。 「這意味著多多直播將有一個公域流量入口了。」
  • 魔獸世界憎惡拼拼樂任務怎麼完成 最難得地方在於找到拉薩恩和獲得...
    魔獸世界憎惡拼拼樂任務怎麼完成 最難得地方在於找到拉薩恩和獲得零件時間:2020-12-09 13:32   來源:網易娛樂   責任編輯:凌君 川北在線核心提示:原標題:魔獸世界憎惡拼拼樂任務怎麼完成 最難得地方在於找到拉薩恩和獲得零件 魔獸世界9.0重開放了憎惡工廠,玩家需要完成憎惡拼拼樂的任務。
  • vue輪播圖實現
    其中數據為定義的模擬數據,接下來是代碼的實現過程:1、使用swiper插件:vue-awesome-swiper(Github上搜索相對應插件)2、下載插件到項目內:npm install vue-awesome-swiper@2.6.7 --save //(@x.x.x表示插件版本)3、全局下(main.js)引入:import VueAwesomeSwiper from 'vue-awesome-swiper'import
  • 精通React/Vue系列之帶你實現一個功能強大的通知提醒框
    本文將會使用React來開發該組件,也會使用到Javascript中常用的一些設計模式,比如單例模式,但是不管你使用什麼框架來實現,原理都是通用的,如果感興趣的朋友可以用vue也實現以一下。, 會得出如下線框圖:其實通知提醒框要考慮的東西挺多的,所以在設計組件之前,一定要想理清需求和功能劃分,這樣才能有條不絮的去實現它,和我們實現一個複雜系統是一樣的,一個組件就是一個小系統。
  • 美好生活拼圖盡在「拼啦」
    導語:一款基於位置的拼圖手遊,一款基於拼圖的社交APP,一組依託移動網際網路的虛擬數據,一張捏在手裡的商品打折卷。虛擬還是現實?手遊還是社交?面對日益成熟的APP市場,「拼啦」怎樣拼出一個未來?
  • 淘寶拼團是什麼意思 淘寶拼團操作方法【詳細介紹】
    淘寶拼團是淘寶近日即將上線的一種新玩法「拼團」,不了解淘寶拼團是什麼意思?淘寶拼團有優惠嗎?淘寶拼團怎麼玩?的小夥伴們,下面一起來了解一下吧。 淘寶拼團是什麼意思? 淘寶拼團是淘寶網新增的一種營銷活動工具,買家通過自身分享邀請好友組團,成團後可享受賣家商品的讓利。