基於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數據可視化等前端知識和實戰,歡迎在《趣談前端》一起學習討論,共同探索前端的邊界。

相關焦點

  • 兒童積木遊戲對稱拼拼樂
    今天給大家介紹一款積木遊戲,叫積木對稱拼拼樂。遊戲規則:準備兩塊一樣的薄片積木底板家長在其中一塊積木底板上隨機搭建積木孩子則在另一塊積木底板上搭建出與家長相同顏色與形狀的對稱積木親子相互交換角色,用時最短者獲勝!
  • 拼樂手遊APP:玩著賺錢可好?
    口袋那麼小,誰都走不了。如果你還執迷不悔,僅沉醉於「年近花甲」的網際網路中,對「豆蔻之年」的移動互聯無動於衷,那麼口袋只能一掏見底,兩手空空。如今早已不是「大門不出,二門不邁」的時代,只有走出去,動起來,才能看見一片世外桃源。  移動互聯時代,手握一臺智慧型手機你就可以網絡天下之事,聚精會神於巴掌大的小屏之上,你就可以上知天文,下知地理。
  • 《精通react/vue組件設計》之快速實現一個可定製的進度條組件
    今天要來實現一個高可定製的進度條組件,在介紹組件設計之前,我們先牢記以下幾個原則.每一個組件只負責某一特定的表現或者功能)正文在開始組件設計之前希望大家對css3和js有一定的基礎.我們先看看實現後的組件效果:上圖可以知道封裝後的進度條組件通過對外暴露的接口(react/vue裡面可以看做
  • funlock歡樂客美食拼拼樂,超大腦洞,邊看邊拼,鍛鍊自主學習能力!
    說起「過家家」,真的是我們小時候和現在的娃都愛的遊戲,這個看似普通得不能再普通的遊戲,裡面可有大學問。
  • 被「玩壞」了的拼多多:一文看懂拼多多是怎樣把遊戲化運營做到極致的
    但拼多多的遊戲化,是基於對用戶心理的深入洞察,否則它也難以在淘寶和京東的夾擊中,殺出一條血路。跳出抽象的概念,回歸到產品本身,我們可以借用「八角行為分析法」,來拆解拼多多的遊戲內核。基於此觀點,他將用戶的心理量化總結為8種核心驅動力,並創建出遊戲化設計框架——八角行為分析法,此方法從心理角度對一個遊戲化產品進行設計和評測。接下來,我們將用這種方法對拼多多每一個模塊的遊戲化內核進行拆解。
  • 精通React/Vue系列之帶你實現一個功能強大的通知提醒框
    本文將會使用React來開發該組件,也會使用到Javascript中常用的一些設計模式,比如單例模式,但是不管你使用什麼框架來實現,原理都是通用的,如果感興趣的朋友可以用vue也實現以一下。, 會得出如下線框圖:其實通知提醒框要考慮的東西挺多的,所以在設計組件之前,一定要想理清需求和功能劃分,這樣才能有條不絮的去實現它,和我們實現一個複雜系統是一樣的,一個組件就是一個小系統。
  • 精通react/vue組件設計之配合React Portals實現一個(Drawer)組件
    通過組件的設計過程,大家會接觸到一個完成健壯的組件設計思路和方法,也能在實現組件的過程逐漸對react/vue的高級知識和技巧有更深的理解和掌握,並且在企業實際工作做遊刃有餘.通過以上需求分析, 是不是覺得一個抽屜組件要實現這麼多功能很複雜呢?
  • 拼多多"鬧革命":"遊戲式"運營和製造"爆品"
    01 拼多多前傳我想先說說拼多多的「前傳」,看看整個產業大環境的變化是如何給它留出崛起空間的。一個企業家朋友告訴我,大概在2011年底到2012年上半年,阿里做過一個判斷,認為淘寶的用戶數可能再漲三四年就要見頂了,所以它覺得中國電商的大格局基本已定,就是它和京東兩分天下。基於這個判斷,阿里開始針對現有的流量做更精細化的運營。
  • 拼多多產品分析:社交與低價的遊戲化狂歡
    在中國經濟持續增長,連續三年成為最大奢侈品市場,有關消費升級的討論紛紛不絕的時候,為何殺出的黑馬卻是主張便宜實惠的拼多多?此分析報告基於拼多多的三大產品核心:價格刺激、社交傳播、遊戲化體驗進行探討。一、產品簡介拼多多是一款移動電商APP,核心功能是為用戶提供高性價比商品以及互動的購物體驗。
  • 拼多多iPhone12是什麼意思什麼梗?拼多多iPhone12事件始末
    拼多多iPhone12是什麼意思什麼梗?拼多多iPhone12事件始末時間:2020-10-23 17:06   來源:遊俠網   責任編輯:沫朵 川北在線核心提示:原標題: 拼多多iPhone12是什麼梗?
  • 下一個拼多多?智能分發+C2B 觸寶旗下瘋讀是網文界的拼多多嗎?
    隨著免費閱讀的興起,網絡文學閱讀市場的新增用戶幾乎都流向了免費閱讀,但是免費閱讀模式在發展上BUG不小。拼多多基於算法對SKU的精準推薦,使有限SKU形成爆款,商家以價換量獲得收入,用戶獲得了實惠價格,而拼多多則通過低價獲得了流量。
  • 精通react/vue組件設計之實現一個Tag(標籤)和Empty(空狀態)組件
    今天主要帶大家一起實現一個Tag組件和Empty(空狀態)組件,在介紹組件設計之前,先給大家介紹一個免費開源的圖標庫icomoon,可以在線導入SVG格式字體,並進行編輯,然後下載來使用,在組件設計中有具體的使用介紹.
  • Vue框架之生命周期鉤子
    學習計劃安排如下:Vue的深入學習,emm準確地說還不能算是深入學習,我有點高估自己的學習進度了。本來打算兩天時間做一個基礎入門的,畢竟教程也就一天的內容,看來計劃趕不上變化。vue中三大常用屬性的小結、生命周期鉤子的了解,以及指令的初步接觸。指令有點多,只能留到明天繼續補全了。
  • vuex實現預熱篇-vue插件開發
    #泛舟計劃·讓知識更好看#1.如何引用vue插件呢?Vue.use(Vuex)2.use做了什麼事呢?了解了以上的用法,那麼咱就知道大概的結構怎麼寫了吧,來先構造下結構// Myplugin作為對象傳入const MyLoggerPlugin = {}// Vue 就是Vue這個構造函數,options是插件傳入的參數MyLoggerPlugin.install = function(Vue, options) {console.log(Vue, options) //輸出的就是vue
  • |評測|樂拼積木 16009安妮女王復仇號(紅船)
    「樂拼16009紅船復刻的還是比較成功的,對比之後可以發現蠻多亮點,拼砌手感依舊,特殊零件值得擁有,作為主題產物,正品又絕版蠻長時間了
  • 騰訊再拼,也拼不出下一個拼多多
    出品 | 虎嗅大商業組作者 | 李玲5月初,一款主打內容電商的小程序「小鵝拼拼」悄然上線,其公眾號運營主體表明了後臺——深圳市騰訊計算機系統科技有限公司。騰訊告訴虎嗅,小鵝拼拼是PCG(平臺與內容事業群)戰略管理中心的一個團隊做的。這是一個以拼單為主要購物形式的產品,其銷售的商品通常低於該商品的市場價格。與同樣主打拼單的拼多多不同在於,小鵝拼拼的商品以一種類似於評價內容分享的形式在首頁展示,購買詳情頁中也沒有個人單獨購買的選項。
  • 拼多多的烏託邦
    在展望拼多多的未來時,黃崢提到「(拼多多)它將是一個由分布式智能代理網絡(而非時下流行的集中式超級大腦型AI系統)驅動的「Costco」和「迪士尼」(即集高性價比產品和娛樂為一體)的結合體」。這樣雲裡霧裡的描述,外界很少有人看得懂,網上一片冷嘲熱諷,認為拼多多說了一個浮誇、不切實際的的故事;甚至,連黃崢也承認這是「烏託邦式的描述」。
  • 誰是下一個淘寶拼多多?
    零售行業愈演愈烈,從衣帽鞋襪、玩具禮品一應俱全的淘寶、到專注電器的京東,從微信分享成長起來的拼多多、到鄰裡粘性建立的拼團模式;電商從全品類逐漸覆蓋到我們生活的每一步傳統的零售模式,大多都是廠家先生產,壓貨給經銷商
  • Steam限時免費領取休閒拼圖遊戲《趣拼拼:肖像畫》
    據IT之家網友投稿,Steam遊戲平臺目前可以限時免費領取休閒拼圖遊戲《趣拼拼:肖像畫》,在3月27日上午5:00前獲取該商品,即可免費保留。IT之家獲悉,《Pleasure Puzzle:Portrait 趣拼拼:肖像畫》是由國產獨立遊戲製作人冷笑黑妖製作的一款休閒拼圖遊戲。現已在Steam上開放了限時免費領取,遊戲支持中文,目前Steam商店好評率為97%。
  • 拼樂樂拼團|生財有道,一招教你擺脫負債
    拼樂樂拼團正是基於雙贏的初衷,讓利用戶開展低成本「微創業」,提升用戶的收益與價值!平臺專屬供貨+一站式管家銷售,看得見的安心便捷拼樂樂拼團是一個專注於拼團購買商品服務的平臺,給用戶提供了創新的購物方式和一站式管家服務。