原生js打地鼠
我们要做的是一个打地鼠的游戏,只用原生js
1.导入需要的图片
2.编写页面css样式demo.css
*{
margin:0;
padding:0;
}
.game{
position: relative;
width:750px;
height:600px;
margin:100px auto;
}
.ground{
position: relative;
width: 750px;
height:550px;
background:url('./images/bg_canvas.png');
cursor:url("./images/hammer.png"),auto;
}
.score{
position: absolute;
width:300px;
height:30px;
left:420px;
top:180px;
}
.live{
position: absolute;
top:180px;
right:100px;
}
.score span,
.live span{
color:#fff;
line-height:30px;
font-size:24px;
vertical-align: top;
margin-left:10px;
} .mask{
position: absolute;
width:140px;
height:125px;
/* border:1px solid #000; */
overflow: hidden;
}
.mouse{
position: absolute;
width:110px;
height:110px;
overflow: hidden;
left:0;
top:20px;
background-position: 50% 50%;
background-repeat: no-repeat;
transition: top 0.5s;
overflow: hidden;
} @keyframes moveTop {
0% {
top: 70px;
}
100% {
top: 20px;
}
}
编写页面效果
编写js(demo.js)
var ground;
// 地鼠出现位置坐标
var coordinate = [{x: 130, y:173}, {x: 320, y:171}, {x: 515, y:175}, {x: 105, y: 265}, {x: 320, y: 256}, {x: 522, y: 256}, {x: 96, y: 350}, {x: 320, y: 355}, {x: 540, y: 358}];//洞口坐标
// 地鼠出现定时器
var gametimer;
var mask = [];
var mouse = new Array(9);
// 最大地鼠数
var maxCount = 2;
// 分数 点中一个加10
var score = 0;
// 生命 自由下落一个减一
var life = 10;
window.onload = function(){
ground = document.getElementsByClassName('ground')[0];
ground.onmousedown = function(){
ground.style.cursor = 'url("./images/hammer2.png"), auto'
};
ground.onmouseup = function(){
ground.style.cursor = 'url("./images/hammer.png"), auto'
};
init();
} function init(){
// 创建地鼠出现位置
createMask();
// 每隔一段时间出现一个地鼠
gameTimer = setInterval(function(){
// 创建每一个地鼠
// createMouse();
controlMouse();
// 每次生成后判断是否结束
if(life <= 0){
clearInterval(gameTimer);
alert('游戏结束:得分:' + score);
}
document.getElementsByClassName('scoreCon')[0].innerHTML = score;
document.getElementsByClassName('life')[0].innerHTML = life;
// 最大数++
maxCount = score / 100 + 1;
},50);
} function createMask(){
// 根据坐标生成洞穴位置
for(var i = 0; i < coordinate.length;i ++){
// 创建div 将来插入地鼠
var temp = document.createElement('div');
temp.classList.add('mask');
// 确定每一个地鼠巢穴位置
temp.style.left = coordinate[i].x + 'px';
temp.style.top = coordinate[i].y + 'px'; // 创建草坪遮盖
var img = document.createElement('div');
img.classList.add('mask');
// 设置遮罩层背景 每一个洞穴背景不一样
img.style.background = 'url("./images/mask'+i+'.png")';
// 控制层级 草坪在地鼠身上
// img.style.zIndex = 100;
img.style.zIndex = i * 2 +1; // 将元素放置在数组中
mask[i] = temp;
temp.appendChild(img);
// 将创建div插入父级
ground.appendChild(temp);
// 记录点击的位置
temp.index = i;
// 点击每一个消失
temp.onclick = function(){ disappear(this.index,true);
}
}
} // 创建地鼠
function createMouse(i){
// 随机的背景图片
var num = Math.floor(Math.random() * 4);
mouse[i] = num;
var temp = document.createElement('div');
temp.classList.add('mouse');
// 设置地鼠出现的背景图片
temp.style.background = 'url("./images/mouse'+num+'.png")'; // 每一个地鼠需要出现在指定的位置 在对应洞穴上出现一只地鼠
// 用两个数组对应 一个存放着洞穴 一个存放地鼠
mouse[i] = temp;
temp.style.zIndex = i * 2 ;
temp.style.animation = "moveTop 0.5s linear"; mask[i].appendChild(temp);
var timer = setTimeout(function(){
disappear(i,false);
},2000);
temp.timer = timer;
}
// 控制生称帝书的条件
function controlMouse(){
// 随机出现位置 并且同时出现的地鼠个数不大于最大个数 同一个位置不能出现两只
var num = Math.floor(Math.random()*9);
if(mouse.filter(function (item){
return item;
// 限制出现的最大数和出现的位置
}).length < maxCount && mouse[num] == null){
createMouse(num);
}
} // 消失函数
function disappear(i,isHit){
if(mouse[i]){
// 无论是否被打均缩回洞里 通过改变top值
mouse[i].style.top = '70px';
// 被打 改变样式 添加打懵圈的小星星 改变背景图片
if(isHit){
// 打中分数加十
score += 10;
// 创建包含懵圈小星星的元素
var bomp = document.createElement('img');
bomp.classList.add('mouse');
bomp.style.top = '-40px';
// 添加gif动图为背景显示
bomp.src = "./images/bomb.gif";
// 替换掉当前老鼠的图片
mouse[i].style.backgorund = 'url("./images/hit'+mouse[i].num +'")';
// 插入到当前点击的位置
mouse[i].appendChild(bomp);
// 清除自身的下落
clearTimeout(mouse[i].timer);
}else{
// 没有被打 自己缩回生命减一
life -= 1;
}
setTimeout(function(){
if(mouse[i]){
mask[i].removeChild(mouse[i]);
}
mouse[i] = null;
},500);
}
}
接下来我们看看最后效果
游戏规则是,每砸中一个地鼠分数加10,少砸一个地鼠生命减1,生命为0计算总分数,地鼠会随机出现,砸的越快出现的也就越快,
需要测试效果的,复制代码就可以了。
原生js打地鼠的更多相关文章
- 原生JS封装Ajax插件(同域&&jsonp跨域)
抛出一个问题,其实所谓的熟悉原生JS,怎样的程度才是熟悉呢? 最近都在做原生JS熟悉的练习... 用原生Js封装了一个Ajax插件,引入一般的项目,传传数据,感觉还是可行的...简单说说思路,如有不正 ...
- 常用原生JS方法总结(兼容性写法)
经常会用到原生JS来写前端...但是原生JS的一些方法在适应各个浏览器的时候写法有的也不怎么一样的... 今天下班有点累... 就来总结一下简单的东西吧…… 备注:一下的方法都是包裹在一个EventU ...
- 原生JS实现"旋转木马"效果的图片轮播插件
一.写在最前面 最近都忙一些杂七杂八的事情,复习软考.研读经典...好像都好久没写过博客了... 我自己写过三个图片轮播,一个是简单的原生JS实现的,没有什么动画效果的,一个是结合JQuery实现的, ...
- 再谈React.js实现原生js拖拽效果
前几天写的那个拖拽,自己留下的疑问...这次在热心博友的提示下又修正了一些小小的bug,也加了拖拽的边缘检测部分...就再聊聊拖拽吧 一.不要直接操作dom元素 react中使用了虚拟dom的概念,目 ...
- React.js实现原生js拖拽效果及思考
一.起因&思路 不知不觉,已经好几天没写博客了...近来除了研究React,还做了公司官网... 一直想写一个原生js拖拽效果,又加上近来学react学得比较嗨.所以就用react来实现这个拖 ...
- 原生JS实现全屏切换以及导航栏滑动隐藏及显示——重构前
思路分析: 向后滚动鼠标滚轮,页面向下全屏切换:向前滚动滚轮,页面向上全屏切换.切换过程为动画效果. 第一屏时,导航栏固定在页面顶部,切换到第二屏时,导航条向左滑动隐藏.切换回第一屏时,导航栏向右滑动 ...
- 原生js实现autocomplete插件
在实际的项目中,能用别人写好的插件实现相关功能是最好不过,为了节约时间成本,因为有的项目比较紧急,没充分时间让你自己来写,即便写了,你还要花大量时间调试兼容性.但是出于学习的目的,你可以利用闲暇时间, ...
- 原生js封装ajax:传json,str,excel文件上传表单提交
由于项目中需要在提交ajax前设置header信息,jquery的ajax实现不了,我们自己封装几个常用的ajax方法. jQuery的ajax普通封装 var ajaxFn = function(u ...
- 原生JS实现购物车结算功能代码+zepto版
html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3 ...
随机推荐
- B站动态转发抽奖脚本+教程
运行python脚本需要的条件: 1.连通的网络 2.已安装Python2并配置环境变量 3.Python脚本源码 环境搭建: 网络就不用我说了("'▽'") 那么下面我们来安装 ...
- MSSQLSERVER 服务运行内存设置较小导致启动服务失败
问题产生原因: 手动设置MSSQLSERVER 运行内存,设置值未达到MSSQLSERVER 服务运行内存最低值(max server memory 所允许的最小内存量是 128 MB.),导致MSS ...
- 【EBS】取数SQL-平均成本更新的物料事务处理追溯到应付发票
SELECT hou.name,--组织 aia.invoice_num,--发票编号 msib.segment1,--物料编码 mmt.transaction_id--物料事务处理 FROM mtl ...
- lsyncd实时同步工具
简介 Lysncd 实际上是lua语言封装了 inotify 和 rsync 工具,采用了 Linux 内核(2.6.13 及以后)里的 inotify 触发机制,然后通过rsync去差异同步,达到实 ...
- 关于.Net使用企业库访问MySql数据库
关于.Net使用企业库访问MySql数据库 在网上看了很多又重写又加WebConfig中的内容,其实不用那么麻烦 企业库5.0访问MySql数据库只需要在Web服务器安装mysql-connector ...
- 2019-07-22 phpStudy配置虚拟主机
1.右击 phpStudy ->[打开配置文件]->[vhosts-conf]: 2.在里面加入如下代码,并保存: NameVirtualHost *:80 <VirtualHost ...
- js 数据类型检测
提起数据类型检测 大多数人首先想起的应该是 typeof 'xxx' == '数据类型' 坦然这种方法对于基本数据类型的检测还是非常方便的,但是当遇到引用数据类型 Object时却爱莫能助,下面就 ...
- layui 框架 table插件 实现键盘快捷键 切换单元格编辑
最近使用layui的框架时,发现table插件不支持键盘快捷键切换单元格,花了点时间实现此功能. 分享给有需要的朋友们~~~ 效果图 代码: 1.支持 enter,上,下,右键 切换单元格,支持隐藏列 ...
- scrapy 爬虫中间件 deepth深度
源码 class DepthMiddleware(object): def __init__(self, maxdepth, stats, verbose_stats=False, prio=1): ...
- Mac FFmpeg编译和解决nasm/yasm not found or too old错误
FFmpeg编译下载代码:git clone https://git.ffmpeg.org/ffmpeg.git然后输入命令进行编译:找到下载的目录下,然后用命令进入这个文件夹下cd ffmpeg,然 ...