原生js实现打字动画游戏


Posted in Javascript onFebruary 04, 2017

这是昨天用原生的js写的打字动画游戏,主要用的间歇定时器,对象,还有Math方法,感觉还行,主要看消除字母的时间快慢,但是也有bug,就是字母都是一次性生成的,所以一开始,看起来感觉会有种爆炸的感觉,如果能够一次性生成一批,然后分批往下掉就好了,求大神帮忙改改,大家也可以参考参考。

<!DOCTYPE html>
<html>
<head lang="en">
 <meta charset="UTF-8">
 <title></title>
 <style>
  body,button{
   margin: 0;
   padding: 0;
  }
  body {
   background: #333;
  }
  #game {
   width: 400px;
   margin: 0 auto;
  }
  #start {
   width: 80px;
   height: 40px;
  }
  span {
   margin: 20px;
   color: white;
  }
  .letter {
   position: absolute;
   color: yellow;
   font: bold 30px "Arial";
  }
 </style>
 <script>
  window.onload= function () {
   var start = document.getElementById("start");
   var scroll = document.getElementById("scroll");
   var time = document.getElementById("time");
   var g = 1 ;//Gravity
   var timenum = 0 ;//时间的计数
   var num = 0 ;//成绩的计数
   var gameover = false ;
   var timeandtime = null;
   var letters = null ;
   //字母放在一个字符串里面,随机选取
   var str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
   //点击开始按钮,字母会自动生成,从顶部,以随机速度落下
   //用户操作:按钮对应字母的按钮,然后字母就会消失
   //用户没有点击到的按钮到达底部以后会回到顶上重新落下;
   //用户清除所有字母后,弹出对话框,显示分数和文字。
   //封装一个对象,里面包含获取事件对象,页面位置,清除冒泡,获取事件目标的兼容性方法
   var eventUtil = {
    getEvent: function (event) {
     return event || window.event;
    },
    getPageX: function (event) {
     return event.pageX || event.clientX + document.documentElement.scrollLeft;
    },
    getPageY: function (event) {
     return event.pageY || event.clientY + document.documentElement.scrollTop;
    },
    stopPropagation: function (event) {
     if (event.stopPropagation) {
      event.stopPropagation();
     } else {
      event.cancelBubble = true;
     }
    },
    getTarget: function (event) {
     return event.target || event.srcElement;
    }
   };
   start.onclick= function () {
    for(var i = 0 ;i<26;i++){
     new letter();
    }
    letters = document.body.children;//将页面中所有的div全部放入一个伪数组中,第一个除外,属于game,因此遍历从1开始
    //在键盘上,按下对应的字母键,字母会立即消失,同时分数会增加,并且在上面重新生成;
    document.onkeydown = function (event) {
     var evt = eventUtil.getEvent(event);
     var keychar = String.fromCharCode(evt.keyCode);//将按下的字母键盘码转换成直接的大写字母
     for(var i = 1 ;i<letters.length;i++){
      if(keychar===letters[i].innerHTML){
       num++;
       scroll.innerHTML = num;
       document.body.removeChild(letters[i]);
      }
     }
    }
    timeandtime=setInterval(function () {
     timenum = timenum + 1 ;
     console.log(letters);
     if(letters.length==1){//当伪数组的长度只有一个时,那么游戏就结束
      gameover = true ;
      clearInterval(timeandtime);
      alert("用时"+timenum+"秒,再接再厉!突破10秒!");
     } else {
      time.innerHTML = timenum;
     }
    },1000)
   }
   //封装函数
   function letter(){
    this.x=Math.random()*900+100; //设置位置在100-1000之间
    this.y=0;
    this.speedY = Math.random()*4+1; //速度随机设置在1-5之间
    this.value = str[parseInt(Math.random()*25)]; //在26个字母中随机生成一个字母
    var letDiv = document.createElement("div");
    letDiv.className = "letter";
    letDiv.style.top = this.y+"px";
    letDiv.style.left = this.x+ "px";
    letDiv.innerHTML = this.value;
    document.body.appendChild(letDiv);
    //字母往下掉
    var that = this ;
    this.timer=setInterval(function () {
     //leader = leader + step;
     that.y = that.y + that.speedY;
     if(that.y>=client().height-letDiv.offsetHeight){
      that.y = 0;
      that.x = Math.random()*900+100;
     }
     if(!gameover){
      letDiv.style.left = that.x + "px";
      letDiv.style.top = that.y + "px";
     } else {
      clearInterval(that.timer);
     }
    },15)
   }
   // 获取可视窗口的宽度和高度窗,兼容性问题
   function client() {
    return {
     width: window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth || 0,
     height: window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight || 0
    };
   }
  }
 </script>
</head>
<body>
<div id="game">
 <button id="start">开始</button>
 <span>得分:<i id="scroll">0</i></span>
 <span>计时:<i id="time">0</i></span>
</div>
</body>
</html>

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
jQuery timers计时器简单应用说明
Oct 28 Javascript
JavaScript 模块化编程(笔记)
Apr 08 Javascript
JavaScript中Number.MIN_VALUE属性的使用示例
Jun 04 Javascript
Vue组件BootPage实现简单的分页功能
Sep 12 Javascript
JS+jQuery实现注册信息的验证功能
Sep 26 jQuery
详解vue.js数据传递以及数据分发slot
Jan 20 Javascript
vue 2.x 中axios 封装的get 和post方法
Feb 28 Javascript
bootstrap模态框关闭后清除模态框的数据方法
Aug 10 Javascript
java和js实现的洗牌小程序
Sep 30 Javascript
微信小程序实现带放大效果的轮播图
May 26 Javascript
解决Vue + Echarts 使用markLine标线(precision精度问题)
Jul 20 Javascript
vue中的可拖拽宽度div的实现示例
Apr 08 Vue.js
js实现自定义路由
Feb 04 #Javascript
jQuery窗口拖动功能的实现代码
Feb 04 #Javascript
简单易懂的天气插件(代码分享)
Feb 04 #Javascript
URL中“#” “?” &amp;“”号的作用浅析
Feb 04 #Javascript
Angularjs 依赖压缩及自定义过滤器写法
Feb 04 #Javascript
javascript实现复选框全选或反选
Feb 04 #Javascript
JavaScript获取当前时间向前推三个月的方法示例
Feb 04 #Javascript
You might like
用PHP读取RSS feed的代码
2008/08/01 PHP
PHP静态调用非静态方法的应用分析
2013/05/02 PHP
一个简单的PHP验证码实现代码
2014/05/10 PHP
PHP里的$_GET数组介绍
2019/03/22 PHP
JS控制显示隐藏兼容问题(IE6、IE7、IE8)
2010/04/01 Javascript
基于jquery的textarea发布框限制文字字数输入(添加中文识别)
2012/02/16 Javascript
jquery 鼠标滑动显示详情应用示例
2014/01/24 Javascript
JS对象转换为Jquery对象示例
2014/01/26 Javascript
jquery获取radio值实例
2014/10/16 Javascript
Javascript 多物体运动的实现
2014/12/24 Javascript
javascript中Array数组的迭代方法实例分析
2015/02/04 Javascript
AngularJS directive返回对象属性详解
2016/03/28 Javascript
关于JS中的apply,call,bind的深入解析
2016/04/05 Javascript
字符串反转_JavaScript
2016/04/28 Javascript
总结Node.js中的一些错误类型
2016/08/15 Javascript
在Vue组件中使用 TypeScript的方法
2018/02/28 Javascript
Vue中的$set的使用实例代码
2018/10/08 Javascript
js 实现watch监听数据变化的代码
2019/10/13 Javascript
JavaScript Canvas编写炫彩的网页时钟
2019/10/16 Javascript
Python中str.format()详解
2017/03/12 Python
Python实现针对给定字符串寻找最长非重复子串的方法
2018/04/21 Python
详谈Pandas中iloc和loc以及ix的区别
2018/06/08 Python
Pycharm+Scrapy安装并且初始化项目的方法
2019/01/15 Python
python django 原生sql 获取数据的例子
2019/08/14 Python
纯CSS3实现鼠标悬停提示气泡效果
2014/02/28 HTML / CSS
N.Peal官网:来自伦敦的高档羊绒品牌
2018/10/29 全球购物
美国孩之宝玩具官网:Hasbro Pulse
2019/06/24 全球购物
新闻学专业大学生职业生涯规划范文
2014/03/02 职场文书
市场营销专业大学生职业生涯规划文
2014/03/06 职场文书
百货商场楼层班组长竞聘书
2014/03/31 职场文书
社会调查研究计划书
2014/05/01 职场文书
学雷锋活动倡议书
2014/08/30 职场文书
检察院院长群众路线教育实践活动个人整改措施
2014/10/04 职场文书
交警失职检讨书
2015/01/26 职场文书
详解Flutter网络请求Dio库的使用及封装
2022/04/14 Java/Android
使用python绘制分组对比柱状图
2022/04/21 Python