gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

站長資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

聊聊如何利用uniapp開發(fā)一個貪吃蛇小游戲!

如何利用uniapp開發(fā)一個貪吃蛇小游戲?下面本篇文章就手把手帶大家在uniapp中實現(xiàn)貪吃蛇小游戲,希望對大家有所幫助!

聊聊如何利用uniapp開發(fā)一個貪吃蛇小游戲!

第一次玩貪吃蛇還隱約記得是?️后父親給我玩的第一個游戲

該小游戲使用uniapp開發(fā)

前置詳細內(nèi)容就不細說了詳細看:https://juejin.cn/post/7085727363547283469#heading-14

游戲演示

聊聊如何利用uniapp開發(fā)一個貪吃蛇小游戲!

代碼結(jié)構(gòu)

詳細代碼結(jié)構(gòu)如果需要請到github查看

主要分為:開始游戲、地塊、蛇身、蟲子、污染地塊,游戲音效

<template> 	<view ref="body" class="content"> 		<view>蛇蛇目前:{{snakes.length}}米長</view> 		<view class="game-field">                 <!-- 地面板塊 --> 		  <view class="block"  v-for="(x, i) in blocks" :key="i"></view> 		</view>                     <view v-show="!started || ended" class="game-board-wrap">                         <view v-show="!started" class="game-board">                             <view class="title">選擇游戲難度</view>                             <radio-group name="radio" @change="bindLevelChange">                                 <label class="label">                                     <radio value="1" :checked="level==1" /><text>簡單模式</text>                                 </label>                                 <label class="label">                                     <radio value="2" :checked="level==2" /><text>正常模式</text>                                 </label>                                 <label class="label">                                     <radio value="3" :checked="level==3" /><text>困難模式</text>                                 </label>                                 <label class="label">                                     <radio value="4" :checked="level==4" /><text>地獄模式</text>                                 </label>                             </radio-group>                             <button type="primary" @click="start">開始游戲</button>                         </view> 			<view v-show="ended" class="settle-board">                             <view class="title">游戲結(jié)束</view>                             <view class="result">您的蛇蛇達到了{{snakes.length}}米</view>                             <view class="btns">                                 <button type="primary" @click="reStart">再次挑戰(zhàn)</button>                                 <button type="primary" plain @click="rePick">重選難度</button>                             </view> 			</view> 		</view> 	</view> </template> <script> export default {     data() {             return {                 blocks: [], // 板塊                 worms: [], // 蟲子                 snakes: [0, 1, 2, 3], // 蛇身                 direction: "right", // 蛇移動方向             };     },     onLoad() {         this.initGame();     },     methods: {         initGame() {             this.blocks = new Array(100).fill(0); // 生成100個地面板塊             this.worms = [Math.floor(Math.random() * 96) + 4]; // 隨機生成蟲子             this.snakes = [0, 1, 2, 3]; // 初始化蛇身位置         }     } } </script>

渲染蛇身

給我們的蛇穿上他的外衣 蛇身的渲染根據(jù)snakes(里邊放著蛇的身體)來匹配地面板塊的索引 從而找到對應的格格并修改背景圖來渲染蛇身 蛇頭和蛇尾就是取snakes第0位和最后一位 并找到對應的格格修改當前背景圖

<template>     <view class="game-field">         <view class="block" :style="`background-image: ${bg(x, i)}" v-for="(x, i) in blocks" :key="i">         </view>     </view> </template> <script> import worm from "worm.png"; import snakeBody from "snake_body.png"; import snakeHead from "snake_head.png"; import snakeTail from "snake_tail.png"; import polluteBlock from "pollute.png"; import wormBoom from "worm_4.png"; export default {     methods: {         bg(type, index) {             let bg = "";             switch (type) {                 case 0: // 地板                     bg = "unset";                     break;                 case 1: // 蟲子                     if (this.boom) {                             bg = `url(${wormBoom})`;                     } else {                             bg = `url(${worm})`;                     }                     break;                 case 2: // 蛇                     let head = this.snakes[this.snakes.length - 1];                     let tail = this.snakes[0];                     if (index === head) {                             bg = `url(${snakeHead})`;                     } else if (index === tail) {                             bg = `url(${snakeTail})`;                     } else {                             bg = `url(${snakeBody})`;                     }                     break;                 case 3: // 污染的地塊                     bg = `url(${polluteBlock})`;                     break;             }             return bg;         },     } } </scipt>

控制蛇的方向

控制蛇的方向pc端我們通過監(jiān)聽鍵盤事件找到對應的鍵盤鍵的編碼上下左右來改變蛇的方向 而手機端我們通過touch時間手指觸摸點及滑動點的XY軸值來判斷蛇的方向

<template> <view ref="body" class="content" @keyup.left="bindLeft" @keyup.right="bindRight" @keyup.down="bindDown" @keyup.up="bindUp" @touchstart="handleTouchStart" @touchmove="handleTouchMove">     <view>蛇蛇目前:{{snakes.length}}米長</view>     <view class="game-field">         <view class="block" :style="`background-image: ${bg(x, i)}; v-for="(x, i) in blocks" :key="i"></view>     </view> </view> </template> <script>     export default {         data(){             return {                 direction: "right",                 started: false, // 游戲開始了                 ended: false, // 游戲結(jié)束了                 level: 1, // 游戲難度                 lastX: 0,                 lastY: 0,             }         },         onLoad() {             this.initGame();         },         methods:{             initGame() {                 this.blocks = new Array(100).fill(0); // 生成100個地面板塊                 this.worms = [Math.floor(Math.random() * 96) + 4]; // 隨機生成蟲子                 this.snakes = [0, 1, 2, 3]; // 初始化蛇身位置                 document.onkeydown = (e) => {                     switch (e.keyCode) { // 獲取當前按下鍵盤鍵的編碼                         case 37: // 按下左箭頭鍵                             this.bindLeft();                             break;                         case 39: // 按下右箭頭鍵                             this.bindRight();                             break;                         case 38: // 按下上箭頭鍵                             if (!this.started) {                                     this.level--;                             } else {                                     this.bindUp();                             }                             break;                         case 40: // 按下下箭頭鍵                             if (!this.started) {                                     this.level++;                             } else {                                     this.bindDown();                             }                             break;                     }                 }             },             handleTouchStart(e) {                 // 手指開始位置                 this.lastX = e.touches[0].pageX;                 this.lastY = e.touches[0].pageY;             },             handleTouchMove(e) {                 let lastX = e.touches[0].pageX; // 移動的x軸坐標                 let lastY = e.touches[0].pageY; // 移動的y軸坐標                  let touchX = lastX - this.lastX;                 let touchY = lastY - this.lastY                 if (Math.abs(touchX) > Math.abs(touchY)) {                 if (touchX < 0) {                     if(this.direction === "right") return;                     this.direction = 'left'                     } else if (touchX > 0) {                         if(this.direction === "left") return;                         this.direction = 'right'                     }                 } else {                     if (touchY < 0) {                         if(this.direction === "down") return;                         this.direction = 'up'                     } else if (touchY > 0) {                         if(this.direction === "up") return;                         this.direction = 'down'                     }                 }                 this.lastX = lastX;                 this.lastY = lastY;             },             bindUp() {                 if (this.direction === "down") return;                 this.direction = "up";             },             bindDown() {                 if (this.direction === "up") return;                 this.direction = "down";             },             bindLeft() {                 if (this.direction === "right") return;                 this.direction = "left";             },             bindRight() {                 if (this.direction === "left") return;                 this.direction = "right";             },         }     } </script>

給貪吃蛇添加音效

添加游戲音效游戲代入感就強了很多 現(xiàn)在我們要給蛇加上背景音樂、點擊交互音樂、蛇隔兒屁的音樂、蛇吃掉食物的音樂、蟲子爆炸倒計時的音樂和蟲子爆炸的音樂

先給添加上背景音樂 總有刁民可以玩到地圖滿為止 背景音樂的話要loop播放 我們只需要 使用uni.createInnerAudioContext來創(chuàng)建并返回內(nèi)部 audio 上下文 innerAudioContext 對象 拿到音樂的路徑并且設置自動播放

<script> import bgm from 'bgm.mp3'; export default {     data(){         return {             bgmInnerAudioContext:null,         }     },     methods:{         start() { // 開始游戲             this.initGame();             this.handleBgmVoice()         },         handleBgmVoice() {             // 背景音樂             this.bgmInnerAudioContext = uni.createInnerAudioContext() // 創(chuàng)建上下文             this.bgmInnerAudioContext.autoplay = true; // 自動播放             this.bgmInnerAudioContext.src= bgm; // 音頻地址             this.bgmInnerAudioContext.loop = true; // 循環(huán)播放         }     } } <script>

背景音樂確實響起來了 蛇gameover后還一直響 頓時我聽著就不耐煩 這時我們在蛇gameover后暫停背景音樂pause音樂會暫停而不會清楚

<script> import bgm from 'bgm.mp3'; export default {     data(){         return {             bgmInnerAudioContext:null,         }     },     methods:{         start() { // 開始游戲             this.initGame();             this.handleBgmVoice()         },         handleBgmVoice() {             // 背景音樂             this.bgmInnerAudioContext = uni.createInnerAudioContext() // 創(chuàng)建上下文             this.bgmInnerAudioContext.autoplay = true; // 自動播放             this.bgmInnerAudioContext.src= bgm; // 音頻地址             this.bgmInnerAudioContext.loop = true; // 循環(huán)播放         }         checkGame(direction, next) {             let gameover = false;             let isSnake = this.snakes.indexOf(next) > -1;             let isPollute = this.pollutes.indexOf(next) > -1;             // 撞到蛇和被污染的地塊游戲結(jié)束             if (isSnake || isPollute) {                 gameover = true;             }             // 撞到邊界游戲結(jié)束             switch (direction) {                 case "up":                     if (next < 0) {                             gameover = true;                     }                     break;                 case "down":                     if (next >= 100) {                             gameover = true;                     }                     break;                 case "left":                     if (next % 10 === 9) {                             gameover = true;                     }                     break;                 case "right":                     if (next % 10 === 0) {                             gameover = true;                     }                     break;             }             return gameover;         },         toWards(direction) {             let gameover = this.checkGame(direction, next);             if (gameover) {                 this.ended = true;                 this.handleDieVoice()                 this.bgmInnerAudioContext.pause() // 游戲結(jié)束 暫停背景音樂                 clearInterval(this.timer);                 clearInterval(this.boomTimer);             } else {                 // 游戲沒結(jié)束                 this.snakes.push(next);                 let nextType = this.blocks[next];                 this.blocks[next] = 2;                 // 如果是空白格                 if (nextType === 0) {                     this.snakes.shift();                 } else {                     // 如果是蟲子格                     this.handleEatVoice() // 吃掉蟲子后的音樂                     this.worms = this.worms.filter((x) => x !== next);                     let nextWorm = this.createWorm();                     this.worms.push(nextWorm);                 }                 this.blocks[tail] = 0;                 this.paint();             }         },     } } <script>

首個音樂添加成功其他的也就簡單多了 蟲子爆炸倒計時也需要爆炸或者gameover后需要清楚倒計時音效stop(下次播放會從頭開始) 剩余的不需要清楚音效和循環(huán)播放 下面附上剩余的代碼

<script> export default {     data() {         return {              bgmInnerAudioContext:null,              clockInnerAudioContext:null,         }     },     watch: {         boomCount(val) {             if (val === 0) {                 // 超過爆炸時間還沒吃到,則將蟲子格子變成被污染的土地,并且重置爆炸狀態(tài),同時生成一只新的蟲子:                 this.handleExplodeVoice() // 爆炸的音樂                 this.clockInnerAudioContext.stop() // 清楚倒計時音樂                 const boomWorm = this.worms.pop();                 this.pollutes.push(boomWorm);                 this.blocks[boomWorm] = 3; // 被污染的地方我們用3表示                 this.boom = false;                 this.worms.push(this.createWorm());             }         }     },     methods:{         // 蛇吃到食物后的聲音         handleEatVoice() {             const innerAudioContext = uni.createInnerAudioContext();             innerAudioContext.autoplay = true;             innerAudioContext.src = eatVoice;         },         // 蟲子污染爆炸后的聲音         handleExplodeVoice(){             const innerAudioContext = uni.createInnerAudioContext();             innerAudioContext.autoplay = true;             innerAudioContext.src = explodeVoice;         },         // 游戲背景音樂         handleBgmVoice() {             this.bgmInnerAudioContext = uni.createInnerAudioContext()             this.bgmInnerAudioContext.autoplay = true;             this.bgmInnerAudioContext.src= bgm;             this.bgmInnerAudioContext.loop = true;         },         // 按鈕點擊的聲音         handleClickVoice() {             const innerAudioContext = uni.createInnerAudioContext()             innerAudioContext.autoplay = true;             innerAudioContext.src= click;         },         // 爆炸倒計時的聲音         handleClockVoice() {             this.clockInnerAudioContext = uni.createInnerAudioContext()             this.clockInnerAudioContext.autoplay = true;             this.clockInnerAudioContext.src= clock;         },         // 蛇gameover后的聲音         handleDieVoice() {             const innerAudioContext = uni.createInnerAudioContext()             innerAudioContext.autoplay = true;             innerAudioContext.src= die;         },         checkGame(direction, next) {             let gameover = false;             let isSnake = this.snakes.indexOf(next) > -1;             let isPollute = this.pollutes.indexOf(next) > -1;             // 撞到蛇和被污染的地塊游戲結(jié)束             if (isSnake || isPollute) {                 gameover = true;             }             // 撞到邊界游戲結(jié)束             switch (direction) {                 case "up":                     if (next < 0) {                             gameover = true;                     }                     break;                 case "down":                     if (next >= 100) {                             gameover = true;                     }                     break;                 case "left":                     if (next % 10 === 9) {                             gameover = true;                     }                     break;                 case "right":                     if (next % 10 === 0) {                             gameover = true;                     }                     break;             }             return gameover;         },         paint() {             this.worms.forEach((x) => {                 this.blocks[x] = 1;             });             this.snakes.forEach((x) => {                 this.blocks[x] = 2;             });             this.$forceUpdate();         },         toWards(direction) {             let gameover = this.checkGame(direction, next);             if (gameover) {                 this.ended = true;                 this.handleDieVoice()                 this.bgmInnerAudioContext.pause() // 游戲結(jié)束 暫停背景音樂                 this.clockInnerAudioContext && this.clockInnerAudioContext.stop() // 清楚倒計時音樂                 clearInterval(this.timer);                 clearInterval(this.boomTimer);             } else {                 // 游戲沒結(jié)束                 this.snakes.push(next);                 let nextType = this.blocks[next];                 this.blocks[next] = 2;                 // 如果是空白格                 if (nextType === 0) {                     this.snakes.shift();                 } else {                     // 如果是蟲子格                     this.handleEatVoice() // 吃掉蟲子后的音樂                     this.worms = this.worms.filter((x) => x !== next);                     let nextWorm = this.createWorm();                     this.worms.push(nextWorm);                 }                 this.blocks[tail] = 0;                 this.paint();             }         },         // 生成下一只蟲子         createWorm() {             this.boom = false;             let blocks = Array.from({                     length: 100             }, (v, k) => k);             // 在不是蛇和被污染的地方生成蟲子             let restBlocks = blocks.filter(x => this.snakes.indexOf(x) < 0 && this.pollutes.indexOf(x) < 0);             let worm = restBlocks[Math.floor(Math.random() * restBlocks.length)];             // 根據(jù)游戲難度,概率產(chǎn)出會爆炸的蟲子:             this.boom = Math.random() / this.level < 0.05;             // 生成了新蟲子說明吃到了那個爆炸的蟲子,重置下爆炸             if (this.boom) {                 this.boomCount = 10;                 this.boomTimer && clearInterval(this.boomTimer);                 this.handleClockVoice()                 this.boomTimer = setInterval(() => {                         this.boomCount--;                 }, 1000)             } else {                 this.clockInnerAudioContext && this.clockInnerAudioContext.stop()                 clearInterval(this.boomTimer);             }             return worm;         },     } } <script>

結(jié)語

特別鳴謝@大帥老猿@末世未然 感謝大帥老師的帶隊及指導以及每天的督促,也特別的感謝隊友的幫助及支持

源碼地址:https://github.com/MothWillion/snake_eat_worm

原文地址:https://juejin.cn/post/7087525655478272008

作者:Sophora

推薦:《uniapp教程》

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
波多野结衣xxxx| 亚洲少妇第一页| 九色porny自拍| 全黄性性激高免费视频| 浓精h攵女乱爱av| 国产黄色片免费在线观看| 一区二区三区韩国| 日本丰满少妇xxxx| 污免费在线观看| 亚洲三级视频网站| 国产免费黄色一级片| www.午夜色| 久久99爱视频| 最近免费观看高清韩国日本大全| 伊人精品视频在线观看| 国产麻花豆剧传媒精品mv在线| 日本三日本三级少妇三级66| 天天干天天av| 美女网站视频黄色| 丰满人妻中伦妇伦精品app| 国产精品av免费观看| 樱空桃在线播放| 中文字幕永久有效| 在线看的黄色网址| 五月婷婷六月丁香激情| 一区二区三区韩国| 国产亚洲欧美在线视频| 男人添女人下部高潮视频在观看| 亚洲国产一二三精品无码| 特黄特黄一级片| 免费成人黄色大片| 99久久国产宗和精品1上映| 国产免费毛卡片| 91丨九色丨蝌蚪| 在线观看免费黄色片| 青青草免费在线视频观看| 国产成人精品免费看在线播放| 亚洲高清视频免费| 看全色黄大色大片| 欧美激情亚洲天堂| 少妇高潮喷水在线观看| 日韩一级片免费视频| 国产美女永久无遮挡| 俄罗斯av网站| 91国产精品视频在线观看| 日本高清一区二区视频| 特色特色大片在线| 国产精品一色哟哟| 免费网站永久免费观看| 午夜啪啪免费视频| 黄色网在线视频| 18岁网站在线观看| 91看片在线免费观看| 人妻av无码专区| 超碰影院在线观看| 樱花草www在线| 久久99久久久久久| 日韩精品视频一二三| 潘金莲一级淫片aaaaaa播放1| 日本福利视频一区| 182午夜在线观看| 欧美大片免费播放| 中文精品无码中文字幕无码专区| ijzzijzzij亚洲大全| 久久9精品区-无套内射无码| 午夜两性免费视频| 性鲍视频在线观看| www国产精品内射老熟女| 日韩欧美黄色大片| 久久亚洲国产成人精品无码区| 成年人免费在线播放| 免费不卡av网站| 爱福利视频一区二区| 激情图片qvod| 中国黄色片免费看| 国产精品一色哟哟| 久久免费看毛片| 久热精品在线播放| 久久久性生活视频| 国产一区一区三区| 超碰在线播放91| 黄色免费视频大全| 轻点好疼好大好爽视频| 色戒在线免费观看| 免费黄色特级片| 久久亚洲中文字幕无码| 久久久成人精品一区二区三区| 无码日韩人妻精品久久蜜桃| 日韩激情视频一区二区| 欧美日韩理论片| 国产精品亚洲二区在线观看| 日韩亚洲欧美视频| 午夜久久久久久久久久久| 想看黄色一级片| 日韩一区二区三区不卡视频| 欧美亚洲国产成人| 久久黄色片视频| 男人插女人视频在线观看| 黄色一级视频播放| 麻豆传媒网站在线观看| 免费久久久久久| 国产精品嫩草影视| 国产精品无码乱伦| 国产又黄又爽免费视频| 99中文字幕在线| 在线观看免费污视频| www.日本在线播放| 九色自拍视频在线观看| 男人添女荫道口喷水视频| 久久出品必属精品| 免费观看黄色大片| 亚洲美女自拍偷拍| 五月六月丁香婷婷| 天天操天天干天天做| 极品粉嫩美女露脸啪啪| 色一情一区二区| 黄色网络在线观看| 18视频在线观看娇喘| 欧美一级爱爱视频| 欧美一区二区激情| 国产 福利 在线| 精品少妇无遮挡毛片| 色一情一区二区三区| 欧美亚洲视频一区| bt天堂新版中文在线地址| 国产3p露脸普通话对白| 欧美日韩第二页| 国产九九在线观看| 熟女视频一区二区三区| 97超碰人人澡| 五月激情婷婷在线| 人妻激情另类乱人伦人妻| 亚洲妇熟xx妇色黄蜜桃| 久久久久久久久影视| 好吊妞无缓冲视频观看| 久久久999免费视频| 免费看黄色一级大片| 波多野结衣在线免费观看| 手机成人av在线| 老司机av福利| 日韩精品一区二区三区电影| 亚洲美免无码中文字幕在线 | 一级黄色在线播放| 中国一级黄色录像| 国产专区在线视频| www.日日操| 蜜臀在线免费观看| 别急慢慢来1978如如2| 国产又粗又大又爽的视频| 男人日女人视频网站| 九九热精品国产| 国产l精品国产亚洲区久久| 久久免费视频2| 一区二区三区韩国| 欧美性受黑人性爽| 免费激情视频在线观看| 免费网站在线观看黄| 久久无码高潮喷水| 日韩精品第1页| 婷婷激情四射五月天| 国产精品999视频| 亚洲综合123| 国模吧无码一区二区三区| 激情在线观看视频| 欧美一级黄色影院| 国产一区二区三区乱码| 久久精品视频在线观看免费| 国产l精品国产亚洲区久久| 国产乱子伦精品视频| 欧美性猛交久久久乱大交小说| 2022中文字幕| 九九九久久久久久久| 国产精品视频黄色| 大陆极品少妇内射aaaaa| 美女黄色片网站| 天堂av2020| 玖玖爱视频在线| 50路60路老熟妇啪啪| 欧美成人三级在线视频| 乱子伦一区二区| 天堂av在线8| 天堂在线中文在线| 极品粉嫩美女露脸啪啪| 亚洲一级片网站| 亚洲三级视频网站| 国内自拍视频网| 国产男女无遮挡| 情侣黄网站免费看| 国产在线青青草| 免费日韩视频在线观看| 成人免费毛片网| 国产精品丝袜久久久久久消防器材| 97超碰人人爱| 少妇一晚三次一区二区三区| 国产精品av免费观看| 国产爆乳无码一区二区麻豆| 日本阿v视频在线观看| 国产精彩视频一区二区| 黄色一级视频在线播放| 国产极品在线视频|