html+css+js实现小游戏flybird(完整版)

1 篇文章 0 订阅
订阅专栏

      完整demo下载资源https://download.csdn.net/download/qq_30548105/10847675        

       从未做过前端的游戏,哪怕不是用引擎实现的小游戏也没做过,这次试了一下,参考了一些资料,资料也不是很完整,于是就自己补齐写了一个。仅仅娱乐,接下来先看下效果图。

                                                             

好了,废话不多说直接上代码。

首先先实现首页动画效果,如图

1.整个界面

<div id="wrap">
	<div id="Score"></div>
		<div id="title">
			<img src="img/head.jpg" /><div id="beginBird"></div>
		</div>
		<div id="beginBtn"></div>
		<div id="banner"></div>
		<div id="bird" class="birdDown"></div>
		<!-- 由js生成管道代码
		<div class="duct">
			<div class="upduct">
				<img src="img/up_pipe.png" />
			</div>
			<div class="downduct">
			    <img src="img/down_pipe.png" />
		    </div>
	    </div>
        -->
</div>

2.背景样式

                     #wrap{
				/*游戏尺寸*/
				width: 343px;
				height: 480px;
				background: url(img/bg.jpg);
				position: relative;
				overflow: hidden;
			}
			#Score{
				/*游戏得分*/
				width: 28px;
				height: 39px;
				background: url(img/0.jpg);
				position: absolute;
				left: 50%;
				top: 70px;
				-webkit-transform: translate3d(-50%,0,0);
				-ms-transform: translate3d(-50%,0,0);
				-o-transform: translate3d(-50%,0,0);
				-moz-transform: translate3d(-50%,0,0);
				transform: translate3d(-50%,0,0);
			}
			#title{
				/*游戏开始页面的logo字+鸟部分的整体*/
				position: absolute;
				left: 50px;
				top: 150px;
				-webkit-animation: "fly" 1s infinite alternate;
				-ms-animation: "fly" 1s infinite alternate;
				-moz-animation: "fly" 1s infinite alternate;
				-o-animation: "fly" 1s infinite alternate;
				animation: "fly" 1s infinite alternate;
			}
			#beginBird{
				/*游戏开始页面的鸟*/
				width: 40px;
				height: 26px;
				background: url(img/bird0.png);
				position: absolute;
				right: 10px;
				top: 20px;
				-webkit-animation: "birdFly" 1s infinite alternate;
				-ms-animation: "birdFly" 1s infinite alternate;
				-moz-animation: "birdFly" 1s infinite alternate;
				-o-animation: "birdFly" 1s infinite alternate;
				animation: "birdFly" 1s infinite alternate;
			}
			#beginBtn{
				/*游戏开始按钮*/
				width: 85px;
				height: 29px;
				background: url(img/start.jpg);
				position: absolute;
				left: 50%;
				-webkit-transform: translate3d(-50%,0,0);
				-ms-transform: translate3d(-50%,0,0);
				-o-transform: translate3d(-50%,0,0);
				-moz-transform: translate3d(-50%,0,0);
				transform: translate3d(-50%,0,0);
				bottom: 150px;
			}
			#banner{
				/*游戏开始页面的logo字*/
				width: 686px;
				height: 14px;
				background: url(img/banner.jpg);
				position: absolute;
				bottom: 43px;
				-webkit-animation: "scrollBanner" 3s infinite linear;
				-ms-animation: "scrollBanner" 3s infinite linear;
				-moz-animation: "scrollBanner" 3s infinite linear;
				-o-animation: "scrollBanner" 3s infinite linear;
				animation: "scrollBanner" 3s infinite linear;
			}
			#bird{
				/*鸟*/
				width: 40px;
				height: 30px;
				position: absolute;
				left: 30px;
				top: 100px;
				display: none;
			}
			.birdUp{
				background: url(img/up_bird0.png) no-repeat;
			}
			.birdDown{
				background: url(img/down_bird0.png) no-repeat;
			}
			.duct{
				/*管道*/
				width: 62px;
				height: 423px;
				position: absolute;
				left: 343px;
			}
			.upduct{
				width: 62px;
				height: 150px;
				background: url(img/up_mod.png) repeat-y;
				position: relative;
			}
			.upduct img{
				position: absolute;
				bottom: 0;
			}
			.downduct{
				width: 62px;
				height: 100px;
				background: url(img/down_mod.png) repeat-y;
				position: absolute;
				bottom: 0;
			}

3.动画效果


			/*游戏开始界面,logo字与右边的鸟上下反复运动动画*/
			@keyframes fly{
				from{
					-webkit-transform: translate3d(0,0,0);
					-ms-transform: translate3d(0,0,0);
					-o-transform: translate3d(0,0,0);
					-moz-transform: translate3d(0,0,0);
					transform: translate3d(0,0,0);
				}
				to{
					-webkit-transform: translate3d(0,30px,0);
					-ms-transform: translate3d(0,30px,0);
					-o-transform: translate3d(0,30px,0);
					-moz-transform: translate3d(0,30px,0);
					transform: translate3d(0,30px,0);
				}
			}
			
			/* 草坪滚动动画 */
			@keyframes scrollBanner{
				from{
					-webkit-transform: translate3d(0,0,0);
					-ms-transform: translate3d(0,0,0);
					-o-transform: translate3d(0,0,0);
					-moz-transform: translate3d(0,0,0);
					transform: translate3d(0,0,0);
				}
				to{
					-webkit-transform: translate3d(-343px,0,0);
					-ms-transform: translate3d(-343px,0,0);
					-o-transform: translate3d(-343px,0,0);
					-moz-transform: translate3d(-343px,0,0);
					transform: translate3d(-343px,0,0);
				}
			}
			/*游戏开始页面小鸟翅膀变化效果*/
			@keyframes birdFly{
				from{
					background: url(img/bird0.png);
				}
				to{
					background: url(img/bird1.png);
				}
			}

4.矩形碰撞示意图

以目标为参照物,子弹绕目标一圈的范围即都算是碰撞范围

 

5.鸟与管道碰撞示意图

红色区域为碰撞范围

 

6.js处理

鸟移动的处理

//鸟移动的方法
		function birdMove(){
			offTop =bird.offsetTop;
			birdTimer=setInterval(function(){
				offTop+=y;
				y+=0.5;
				if (y>=6) {
					y=6;
				}
				if (y<0) {
					bird.className="birdUp";
				} else{
					bird.className="birdDown";
				}
				if (offTop>=480-87) {
					offTop=480-87;
					clearInterval(birdTimer);
				} 
				bird.style.top=offTop+"px";
			},30)
		}

管道生成代码

/*创建管道的方法*/
		function createDuct(){
			ductTimer=setInterval(function(){
				var duct=document.createElement("div");
				duct.className="duct";
				wrap.appendChild(duct);
				//生成上管道
				var up=document.createElement("div");
				up.className="upduct";
				up.style.height=random(60,203)+"px";
				duct.appendChild(up);
				var upImg=document.createElement("img");
				upImg.src="img/up_pipe.png";
				up.appendChild(upImg);
				//生成下管道
				var down=document.createElement("div");
				down.className="downduct";
				down.style.height=323-up.offsetHeight+"px";
				duct.appendChild(down);
				var downImg=document.createElement("img");
				downImg.src="img/down_pipe.png";
				down.appendChild(downImg);

				ductMove(duct,up.offsetTop+up.offsetHeight,down.offsetTop);
				
			},3000)
		}

管道移动的方法

/**
		 * 管道移动方法
		 * @param {管道} duct
		 * @param {上管道的顶部位置} upTop
		 * @param {下管道的顶部位置} downTop
		 */
		function ductMove(duct,upTop,downTop){
			var offLeft=duct.offsetLeft;
			duct.move=setInterval(function(){
				offLeft-=1;
				if (collision(bird,duct,upTop,downTop)) {
					clearInterval(duct.move);
					clearInterval(ductTimer);
					stop=true;
					wrap.onclick=null;
				}
				if(!stop){
					duct.style.left=offLeft+"px";
				}
			},20);
		}

鸟与管道碰撞算法

/*鸟与管道的碰撞算法*/
		function collision(first,second,upTop,downTop){
			var minX=second.offsetLeft-first.offsetWidth;
			var maxX=second.offsetLeft+second.offsetWidth;
			var minY=second.offsetTop-first.offsetHeight;
			var maxY=second.offsetTop+second.offsetHeight;
			if(first.offsetLeft>=minX && first.offsetLeft<=maxX &&
				first.offsetTop>=minY && first.offsetTop<=maxY && 
				(first.offsetTop<=upTop || first.offsetTop+first.style.height>=downTop)){
					return true;
				}
			return false;
		}

好了,以上就可以实现这样的效果了。只是练习的demo。

写文章

热门文章

  • 手把手教你获取x信本地数据库(利用Sqlcipher查看) 55798
  • 破解获取微信小程序源代码 45192
  • uniapp使用unipush推送及java后台推送代码(含本地打包apk使用unipush推送) 14025
  • 百度地图SDK申请之获取发布版,开发版SHA1 12358
  • Hbuilderx uniapp本地打包android 项目 11825

分类专栏

  • 日志处理 1篇
  • uniapp 4篇
  • 热更新 1篇
  • 微信小程序 2篇
  • xmpp 1篇
  • android 18篇
  • java 4篇
  • jsp 1篇
  • hybrid混合开发
  • 其他 2篇
  • 网页技术 1篇
  • linux

最新评论

  • uniapp使用unipush推送及java后台推送代码(含本地打包apk使用unipush推送)

    板砖Java: 是不是2.0的unipush,2.0都没有masterSecret

  • uniapp使用unipush推送及java后台推送代码(含本地打包apk使用unipush推送)

    我靠_叫我大当家的: 你自己设置注册的tag的值就行

  • uniapp使用unipush推送及java后台推送代码(含本地打包apk使用unipush推送)

    iceaugust: 代码很全,就是我还是没看到是否支持按自定义标签去推送? 比如按a园区、b园区,这种标签,或者a园区的男性 ,绑定标签就是个汉字词组吗?

  • android项目嵌套uniapp页面及交互

    小玖玖~: 嵌套的JAVA代码放在哪里呢,有目录吗

  • uniapp使用unipush推送及java后台推送代码(含本地打包apk使用unipush推送)

    伤心小狗床边哭: 请问我没有 MasterSecret 啊 这个是什么原因

最新文章

  • 手把手教你搭建ELK(Elasticsearch+Logstash+Filebeat+Kibana)日志采集处理,带你入门Elastic Stack
  • uniapp使用unipush推送及java后台推送代码(含本地打包apk使用unipush推送)
  • android项目嵌套uniapp页面及交互
2024年1篇
2022年5篇
2021年5篇
2020年2篇
2019年2篇
2018年6篇
2017年7篇
2016年3篇

目录

目录

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家重庆景观玻璃钢雕塑市场广元玻璃钢雕塑摆件施工工程永州玻璃钢雕塑厂深圳常见商场美陈销售厂家潮州玻璃钢雕塑造型西藏城市标志玻璃钢雕塑厦门玻璃钢雕塑加工侯马玻璃钢座椅雕塑深圳室内商场美陈采购古代玻璃钢人物雕塑陕西玻璃钢花盆加工六安玻璃钢雕塑定做厂泰安玻璃钢雕塑价格儿童玻璃钢雕塑设计哪里有神农架林区玻璃钢雕塑摆件定制入户花园玻璃钢花盆装饰铜陵玻璃钢雕塑设计景观玻璃钢卡通雕塑定做四川步行街玻璃钢雕塑定制郑州玻璃钢雕塑像厂家遵义玻璃钢雕塑订做九江玻璃钢果蔬雕塑卡通玻璃钢雕塑工艺山西玻璃钢浮雕室外镂空雕塑厂家价位合理的玻璃钢雕塑中原玻璃钢雕塑费用四川室内商场美陈采购浙江永康文化玻璃钢雕塑弥勒市玻璃钢雕塑报价广东常见商场美陈采购香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化