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

站長資訊網
最全最豐富的資訊網站

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

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

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

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

該小游戲使用uniapp開發

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

游戲演示

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

代碼結構

詳細代碼結構如果需要請到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">游戲結束</view>                             <view class="result">您的蛇蛇達到了{{snakes.length}}米</view>                             <view class="btns">                                 <button type="primary" @click="reStart">再次挑戰</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>

渲染蛇身

給我們的蛇穿上他的外衣 蛇身的渲染根據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端我們通過監聽鍵盤事件找到對應的鍵盤鍵的編碼上下左右來改變蛇的方向 而手機端我們通過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, // 游戲結束了                 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>

給貪吃蛇添加音效

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

先給添加上背景音樂 總有刁民可以玩到地圖滿為止 背景音樂的話要loop播放 我們只需要 使用uni.createInnerAudioContext來創建并返回內部 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() // 創建上下文             this.bgmInnerAudioContext.autoplay = true; // 自動播放             this.bgmInnerAudioContext.src= bgm; // 音頻地址             this.bgmInnerAudioContext.loop = true; // 循環播放         }     } } <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() // 創建上下文             this.bgmInnerAudioContext.autoplay = true; // 自動播放             this.bgmInnerAudioContext.src= bgm; // 音頻地址             this.bgmInnerAudioContext.loop = true; // 循環播放         }         checkGame(direction, next) {             let gameover = false;             let isSnake = this.snakes.indexOf(next) > -1;             let isPollute = this.pollutes.indexOf(next) > -1;             // 撞到蛇和被污染的地塊游戲結束             if (isSnake || isPollute) {                 gameover = true;             }             // 撞到邊界游戲結束             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() // 游戲結束 暫停背景音樂                 clearInterval(this.timer);                 clearInterval(this.boomTimer);             } else {                 // 游戲沒結束                 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(下次播放會從頭開始) 剩余的不需要清楚音效和循環播放 下面附上剩余的代碼

<script> export default {     data() {         return {              bgmInnerAudioContext:null,              clockInnerAudioContext:null,         }     },     watch: {         boomCount(val) {             if (val === 0) {                 // 超過爆炸時間還沒吃到,則將蟲子格子變成被污染的土地,并且重置爆炸狀態,同時生成一只新的蟲子:                 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;             // 撞到蛇和被污染的地塊游戲結束             if (isSnake || isPollute) {                 gameover = true;             }             // 撞到邊界游戲結束             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() // 游戲結束 暫停背景音樂                 this.clockInnerAudioContext && this.clockInnerAudioContext.stop() // 清楚倒計時音樂                 clearInterval(this.timer);                 clearInterval(this.boomTimer);             } else {                 // 游戲沒結束                 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)];             // 根據游戲難度,概率產出會爆炸的蟲子:             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>

結語

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

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

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

作者:Sophora

推薦:《uniapp教程》

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
99视频在线免费| 妞干网在线视频观看| 美女网站免费观看视频| 青青草视频在线免费播放| 黄色三级中文字幕| 人人妻人人做人人爽| 久久人人爽人人爽人人av| 一区二区三区一级片| 永久免费黄色片| 欧美日韩激情四射| av高清在线免费观看| 日本新janpanese乱熟| 高清一区在线观看| 中文字幕一区二区三区四区五区人 | 狠狠操精品视频| 美女一区二区三区视频| 欧美三级午夜理伦三级富婆| 污视频免费在线观看网站| www.51色.com| 无码专区aaaaaa免费视频| 日日躁夜夜躁aaaabbbb| 国产精品av免费| 日韩欧美在线免费观看视频| 高清一区在线观看| 欧洲精品一区二区三区久久| 91国产精品视频在线观看| 日本中文字幕在线视频观看| 日日摸天天爽天天爽视频| 亚洲国产一二三精品无码| 毛片av免费在线观看| 男人天堂网站在线| 欧美大尺度做爰床戏| 免费观看精品视频| 日本三日本三级少妇三级66| 不卡的av中文字幕| 手机看片福利日韩| 四虎永久在线精品无码视频| 欧美日韩dvd| 在线无限看免费粉色视频| 黄色一级免费大片| 国产a级一级片| 成人一级片网站| 国产午夜福利在线播放| 五十路熟女丰满大屁股| 青青青在线观看视频| 国产xxxxhd| 日本天堂免费a| 国产婷婷一区二区三区| 男人添女荫道口喷水视频| 天堂网成人在线| 国产高清精品软男同| 尤物国产在线观看| 男女曰b免费视频| 伊人免费视频二| 2018国产在线| 超碰在线97免费| 国产在线精品91| 免费观看中文字幕| 九九热精品国产| 欧美少妇性生活视频| 国产人妻777人伦精品hd| 久久久久久久久久久视频| 五月激情五月婷婷| 91亚洲精品国产| 亚洲人辣妹窥探嘘嘘| 在线观看免费黄色片| 天天久久综合网| 深爱五月综合网| 日本xxx免费| 又大又硬又爽免费视频| 国产成人a亚洲精v品无码| 精品综合久久久久| 午夜精品久久久内射近拍高清| 一级黄色录像在线观看| 国产黄页在线观看| 好吊色视频988gao在线观看| 免费激情视频在线观看| 欧美一级爱爱视频| 国产又粗又长又爽又黄的视频| 成人观看免费完整观看| www.夜夜爱| 激情五月六月婷婷| 57pao国产成永久免费视频| 国产精品-区区久久久狼| 精品视频免费在线播放| 女人帮男人橹视频播放| 青草全福视在线| 黄色一级视频播放| 影音先锋成人资源网站| 狠狠精品干练久久久无码中文字幕 | 精品一区二区三区无码视频| 一区二区免费av| 天堂av手机在线| 一级黄色高清视频| 精品国产乱码久久久久久1区二区| 五月天婷婷激情视频| 美女福利视频在线| 欧美黄色性生活| 亚欧精品在线视频| 日韩欧美一级在线| 毛片在线播放视频| 国产一区二区在线免费播放| 无码内射中文字幕岛国片| 午夜精品中文字幕| 国产欧美精品aaaaaa片| 99久久国产综合精品五月天喷水| 精品国产一区三区| 99爱视频在线| 在线看免费毛片| 久久久久久人妻一区二区三区| 欧美亚洲日本一区二区三区| 成人在线观看a| 日韩在线视频在线| 草草草在线视频| 亚洲熟妇无码一区二区三区导航| 激情婷婷综合网| 成人黄色av片| 免费看黄色a级片| 9l视频白拍9色9l视频| 国产美女网站在线观看| 五月六月丁香婷婷| av免费网站观看| 久在线观看视频| 亚洲国产精品无码观看久久| 中文字幕一区久久| 国产精品视频中文字幕| 黄色动漫网站入口| 国产精品久久久久久久久电影网| 欧美成人免费在线观看视频| xxww在线观看| 亚洲色图久久久| 激情五月俺来也| www欧美激情| 国产精品亚洲二区在线观看| 无码人妻丰满熟妇区毛片| www.玖玖玖| 中文字幕一区二区三区四区在线视频| 国产视频九色蝌蚪| 欧美三级一级片| 国产免费又粗又猛又爽| 91制片厂毛片| dy888午夜| 波多野结衣之无限发射| www日韩视频| 欧美 另类 交| 黄色片网址在线观看| 婷婷丁香激情网| 欧美精品一区二区性色a+v| 色男人天堂av| 一本大道熟女人妻中文字幕在线 | 在线免费av播放| 特级黄色录像片| 日韩手机在线观看视频| 午夜视频在线观| 免费无码国产v片在线观看| 男女视频在线看| 成人免费a级片| 精品久久久99| 久久9精品区-无套内射无码| 97人人模人人爽人人澡| 女人天堂av手机在线| 自拍一级黄色片| 天天色综合天天色| 欧美日韩在线视频一区二区三区| 在线a免费观看| 性刺激的欧美三级视频| 国产成人永久免费视频| 久久久国产精华液999999| 国产日韩亚洲欧美在线| 91日韩精品视频| 在线观看高清免费视频| 国产精品亚洲二区在线观看| av在线com| 97久久国产亚洲精品超碰热| 伊人免费视频二| 中文字幕第一页亚洲| 国产一区二区在线观看免费视频| 欧美黄色一级片视频| av无码精品一区二区三区| 欧美综合在线播放| 黄色高清无遮挡| 向日葵污视频在线观看| 午夜在线观看av| 老司机av福利| 国产又粗又猛大又黄又爽| 黄色小视频免费网站| 911福利视频| mm131午夜| 国产午夜伦鲁鲁| 一级片视频免费观看| 五月花丁香婷婷| 日韩小视频在线播放| 亚洲精品性视频| 欧美黄色免费网址| 四虎永久在线精品无码视频| 成人免费在线观看视频网站| 四虎永久免费网站| 青青视频在线播放| 99热这里只有精品免费| 日本久久精品一区二区|