原生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 相关文章推荐
让广告代码不再影响你的网页加载速度
Jul 07 Javascript
新浪的图片新闻效果
Jan 13 Javascript
js实现iframe动态调整高度的代码
Jan 06 Javascript
JavaScript面向对象设计二 构造函数模式
Dec 20 Javascript
jquery 插件学习(五)
Aug 06 Javascript
ExtJS如何设置与获取radio控件的选取状态
Jan 22 Javascript
JavaScript 七大技巧(二)
Dec 13 Javascript
Underscore源码分析
Dec 30 Javascript
js中遍历Map对象的简单实例
Aug 08 Javascript
图片加载完成再执行事件的实例
Nov 16 Javascript
微信JS-SDK实现微信会员卡功能(给用户微信卡包里发送会员卡)
Jul 25 Javascript
解决angular 使用原生拖拽页面卡顿及表单控件输入延迟问题
Apr 21 Javascript
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
优化使用mysql存储session的php代码
2008/01/10 PHP
ExtJS与PHP、MySQL实现存储的方法
2010/04/02 PHP
Laravel Memcached缓存驱动的配置与应用方法分析
2016/10/08 PHP
PHP基于socket实现客户端和服务端通讯功能
2017/07/13 PHP
如何通过View::first使用Laravel Blade的动态模板详解
2017/09/21 PHP
YII2.0框架行为(Behavior)深入详解
2019/07/26 PHP
JS 日期验证正则附asp日期格式化函数
2009/09/11 Javascript
探讨jQuery的ajax使用场景(c#)
2013/12/03 Javascript
分享一个自己写的简单的javascript分页组件
2015/02/15 Javascript
JavaScript 匿名函数和闭包介绍
2015/04/13 Javascript
谈谈javascript中使用连等赋值操作带来的问题
2015/11/26 Javascript
jQuery 3.0 的 setter和getter 模式详解
2016/07/11 Javascript
JavaScript 通过Ajax 动态加载CheckBox复选框
2017/08/31 Javascript
vue中的数据绑定原理的实现
2018/07/02 Javascript
Vue项目环境搭建详细总结
2019/09/26 Javascript
ES6字符串的扩展实例
2020/12/21 Javascript
Python基于FTP模块实现ftp文件上传操作示例
2018/04/23 Python
使用python实现http及ftp服务进行数据传输的方法
2018/10/26 Python
Python设计模式之外观模式实例详解
2019/01/17 Python
浅谈Python3实现两个矩形的交并比(IoU)
2020/01/18 Python
python3获取控制台输入的数据的具体实例
2020/08/16 Python
python日志通过不同的等级打印不同的颜色(示例代码)
2021/01/13 Python
HTML5 Notification(桌面提醒)功能使用实例
2014/03/17 HTML / CSS
白色公司:The White Company
2017/10/11 全球购物
芬兰灯具网上商店:Nettilamppu.fi
2018/06/30 全球购物
Famous Footwear加拿大:美国多品牌运动休闲鞋店
2018/12/05 全球购物
AJAX应用和传统Web应用有什么不同
2013/08/24 面试题
口腔工艺技术专业毕业生自荐信
2013/09/27 职场文书
大学毕业感言一句话
2014/02/06 职场文书
在校大学生的职业生涯规划书
2014/03/14 职场文书
董事长秘书工作职责
2014/06/10 职场文书
政府采购方案
2014/06/12 职场文书
高速铁道技术专业求职信
2014/08/09 职场文书
2014年仓库管理员工作总结
2014/11/18 职场文书
刮痧观后感
2015/06/05 职场文书
一起来看看Vue的核心原理剖析
2022/03/24 Vue.js