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一区二区
欧美性潮喷xxxxx免费视频看| 亚洲熟妇无码另类久久久| 国产69精品久久久久999小说| 日韩免费在线观看av| 97视频在线免费| 成人性生生活性生交12| 高潮一区二区三区| 搡的我好爽在线观看免费视频| 手机在线视频你懂的| 精品无码国产一区二区三区av| 99视频精品全部免费看| 日本老熟妇毛茸茸| 日本丰满少妇黄大片在线观看| 91亚洲精品久久久蜜桃借种| 成人在线观看你懂的| 国产精品后入内射日本在线观看| 久久久久久综合网| 50路60路老熟妇啪啪| 97超碰免费观看| 男人的天堂avav| 成年人黄色片视频| 做a视频在线观看| 久久www视频| 久久久久久久久久毛片| 91免费版看片| 久久久久久久久久久久91| 欧美午夜性视频| 日韩在线第三页| 日韩精品第1页| 欧美私人情侣网站| 神马午夜伦理影院| 日韩欧美黄色大片| 欧美交换配乱吟粗大25p| 黄色国产一级视频| 三级黄色片免费看| 国产裸体免费无遮挡| 国产xxxxhd| 男人亚洲天堂网| 国产黄色激情视频| 亚洲天堂网2018| 麻豆av免费在线| 亚洲 欧美 综合 另类 中字| 中文字幕在线观看第三页| 日本三级中文字幕在线观看| 91看片在线免费观看| av高清在线免费观看| xxxxxx在线观看| 亚洲激情在线看| 亚洲成人福利在线观看| 免费不卡av在线| 日韩成人手机在线| 91视频福利网| www,av在线| 国产aⅴ爽av久久久久| 国产三级日本三级在线播放| 亚洲熟妇国产熟妇肥婆| 人人妻人人澡人人爽欧美一区| 国产又黄又猛的视频| 久久午夜夜伦鲁鲁一区二区| 农村妇女精品一二区| 日本在线xxx| 人妻有码中文字幕| 奇米视频7777| 手机免费av片| 中文国产在线观看| 日韩成人精品视频在线观看| 在线免费观看视频黄| 91人人澡人人爽人人精品| 久久精品国产精品亚洲色婷婷| 99视频在线免费播放| 俄罗斯av网站| 黄色片视频在线播放| 日本熟妇人妻xxxxx| 亚洲五月天综合| 日韩av影视大全| 黄色一级大片免费| 国产视频一视频二| 国产视频在线视频| 特级黄色片视频| 久久综合亚洲精品| 欧美 国产 综合| 日韩一级免费在线观看| 天天操天天干天天做| 黄色录像特级片| 亚洲精品无码久久久久久| 美女网站视频黄色| 日本一区二区免费高清视频| 激情五月婷婷久久| 黄色aaaaaa| 免费特级黄色片| 中文字幕乱码人妻综合二区三区 | 国产成人久久777777| 亚洲国产高清av| 国产肥臀一区二区福利视频| 不要播放器的av网站| 青青草原国产免费| 99精品免费在线观看| 欧美在线a视频| 日韩av高清在线看片| 亚洲欧美手机在线| 日韩国产欧美亚洲| 香蕉视频xxx| 中文字幕第21页| 国产精品成人久久电影| 手机免费看av网站| 成人一区二区三| 免费看日本毛片| 韩国无码av片在线观看网站| 国产九九热视频| 日韩av片在线看| 日韩精品视频在线观看视频| 久久久久久久久久一区| 黄色片久久久久| 久久国产精品网| 99久久久精品视频| 国产一级免费大片| 亚欧激情乱码久久久久久久久| 亚欧无线一线二线三线区别| 日韩精品一区二区三区电影| 日韩视频在线观看一区二区三区| 日韩欧美视频网站| www精品久久| 国产一区二区三区小说| 在线观看18视频网站| 亚洲自拍偷拍一区二区三区| 国产精品视频中文字幕| 激情视频综合网| 国产熟人av一二三区| 久久久久免费精品| 亚洲国产高清av| 岛国av在线免费| 不用播放器的免费av| 手机在线国产视频| 色偷偷中文字幕| 久久精品久久99| 一区二区三区四区久久| 国产精品中文久久久久久| 色乱码一区二区三区熟女| 性鲍视频在线观看| 中文字幕日韩精品无码内射| 91九色国产ts另类人妖| 欧美高清中文字幕| 国产最新免费视频| 奇米影音第四色| 999在线精品视频| 亚洲一区 在线播放| 日本阿v视频在线观看| 欧美男女爱爱视频| 九热视频在线观看| 樱空桃在线播放| 国产二区视频在线播放| 色播五月综合网| 四虎4hu永久免费入口| 欧美a v在线播放| 五月天婷婷亚洲| 欧美成人三级在线视频| 老头吃奶性行交视频| 国产裸体免费无遮挡| 亚洲综合av在线播放| 国产情侣第一页| 黄色片久久久久| aaaaaaaa毛片| 免费在线观看视频a| 午夜久久久精品| 妺妺窝人体色777777| 18禁免费观看网站| 国产福利在线免费| 欧美乱大交xxxxx潮喷l头像| 岛国av在线免费| 亚洲中文字幕无码中文字| 国产对白在线播放| 超碰在线97免费| 国产午夜大地久久| a级网站在线观看| 手机在线免费观看毛片| 国产av天堂无码一区二区三区| 污污的网站18| 欧美日韩在线中文| 九九久久九九久久| 九一精品久久久| 浓精h攵女乱爱av| 久久精品99国产| 青青青青草视频| www.欧美黄色| 992tv成人免费观看| 在线观看的毛片| 黄色三级视频片| 日本成人中文字幕在线| www.中文字幕在线| 国产aaa免费视频| 国产一二三区在线播放| 欧美一级免费在线| 欧美午夜精品理论片| 波多野结衣xxxx| 污网站免费在线| caoporm在线视频| 红桃视频一区二区三区免费| 久热精品在线播放| 天天摸天天舔天天操| 国产探花在线观看视频|