原生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 ...
随机推荐
- vue中引入百度地图
xxx.vue <template> <div> <el-input v-model="inputaddr"> </el-input> ...
- Oracle将小于1的数字to_char后,丢掉小数点前0的解决办法
使用to_char方法将小于0的数字转化为字符串时会出现小数点前0丢失的问题: 解决方案: 使用 oracle的tochar() 函数,并指定位数. --解决方案: 使用 oracle的tochar( ...
- ELK +Nlog 分布式日志系统的搭建 For Windows
前言 我们为啥需要全文搜索 首先,我们来列举一下关系型数据库中的几种模糊查询 MySql : 一般情况下LIKE 模糊查询 SELECT * FROM `LhzxUsers` WHERE UserN ...
- Error creating bean with name 'XXX' defined in file
这个错误是我在之前操作时,错将另一个dubbo服务器也加载到了该dubbo服务器上(pom.xml),所以出现了Error creating bean with name 'XXX' defined ...
- Linux 软链接和硬链接简介
在Linux系统中,将文件分为两个部分:用户数据和元数据. 元数据(inode) 元数据即文件的索引节点(inode),用来记录文件的权限(r.w.x).文件的所有者和属组.文件的大小.文件的状态改变 ...
- Java 之 Request 对象
一.Request 对象和 Response 对象原理 request和response对象是由服务器创建的,供我们使用的. request对象是来获取请求消息,response对象是来设置响应消息. ...
- 软工作业 wc-java
项目要求: 实现一个统计程序,它能正确统计程序文件中的字符数.单词数.行数,以及还具备其他扩展功能,并能够快速地处理多个文件. 具体功能 -c 返回文件字符数 -w 返回词的数目 -l 返回行数 扩展 ...
- php exec执行视频图片转换
首先安装ffmpeg <?php set_time_limit(0) ; $cmd = "ffmpeg -i 'input/3.mp4' -r 1 -q:v 2 -f image2 i ...
- 【Java字节码】Idea中查看Java字节码的插件jclasslib Bytecode viewer
Idea插件搜索:jclasslib Bytecode viewer 安装完后,maven install你的项目(因为该插件会读取target下的class文件),然后选中某个java文件,按下图操 ...
- Python并发编程-queue
Python并发编程-queue 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Queue # !/usr/bin/env python # _*_conding:utf-8_ ...