电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

VUE實(shí)現(xiàn)一個Flappy Bird游戲的示例代碼

瀏覽:2日期:2022-09-30 16:43:36

Flappy Bird是一個非常簡單的小游戲,在app上大家都玩過。這里就用VUE來實(shí)現(xiàn)一個簡單的PC版Flappy Bird,娛樂一下~~~~~

要實(shí)現(xiàn)這個游戲,首先來分析一下游戲界面里哪幾塊東西需要動起來:

1、第一當(dāng)然就是上下移動的小鳥;

2、橫向移動的背景圖,讓小鳥看起來在橫向飛行;

3、從畫面右端進(jìn)入的一排排管道。

這樣很明確了,我們讓上面3塊內(nèi)容按照規(guī)律運(yùn)動起來,然后再加上規(guī)則邊界判斷和計分,就可以得到一個完整的游戲。所以就一塊塊來解決。

先來定義一些常量和變量:

let rafId = null; // requestAnimationFrame的IDlet startSpeed = 1;const SPEED = 0.04; // 加速度const UP = 5.0; // 速度累加上限const UP_SUM = 30; // 按一次跳躍的高度const BIRD_WIDTH = 50; // 小鳥圖片寬50pxconst PIPE_DISTANCE = 350; // 管道之間的橫向距離let id = 0; // 管道唯一id,從0開始計數(shù) ... data() { return { start: false, clientWidth: 0, clientHeight: 0, spaceHeight: [240, 200, 160], // 上管道與下管道之間的距離 pipeArr: [], // 管道數(shù)組 score: 0, // 得分 jumpSum: 0, // 當(dāng)前跳躍相對高度 jumpFlag: false, // true-按下空格鍵跳躍上升階段;false-自由落體階段 dropBirdImg: require('@/assets/img/bird/bird0_0.png'), flyBirdImg: require('@/assets/img/bird/bird0_2.png'), gameOver: false, // 游戲失敗的flag,用于停止動畫幀 };},1、上下移動的小鳥

為了分別控制小鳥和管道的位置,元素定位均采用position: absolute

小鳥本身就是個div+背景圖,然后定義一下在界面里的初始位置:

<div ref='bird'></div> #bird { height: 50px; width: 50px; border-radius: 50%; background: url('~assets/img/bird/bird0_1.png') no-repeat center/contain; // 小鳥初始位置 position: absolute; left: 300px; top: 300px;}

然后,在什么都不操作的情況下,小鳥從初始位置開始'墜落',小鳥的墜落是一個越落越快的過程,在這里我沒有用物理的重力加速度公式,只是簡單模擬了一個曲線加速過程。這是一個持續(xù)的動畫,所以把這個動作放在動畫幀里,即requestAnimationFrame,每一幀的函數(shù)定義為loop()。

所以在loop函數(shù)中,根據(jù)offsetTop和父元素的clientHeight來判斷小鳥是否觸碰到了畫面的上下邊界,是則游戲結(jié)束;否,則增加style.top讓小鳥墜落。

loop() { let _this = this; if (_this.jumpFlag) {// 小鳥跳躍_this.jump(); } let top = _this.$refs.bird.offsetTop; if (top > _this.clientHeight - BIRD_WIDTH || top <= 0) {// 碰到邊界,游戲結(jié)束_this.resetGame(); } else if (!_this.jumpFlag) {_this.$refs.bird.style.background = `url(’${_this.dropBirdImg}’) no-repeat center/contain`;_this.$refs.bird.style.top = top + startSpeed * startSpeed + 'px'; // 模擬加速墜落if (startSpeed < UP) { startSpeed += SPEED;} } _this.pipesMove(); // 管道移動}

游戲中,玩家按下空格鍵,小鳥會向上跳躍一段距離,用this.jumpFlag[true/false]來記錄這一狀態(tài),當(dāng)按下時,置為true,loop函數(shù)中小鳥jump(),在jump到一定距離后,jumpFlag置為false,小鳥開始墜落。

所以,jump函數(shù)很容易實(shí)現(xiàn):

jump() { let _this = this; _this.$refs.bird.style.background = `url(’${_this.flyBirdImg}’) no-repeat center/contain`; if (_this.jumpSum > UP_SUM) {// 到頂部就落下_this.jumpFlag = false;_this.jumpSum = 0;startSpeed = 1; } else {_this.$refs.bird.style.top = _this.$refs.bird.offsetTop - 8 + 'px';_this.jumpSum += 8; }}2、橫向移動的背景圖

這個比較簡單,就是background-position無限循環(huán)切換就行了,位置根據(jù)自己下載的背景圖素材寬度決定。

animation: bgMove 8s linear infinite; @keyframes bgMove {0% { background-position: 805px 0;}100% { background-position: 0 0;}}

經(jīng)過這兩步,我們就可以得到一個正在飛行的小鳥了,用document.onkeydown監(jiān)聽空格鍵來切換jumpFlag,如下圖:

VUE實(shí)現(xiàn)一個Flappy Bird游戲的示例代碼

3、從右往左一移動進(jìn)入管道

管道是由上下兩個div組成,每個div通過不同的top: -xx和bottom: -yy實(shí)現(xiàn)中間有間隙。

首先實(shí)現(xiàn)生成一個隨機(jī)間隙管道的函數(shù),管道存放在pipeArr對象數(shù)組中:

addPipe(id) { let obj = {}; let top_num = this.sum(10, 170); let height = this.spaceHeight[Math.floor(Math.random() * this.spaceHeight.length) ]; // 隨機(jī)選取間隙值 let bottom_num = height - top_num; obj.top = top_num; obj.id = id; obj.right = -(PIPE_DISTANCE / 2); obj.bottom = bottom_num; this.pipeArr.push(obj);},sum(m, n) { // 隨機(jī)n-m之間的數(shù)字 return Math.floor(Math.random() * (m - n) + n);}

然后需要將管道移動起來,即loop()中管道移動函數(shù)pipesMove(),整個函數(shù)實(shí)現(xiàn)如下:

pipesMove() { let _this = this; if (_this.pipeArr.length === 0) {return; } let right0 = _this.pipeArr[0].right; if (right0 > this.clientWidth + 300) {this.pipeArr.shift(); } let right_last = _this.pipeArr[_this.pipeArr.length - 1].right; if (right_last >= PIPE_DISTANCE / 2) {id++;this.addPipe(id); } for (let i = 0; i < _this.pipeArr.length; i++) {// 判斷一下小鳥是否接觸到了管道,小鳥50*50,left:300px;管道寬100px;管道進(jìn)入范圍right是width-450到width-300if ( _this.pipeArr[i].right >= _this.clientWidth - 450 && _this.pipeArr[i].right <= _this.clientWidth - 300) { // 該管道進(jìn)入了小鳥觸碰范圍 let bird_top = _this.$refs.bird.offsetTop; // 12是小鳥圖片素材上下有空白間隙 if ( bird_top <= _this.clientHeight / 2 - _this.pipeArr[i].top - 12 || bird_top >= _this.clientHeight / 2 + _this.pipeArr[i].bottom - BIRD_WIDTH + 12 ) { // 碰到了管道 _this.resetGame(); return; }}if (_this.pipeArr[i].right === _this.clientWidth - 300 && _this.pipeArr[i].right === _this.clientWidth - 301) { // 當(dāng)某個管道剛好在小鳥左邊,證明小鳥通過該管道,根據(jù)管道id算出小鳥得分 _this.score = _this.pipeArr[i].id + 1;}_this.pipeArr[i].right = _this.pipeArr[i].right + 2; // 管道每幀移動2px }}

這里做了五件事:

(1)管道出了左邊畫面后shift()最左的管道;

(2)最右的管道離畫面右側(cè)一定距離后,加入新的一根管道;

(3)循環(huán)遍歷中,判斷小鳥是否進(jìn)入了某一根管道的范圍,判斷小鳥top是否有觸碰到上下管道,觸碰則輸;

(4)當(dāng)某一個管道剛好位于小鳥左側(cè)時,證明小鳥成功通過,分?jǐn)?shù)+1;

(5)每個管道移動2px像素,數(shù)值記錄在right屬性里。

通過DOM里:style設(shè)置right就可以使得管道橫向移動了

<section ref='pipes'> <div v-for='(item, index) in pipeArr' :key='item.id' : : > <div : ></div> <div : ></div> </div></section> .pipes-wrap {position: relative;height: 100%;overflow: hidden;.pipe-item { position: absolute; height: 100%; width: 100px; .pipe { width: 100%; height: 50%; position: relative; } .pipe-top { background: url(’'~assets/img/bird/pipe_down.png’) no-repeat; background-size: 100px; background-position: bottom; } .pipe-bottom { background: url(’'~assets/img/bird/pipe_up.png’) no-repeat; background-size: 100px; background-position: top; }}}

VUE實(shí)現(xiàn)一個Flappy Bird游戲的示例代碼

以上就是vue實(shí)現(xiàn)flappy bird的思路和核心代碼了,總共也就兩百多行代碼。在我看來,難點(diǎn)主要集中在管道的移動、觸碰判定以及分?jǐn)?shù)計算上。當(dāng)然代碼里還有很多可以優(yōu)化的不足點(diǎn),共勉~~

標(biāo)簽: Vue
相關(guān)文章:
主站蜘蛛池模板: 泰国试管婴儿_泰国第三代试管婴儿费用|成功率|医院—新生代海外医疗 | 注塑_注塑加工_注塑模具_塑胶模具_注塑加工厂家_深圳环科 | 济南ISO9000认证咨询代理公司,ISO9001认证,CMA实验室认证,ISO/TS16949认证,服务体系认证,资产管理体系认证,SC食品生产许可证- 济南创远企业管理咨询有限公司 郑州电线电缆厂家-防火|低压|低烟无卤电缆-河南明星电缆 | 贵州科比特-防雷公司厂家提供贵州防雷工程,防雷检测,防雷接地,防雷设备价格,防雷产品报价服务-贵州防雷检测公司 | 济南律师,济南法律咨询,山东法律顾问-山东沃德律师事务所 | 浙江自考_浙江自学考试网 | 高扬程排污泵_隔膜泵_磁力泵_节能自吸离心水泵厂家-【上海博洋】 | 玉米深加工设备-玉米深加工机械-新型玉米工机械生产厂家-河南粮院机械制造有限公司 | 真丝围巾|真丝丝巾|羊绒围巾|围巾品牌|浙江越缇围巾厂家定制 | led太阳能路灯厂家价格_风光互补庭院灯_农村市政工程路灯-中山华可路灯品牌 | 雨水收集系统厂家-雨水收集利用-模块雨水收集池-徐州博智环保科技有限公司 | 科威信洗净科技,碳氢清洗机,超声波清洗机,真空碳氢清洗机 | 口信网(kousing.com) - 行业资讯_行业展会_行业培训_行业资料 | 无硅导热垫片-碳纤维导热垫片-导热相变材料厂家-东莞市盛元新材料科技有限公司 | 专业生物有机肥造粒机,粉状有机肥生产线,槽式翻堆机厂家-郑州华之强重工科技有限公司 | UV固化机_UVLED光固化机_UV干燥机生产厂家-上海冠顶公司专业生产UV固化机设备 | 菲希尔FISCHER测厚仪-铁素体检测仪-上海吉馨实业发展有限公司 | 宿舍管理系统_智慧园区系统_房屋/房产管理系统_公寓管理系统 | 探鸣起名网-品牌起名-英文商标起名-公司命名-企业取名包满意 | 工业设计,人工智能,体验式3D展示的智能技术交流服务平台-纳金网 J.S.Bach 圣巴赫_高端背景音乐系统_官网 | Win10系统下载_32位/64位系统/专业版/纯净版下载 | 安平县鑫川金属丝网制品有限公司,防风抑尘网,单峰防风抑尘,不锈钢防风抑尘网,铝板防风抑尘网,镀铝锌防风抑尘网 | 双段式高压鼓风机-雕刻机用真空泵-绍兴天晨机械有限公司 | 红外光谱仪维修_二手红外光谱仪_红外压片机_红外附件-天津博精仪器 | PCB设计,PCB抄板,电路板打样,PCBA加工-深圳市宏力捷电子有限公司 | 碳刷_刷握_集电环_恒压簧_电刷厂家-上海丹臻机电科技有限公司 | 食药成分检测_调料配方还原_洗涤剂化学成分分析_饲料_百检信息科技有限公司 | 超高频感应加热设备_高频感应电源厂家_CCD视觉检测设备_振动盘视觉检测设备_深圳雨滴科技-深圳市雨滴科技有限公司 | 微妙网,专业的动画师、特效师、CG模型设计师网站! - wmiao.com 超声波电磁流量计-液位计-孔板流量计-料位计-江苏信仪自动化仪表有限公司 | 北京开业庆典策划-年会活动策划公司-舞龙舞狮团大鼓表演-北京盛乾龙狮鼓乐礼仪庆典策划公司 | 螺旋绞龙叶片,螺旋输送机厂家,山东螺旋输送机-淄博长江机械制造有限公司 | 联系我们-腾龙公司上分客服微信19116098882 | 篷房|仓储篷房|铝合金篷房|体育篷房|篷房厂家-华烨建筑科技官网 知名电动蝶阀,电动球阀,气动蝶阀,气动球阀生产厂家|价格透明-【固菲阀门官网】 | 中国产业发展研究网 - 提供行业研究报告 可行性研究报告 投资咨询 市场调研服务 | 3d可视化建模_三维展示_产品3d互动数字营销_三维动画制作_3D虚拟商城 【商迪3D】三维展示服务商 广东健伦体育发展有限公司-体育工程配套及销售运动器材的体育用品服务商 | 天津暖气片厂家_钢制散热器_天津铜铝复合暖气片_维尼罗散热器 | 膜片万向弹性联轴器-冲压铸造模具「沧州昌运模具」 | 运动木地板_体育木地板_篮球馆木地板_舞台木地板-实木运动地板厂家 | 杭州标识标牌|文化墙|展厅|导视|户内外广告|发光字|灯箱|铭阳制作公司 - 杭州标识标牌|文化墙|展厅|导视|户内外广告|发光字|灯箱|铭阳制作公司 | 传递窗_超净|洁净工作台_高效过滤器-传递窗厂家广州梓净公司 | 房车价格_依维柯/大通/东风御风/福特全顺/江铃图片_云梯搬家车厂家-程力专用汽车股份有限公司 |