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一区二区
亚洲77777| 水蜜桃色314在线观看| 国产成a人亚洲精v品在线观看| aa在线免费观看| 日本香蕉视频在线观看| 日本在线观看视频一区| 黄色a级片免费| 18黄暴禁片在线观看| 艳母动漫在线免费观看| 日韩爱爱小视频| 能在线观看的av| 777精品久无码人妻蜜桃| 在线观看污视频| 熟妇熟女乱妇乱女网站| 午夜视频在线网站| 国产一级做a爰片久久| 精品久久久久久久免费人妻| 欧美精品久久久久久久自慰| 日本大胆人体视频| 国产精品99久久久久久大便| 日本高清一区二区视频| 天堂视频免费看| 欧美一级xxxx| 欧美专区第二页| 亚洲制服在线观看| 激情五月五月婷婷| av动漫在线播放| 日本a在线免费观看| 黄色一级视频在线播放| 欧美成人三级在线视频| 国产精品宾馆在线精品酒店| 黄色国产精品视频| 免费看污污网站| 国产美女18xxxx免费视频| 五月天中文字幕在线| 小说区视频区图片区| 成人免费看片视频在线观看| 久久99久久久久久| 日韩黄色片视频| 免费看涩涩视频| 欧美一级黄色录像片| 黄网站欧美内射| 日本激情视频在线| 免费看啪啪网站| 国产精品999视频| 国产免费又粗又猛又爽| 真人做人试看60分钟免费| 精品欧美一区免费观看α√| 国产高潮免费视频| 国产 欧美 日韩 一区| av网站在线观看不卡| 污色网站在线观看| 国产黄色片免费在线观看| 99精品免费在线观看| 亚洲欧美日韩一二三区| 国产一区二区视频播放| 久久久久久久久久一区二区| 日本欧美视频在线观看| 天天视频天天爽| 国产av熟女一区二区三区| 九九热在线免费| 国产日韩欧美精品在线观看| 最新免费av网址| 男女视频网站在线观看| 免费黄频在线观看| 蜜臀av午夜一区二区三区| 懂色av粉嫩av蜜臀av| 人人干人人干人人| 国产视频一视频二| 超碰10000| 欧美又黄又嫩大片a级| 激情网站五月天| 国产午夜大地久久| 波多野结衣 作品| 日韩在线不卡一区| 不卡av免费在线| www.爱色av.com| 国产日本在线播放| 成人在线观看毛片| 精产国品一二三区| 色91精品久久久久久久久| 久久精品免费网站| 久久美女福利视频| 国产精品丝袜久久久久久消防器材| 想看黄色一级片| 免费成年人高清视频| 狠狠热免费视频| 不卡影院一区二区| 中文字幕无码不卡免费视频| 国产特级淫片高清视频| 农民人伦一区二区三区| www.欧美黄色| 国产妇女馒头高清泬20p多| 欧美亚洲色图视频| 日本手机在线视频| 国产精品333| 波多野结衣作品集| 999在线免费视频| 777视频在线| 国产免费中文字幕| 亚洲av首页在线| 国产在线视频综合| 精品少妇一区二区三区在线| 欧美大片在线播放| 波多结衣在线观看| 亚洲欧美一区二区三区不卡| 黑人巨茎大战欧美白妇| 欧美视频在线观看视频| 熟女少妇在线视频播放| 男人的天堂日韩| 深爱五月综合网| 久久香蕉视频网站| av高清在线免费观看| 天天操天天爽天天射| 伊人影院综合在线| 水蜜桃在线免费观看| jizzjizzxxxx| 激情图片中文字幕| www.av中文字幕| 色乱码一区二区三区在线| 青青草影院在线观看| 91国视频在线| 青青草久久伊人| 人人妻人人澡人人爽欧美一区双| 日日摸日日碰夜夜爽av| 女同激情久久av久久| 青娱乐自拍偷拍| 亚洲综合123| 六月丁香婷婷在线| 91成人在线视频观看| 欧美视频第三页| 日韩欧美一级在线| 免费看污污网站| 欧美视频免费看欧美视频| 香蕉视频999| 日韩欧美xxxx| 成品人视频ww入口| 黄色片免费网址| 成人性做爰aaa片免费看不忠| 97超碰人人爱| 蜜桃福利午夜精品一区| 99精品人妻少妇一区二区| 成年人黄色在线观看| 无遮挡又爽又刺激的视频| 日韩久久久久久久久久久久| 亚洲欧美日韩综合网| 激情六月丁香婷婷| 激情五月宗合网| 五月天av影院| 婷婷激情小说网| 色一情一区二区三区| 99草草国产熟女视频在线| 妞干网在线观看视频| 性生活免费观看视频| 伊人五月天婷婷| 又色又爽又黄视频| 日本在线播放一区二区| 91人人澡人人爽人人精品| 欧美精品一区二区三区免费播放| 成人性生活视频免费看| 丰满少妇久久久| 成人一对一视频| 国产h视频在线播放| 精品久久一二三| 99精品人妻少妇一区二区| a在线视频观看| a级黄色一级片| 欧美牲交a欧美牲交aⅴ免费真| 亚洲熟妇av一区二区三区漫画| 91好吊色国产欧美日韩在线| 无罩大乳的熟妇正在播放| 久久国产成人精品国产成人亚洲 | 黄大色黄女片18第一次| 中文字幕第36页| www午夜视频| 久久精品久久99| www.男人天堂网| 女人和拘做爰正片视频| 一区二区三区国产免费| 视频免费1区二区三区| 天天av天天操| 4444亚洲人成无码网在线观看| 9色porny| 国产一级片黄色| 黄色一级片免费播放| 国产91视频一区| 成人在线免费播放视频| 色91精品久久久久久久久| 国产在线无码精品| 亚洲中文字幕无码专区| 久久国产这里只有精品| 黄色一级大片免费| 国产精品69页| av磁力番号网| 精品国产成人av在线免| 一级片免费在线观看视频| 国产一二三在线视频| 男人添女人下面免费视频| 免费在线看黄色片| 视色视频在线观看|