Vue實現(xiàn)Chrome小恐龍游戲的示例代碼
前言
幾年前,Google 給 Chrome 瀏覽器加了一個有趣的彩蛋:如果你在未聯(lián)網(wǎng)的情況下訪問網(wǎng)頁,會看到 “Unable to connect to the Internet” 或 “No internet” 的提示,旁邊是一只像素恐龍。

許多人可能覺得這只恐龍只是一個可愛的小圖標(biāo),在斷網(wǎng)的時候陪伴用戶。但是后來有人按下空格鍵,小恐龍開始奔跑!

這只可愛的小恐龍是設(shè)計師 Sebastien Gabriel 的作品。他在一次訪談中說,他覺得沒有 wifi 的年代就像是史前時代,很多人都已經(jīng)忘記那個只能在公司、學(xué)?;蛘呔W(wǎng)吧才能上網(wǎng)的年代,所以他就以史前時代的代表——恐龍,作為斷網(wǎng)的圖標(biāo)。
本文的主要內(nèi)容就是如何使用Vue實現(xiàn)這個小彩蛋游戲,感興趣的同學(xué)可以直接看下效果:游戲地址
復(fù)刻畫面

我們首先把這個小游戲的樣式擺出來,可以看出,主要包括下面幾種元素
- 恐龍
- 路面
- 云彩
- 障礙物
- 積分
主要就是這些內(nèi)容,我們通過css將其放在合適的位置即可
動畫效果
路面動畫
在初步將小游戲的畫面復(fù)刻了之后,我們需要把畫面動起來,可以看出,其實在游戲過程中,小恐龍水平方向是不動的,只是路面一直在平移,看起來小恐龍在移動了,因此我們需要給路面添加動畫效果
get roadStyle() {
return { transform: `translateX(${this.roadTranslate}px)` };
}
startGamerInterval() {
clearInterval(this.timer);
this.timer = setInterval(() => {
if (this.gameStatus === GameStatus.RUNNING) {
this.updateGameStatus();
}
}, 100);
}
updateGameStatus() {
if (this.roadTranslate <= -600) {
this.roadTranslate = 0;
}
this.roadTranslate -= GameConfig.ROAD_VELOCITY;
//...
}可以看出,主要是通過setInterval啟動一個定時任務(wù),然后在其中修改roadTranslate即可
障礙物動畫
障硬物同樣會隨著路面一起做水平移動,這部分跟路面的動畫部分基本一樣,不同的部分在于,障礙物可能有1棵樹或者多棵樹,這其實是通過雪碧圖和background-position實現(xiàn)的,通過雪碧圖可以有效的減少我們的切圖數(shù)量
updateGameStatus() {
this.treeItems.forEach((item) => {
if (item.treeTranslateX < 0) {
const isBigTree = GetRandomNum(0, 100) % 2 ? true : false;
const itemWidth = isBigTree ? 25 : 17;
const itemHeight = isBigTree ? 50 : 35;
const itemCount = GetRandomNum(1, 3);
const offsetPosition = GetRandomNum(0, 2);
item.treeTranslateX = GetRandomNum(600, 1200);
item.isBigTree = isBigTree;
item.width = itemWidth * itemCount;
item.height = itemHeight;
item.backgroundPosition = -itemWidth * offsetPosition;
} else {
item.treeTranslateX -= GameConfig.TREE_VELOCITY;
}
});
}同樣是定時在updateGameStatus中修改障礙物的treeTranslateX,不同之處在于障礙物還需要通過隨機樹設(shè)置寬度與backgroundPosition。
同時當(dāng)treeTranslateX < 0時,說明障礙物已經(jīng)運行過去了,這時還需要重置狀態(tài)
恐龍動畫
除了路面背景在移動之外,為了讓恐龍看起來在移動,我們還需要給恐龍?zhí)砑觿赢嬓Ч?,其實就是通過切換圖片,讓恐龍看起來在跑步,這也是通過雪碧圖實現(xiàn)的。
除此之外,還有就是當(dāng)我們按下空格鍵時,恐龍需要做一個跳躍動畫
updateGameStatus() {
if (this.rexItem.isInJump) {
//跳躍動畫
this.rexItem.rexTranslateY -= this.rexItem.rexVelocity;
if (this.rexItem.rexTranslateY <= -GameConfig.REX_MAX_JUMP) {
this.rexItem.rexVelocity = -GameConfig.REX_VELOCITY;
} else if (this.rexItem.rexTranslateY >= 0) {
this.rexItem.isInJump = false;
this.rexItem.rexTranslateY = 0;
this.rexItem.rexVelocity = 0;
}
} else {
//跳步動畫
if (this.rexItem.rexBackgroundPostion <= -220) {
this.rexItem.rexBackgroundPostion = 0;
} else {
this.rexItem.rexBackgroundPostion -= 44;
}
}
}如上,主要就是跑步與跳躍動畫,其中跳躍動畫在達到最大高度后,需要修改速度的方向
響應(yīng)事件
在這個小游戲中,我們還需要響應(yīng)鍵盤事件
- 游戲未開始時,按空格鍵開始
- 游戲中,按空格鍵跳躍
- 游戲結(jié)束后,按空格鍵重新開始
created() {
window.addEventListener("keyup", this.submit);
}
submit(event: KeyboardEvent) {
if (event.code === "Space") {
if (
this.gameStatus === GameStatus.WAIT ||
this.gameStatus === GameStatus.END
) {
this.gameStatus = GameStatus.RUNNING;
this.initGame();
this.startGame();
} else if (this.gameStatus === GameStatus.RUNNING) {
if (this.rexItem.rexTranslateY === 0) {
if (this.rexItem.isInJump === false) {
this.rexItem.isInJump = true;
this.rexItem.rexVelocity = GameConfig.REX_VELOCITY;
}
}
}
}
}碰撞檢測
在完成畫面復(fù)刻與讓畫面動起來之后,接下來要做的就是恐龍與障礙物的碰撞檢測了,這其實就是判斷兩個矩形有沒有相交。我們可以通過判斷不重疊的情況,然后取反就可以

isOverlap(rect1: Rect, rect2: Rect) {
const startX1 = rect1.x;
const startY1 = rect1.y;
const endX1 = startX1 + rect1.width;
const endY1 = startY1 + rect1.height;
const startX2 = rect2.x;
const startY2 = rect2.y;
const endX2 = startX2 + rect2.width;
const endY2 = startY2 + rect2.height;
return !(
endY2 < startY1 ||
endY1 < startY2 ||
startX1 > endX2 ||
startX2 > endX1
);
}部署
通過以上步驟,我們的小游戲就基本開發(fā)完成了,接下來就是部署了,在沒有自己的服務(wù)器的情況下,我們可以利用GitHub Pages來部署我們的項目
我們將打包出來的dist目錄作為Github Pages的根目錄,從而實現(xiàn)發(fā)布與部署。關(guān)于Vue項目打包部署到GitHub Pages的具體步驟,可以參考:Vue項目打包部署到GitHub Pages
總結(jié)
代碼地址:https://github.com/shenzhen2017/vue-rex
游戲地址:shenzhen2017.github.io/vue-rex/
到此這篇關(guān)于Vue實現(xiàn)Chrome小恐龍游戲的示例代碼的文章就介紹到這了,更多相關(guān)Vue Chrome小恐龍游戲內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue3+Vite+ElementPlus管理系統(tǒng)常見問題
本文記錄了使用Vue3+Vite+ElementPlus從0開始搭建一個前端工程會面臨的常見問題,沒有技術(shù)深度,但全都是解決實際問題的干貨,可以當(dāng)作是問題手冊以備后用,感興趣的朋友參考下2023-12-12
詳解關(guān)于vue2.0工程發(fā)布上線操作步驟
這篇文章主要介紹了詳解關(guān)于vue2.0工程發(fā)布上線操作步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-09-09
Vue學(xué)習(xí)之a(chǎn)xios的使用方法實例分析
這篇文章主要介紹了Vue學(xué)習(xí)之a(chǎn)xios的使用方法,結(jié)合實例形式分析了vue.js axios庫的功能及網(wǎng)絡(luò)請求相關(guān)操作技巧,需要的朋友可以參考下2020-01-01
vue實現(xiàn)自定義"模態(tài)彈窗"組件實例代碼
頁面中會有很多時候需要彈窗提示,我們可以寫一個彈窗組件,下面這篇文章主要給大家介紹了關(guān)于vue實現(xiàn)自定義"模態(tài)彈窗"組件的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2021-12-12

