纯javascript实现的小游戏《Flappy Pig》实例_javascript技巧
本文实例讲述了纯javascript实现的小游戏《Flappy Pig》。分享给大家供大家参考。具体如下:
Flappy Pig,是Pig,使用原生javascript写的网页版“Flappy Bird”。我也奇了个怪为什么搞这个东西出来,而且还花了一天宝贵的周末,但是既然写出来,就拿出来和大家分享一下。
option.js如下:
/** * 原生javascript实现的《Flappy Pig》v0.1.0 * ======================================= * @author keenwon * Full source at http://keenwon.com */ var flappy = (function (self) { 'use strict'; //设置 self.option = { //重力加速度,屏幕像素和实际物理上的米有差别,所以存在换算 g: 400, //跳跃的初速度,控制猪的弹跳力 v0: 400, //柱子移动速度 vp: 2.5, //频率,控制动画帧数,默认20ms frequency: 20, //关卡数 levels: 100, //开头的空白距离 safeLift: 500, //地板高度(和图片有关) floorHeight: 64, //猪的宽度 pigWidth: 33, //猪的高度 pigHeight: 30, //猪当前高度 pigY: 300, //猪距离左边的距离, pigLeft: 80, //柱子Html pillarHtml: '<div class="top"></div><div class="bottom"></div>', //柱子宽度 pillarWidth: 45, //柱子上下间隔高度 pillarGapY: 108, //柱子左右间隔宽度 pillarGapX: 250, //上柱子的基础定位值(就是top值,和css写法有关) pillarTop: -550, //下柱子的基础定位值 pillarBottom: -500 }; return self; })(flappy || {})
util.js如下:
/** * 原生javascript实现的《Flappy Pig》v0.1.0 * ======================================= * @author keenwon * Full source at http://keenwon.com */ var flappy = (function (self) { 'use strict'; //工具 self.util = { preventDefaultEvent: function (event) { event = window.event || event; if (event) { if (event.preventDefault) { event.preventDefault(); } else { event.returnValue = false; } } }, $: function (id) { return document.getElementById(id); }, getChilds: function (obj) { var childs = obj.children || obj.childNodes, childsArray = new Array(); for (var i = 0, len = childs.length; i < len; i++) { if (childs[i].nodeType == 1) { childsArray.push(childs[i]); } } return childsArray; } }; return self; })(flappy || {})
pig.js如下:
/** * 原生javascript实现的《Flappy Pig》v0.1.0 * ======================================= * @author keenwon * Full source at http://keenwon.com */ var flappy = (function (self) { 'use strict'; var option = self.option, $ = self.util.$; //猪 self.pig = { Y: 0, //猪当前高度(底边) init: function (overCallback, controller) { var t = this; t.s = 0, //位移 t.time = 0, //时间 t.$pig = $('pig'); t.$pig.style.left = option.pigLeft + 'px'; t._controller = controller; t._addListener(overCallback); }, //添加监听 _addListener: function (overCallback) { this._overCallback = overCallback; }, //启动 start: function () { var t = this, interval = option.frequency / 1000; t.s = option.v0 * t.time - t.time * t.time * option.g * 2; //竖直上抛运动公式 t.Y = option.pigY + t.s; if (t.Y >= option.floorHeight) { t.$pig.style.bottom = t.Y + 'px'; } else { t._dead(); } t.time += interval; }, //跳 jump: function () { var t = this; option.pigY = parseInt(t.$pig.style.bottom); t.s = 0; t.time = 0; }, //撞到地面时触发 _dead: function () { this._overCallback.call(this._controller); }, //撞到地面的处理 fall: function () { var t = this; //摔到地上,修正高度 t.Y = option.floorHeight; t.$pig.style.bottom = t.Y + 'px'; }, //撞到柱子的处理 hit: function () { var t = this; //坠落 var timer = setInterval(function () { t.$pig.style.bottom = t.Y + 'px'; if (t.Y <= option.floorHeight) { clearInterval(timer); } t.Y -= 12; }, option.frequency); } }; return self; })(flappy || {})
pillar.js如下:
/** * 原生javascript实现的《Flappy Pig》v0.1.0 * ======================================= * @author keenwon * Full source at http://keenwon.com */ var flappy = (function (self) { 'use strict'; var option = self.option, util = self.util, $ = util.$; //柱子 self.pillar = { currentId: -1, //当前柱子id init: function () { var t = this; //缓存上下柱子位置的换算因子 t._factor = option.pillarBottom - option.pillarGapY + 450; //s表示一个位置,到达这个位置的柱子就是“当前的柱子”,就算是靠近猪了,开始计算猪有没有撞到这根柱子,10是提前量。 t._s = option.pigLeft + option.pigWidth + 10; t._render(); }, //把柱子渲染到DOM树中 _render: function () { var t = this, initleft = option.safeLift; t.left = 0; t.dom = document.createElement('div'); t.dom.className = t.dom.id = 'pillarWrapper'; for (var i = 0, j = option.levels; i < j; i++) { var el = document.createElement('div'); el.innerHTML = option.pillarHtml; el.className = 'pillar'; el.id = 'pillar-' + i; el.style.left = initleft + 'px'; var childs = util.getChilds(el), topEl = childs[0], bottomEl = childs[1], pos = t._random(i); topEl.style.top = pos.top + 'px'; bottomEl.style.bottom = pos.bottom + 'px'; el.setAttribute('top', 600 + pos.top); el.setAttribute('bottom', 0 - pos.bottom); t.dom.appendChild(el); initleft += option.pillarGapX; } $('screen').appendChild(t.dom); }, //计算柱子位置 _random: function (i) { var t = this, x = Math.random(), h = Math.abs(Math.sin((i+1) * x)) * 290; return { top: option.pillarTop + h, bottom: t._factor - h } }, //移动柱子 move: function () { var t = this; t.dom.style.left = -t.left + 'px'; t._find(t.left); t.left += option.vp; }, //找到当前的柱子 _find: function (l) { var t = this, x = (t._s + l - option.safeLift) / option.pillarGapX, intX = parseInt(x); //intX是当前柱子 if (x > 0 && t.currentId != intX && Math.abs(x - intX) < 0.1) { t.currentId = intX; } } }; return self; })(flappy || {})
position.js如下:
/** * 原生javascript实现的《Flappy Pig》v0.1.0 * ======================================= * @author keenwon * Full source at http://keenwon.com */ var flappy = (function (self) { 'use strict'; var pig = self.pig, pillar = self.pillar, option = self.option, $ = self.util.$; //位置判断 self.position = { init: function (overCallback, controller) { var t = this; t.pillarWrapper = $('pillarWrapper'); t.pigX1 = option.pigLeft, t.pigX2 = option.pigLeft + option.pigWidth, //猪的左右位置,固定的 t._controller = controller; t._addListener(overCallback); }, //添加监听 _addListener: function (overCallback) { this._overCallback = overCallback; }, judge: function () { var t = this, currentPillar = $('pillar-' + pillar.currentId); if (pillar.currentId == -1) { return; } t.pigY2 = 600 - pig.Y; t.pigY1 = t.pigY2 - option.pigHeight; //猪的上下位置 t.pY1 = currentPillar.getAttribute('top'); t.pY2 = currentPillar.getAttribute('bottom'); t.pX1 = parseInt(currentPillar.style.left) + parseInt(t.pillarWrapper.style.left); t.pX2 = t.pX1 + option.pillarWidth; //柱子的上下左右位置 console.log(t.pillarWrapper.style.left); if (option.pigLeft + option.pigWidth >= t.pX1 && option.pigLeft <= t.pX2) { if (t.pigY1 < t.pY1 || t.pigY2 > t.pY2) { t._dead(); } } }, //撞到柱子时触发 _dead: function () { this._overCallback.call(this._controller); }, }; return self; })(flappy || {})
controller.js如下:
/** * 原生javascript实现的《Flappy Pig》v0.1.0 * ======================================= * @author keenwon * Full source at http://keenwon.com */ var flappy = (function (self) { 'use strict'; var pig = self.pig, pillar = self.pillar, pos = self.position, util = self.util, $ = util.$, option = self.option; //控制器 self.controller = { init: function () { var t = this; t._isStart = false; t._timer = null; pig.init(t.fall, t); pillar.init(); pos.init(t.hit, t); t.addKeyListener(); }, addKeyListener: function () { var t = this; document.onkeydown = function (e) { var e = e || event; var currKey = e.keyCode || e.which || e.charCode; if (currKey == 32) { t.jump(); util.preventDefaultEvent(e); } } }, jump: function () { var t = this; if (!t._isStart) { $('begin').style.display = 'none'; t._createTimer(function () { pig.start(); pillar.move(); pos.judge(); $('score').innerHTML = pillar.currentId + 1; }); t._isStart = true; } else { pig.jump(); } }, hit: function () { var t = this; t.over(); pig.hit(); }, fall: function () { var t = this; t.over(); pig.fall(); }, over: function () { var t = this; clearInterval(t._timer); $('end').style.display = 'block'; }, _createTimer: function (fn) { var t = this; t._timer = setInterval(fn, option.frequency); } }; return self; })(flappy || {})
game.js如下:
/** * 原生javascript实现的《Flappy Pig》v0.1.0 * ======================================= * @author keenwon * Full source at http://keenwon.com */ var flappy = (function (self) { 'use strict'; var controller = self.controller, option = self.option, pig = self.pig, pillar = self.pillar, pos = self.position, util = self.util, $ = self.util.$; //主程序 self.game = { init: function () { var t = this; t._isStart = false; t._isEnd = false; t._timer = null; pig.init(t.fall, t); pillar.init(); pos.init(t.hit, t); t.addKeyListener(); }, addKeyListener: function () { var t = this; document.onkeydown = function (e) { var e = e || event; var currKey = e.keyCode || e.which || e.charCode; if (currKey == 32) { if (!t._isEnd) { t.jump(); } else { window.location.reload(); } util.preventDefaultEvent(e); } } }, jump: function () { var t = this; if (!t._isStart) { $('start').style.display = 'none'; t._createTimer(function () { pig.start(); pillar.move(); pos.judge(); $('score').innerHTML = pillar.currentId + 1; }); t._isStart = true; } else { pig.jump(); } }, hit: function () { var t = this; t.over(); pig.hit(); }, fall: function () { var t = this; t.over(); pig.fall(); }, over: function () { var t = this; clearInterval(t._timer); t._isEnd = true; $('end').style.display = 'block'; }, _createTimer: function (fn) { var t = this; t._timer = setInterval(fn, option.frequency); } }; flappy.init = function () { self.game.init(); } return self; })(flappy || {})
希望本文所述对大家的javascript程序设计有所帮助。

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

如何使用WebSocket和JavaScript实现在线语音识别系统引言:随着科技的不断发展,语音识别技术已经成为了人工智能领域的重要组成部分。而基于WebSocket和JavaScript实现的在线语音识别系统,具备了低延迟、实时性和跨平台的特点,成为了一种被广泛应用的解决方案。本文将介绍如何使用WebSocket和JavaScript来实现在线语音识别系

我们在使用win10操作系统的时候,想要知道win10更新了之后是不是还保存有以前老版本中的自带游戏扫雷,据小编所知,我们可以在商店中进行下载安装,只要在商店中搜索microsoftminesweeper即可。具体步骤就来和小编一起看一下吧~windows10有扫雷游戏吗1,首先打开win10开始菜单,点击。然后搜索,点击搜索。2,点击排在第一位的。3,然后就可能需要输入微软账户,即Microsoft账户。没有Microsoft账户的可以安装提示注册即可。输入账户密码,点击下一步。4,然后开始下

WebSocket与JavaScript:实现实时监控系统的关键技术引言:随着互联网技术的快速发展,实时监控系统在各个领域中得到了广泛的应用。而实现实时监控的关键技术之一就是WebSocket与JavaScript的结合使用。本文将介绍WebSocket与JavaScript在实时监控系统中的应用,并给出代码示例,详细解释其实现原理。一、WebSocket技

如何使用WebSocket和JavaScript实现在线预约系统在当今数字化的时代,越来越多的业务和服务都需要提供在线预约功能。而实现一个高效、实时的在线预约系统是至关重要的。本文将介绍如何使用WebSocket和JavaScript来实现一个在线预约系统,并提供具体的代码示例。一、什么是WebSocketWebSocket是一种在单个TCP连接上进行全双工

如何利用JavaScript和WebSocket实现实时在线点餐系统介绍:随着互联网的普及和技术的进步,越来越多的餐厅开始提供在线点餐服务。为了实现实时在线点餐系统,我们可以利用JavaScript和WebSocket技术。WebSocket是一种基于TCP协议的全双工通信协议,可以实现客户端与服务器的实时双向通信。在实时在线点餐系统中,当用户选择菜品并下单

谷歌浏览器怎么玩小游戏?谷歌浏览器之中是有着非常多充满人文关怀的功能设计的,各位可以在其中获得非常多样化的乐趣。在谷歌浏览器之中,有这一个非常好玩的彩蛋小游戏,即小恐龙游戏,很多小伙伴都非常喜欢这个游戏,但却不清楚该怎么触发进行游玩,下面就由小编为大家带来恐龙小游戏进入教程。谷歌浏览器怎么玩小游戏方法一:【电脑断网】如果你的电脑使用有线网络,请拔掉网线;如果你的电脑使用无线网络,请在电脑右下角点击无线网络连接断开。②在你电脑断网的前提下,打开谷歌浏览器(GoogleChrome)即可出现谷歌浏览

JavaScript和WebSocket:打造高效的实时天气预报系统引言:如今,天气预报的准确性对于日常生活以及决策制定具有重要意义。随着技术的发展,我们可以通过实时获取天气数据来提供更准确可靠的天气预报。在本文中,我们将学习如何使用JavaScript和WebSocket技术,来构建一个高效的实时天气预报系统。本文将通过具体的代码示例来展示实现的过程。We

JavaScript教程:如何获取HTTP状态码,需要具体代码示例前言:在Web开发中,经常会涉及到与服务器进行数据交互的场景。在与服务器进行通信时,我们经常需要获取返回的HTTP状态码来判断操作是否成功,根据不同的状态码来进行相应的处理。本篇文章将教你如何使用JavaScript获取HTTP状态码,并提供一些实用的代码示例。使用XMLHttpRequest
