JS实现躲避粒子小游戏


Posted in Javascript onJune 18, 2020

本文实例为大家分享了JS实现躲避粒子小游戏的具体代码,供大家参考,具体内容如下

小项目的实战操作可以帮助我们更好的掌握javascript

躲避例子游戏规则:拖拽红球躲避绿球碰撞,拖拽过程不能触碰容器内壁,以赢得游戏持久度

页面效果:

JS实现躲避粒子小游戏

实现过程

不积小流,无以成江海。
将页面效果的实现细分成小步实现:页面结构的构建,样式修饰,js中小绿球在容器顶部随机位置生成、小绿球非水平非垂直方向的运动、小绿球碰撞容器内壁后弹性运动、生成多个小绿球、拖拽红球、红球的边界判断、红球与绿球的碰撞检测、“坚持n秒”的定时器实现、清除定时器

结构搭建

创建文本、容器和红球,在此项目下小绿球是动态创建生成的;

JS实现躲避粒子小游戏

样式修饰

为创建的结构设置样式修饰

JS实现躲避粒子小游戏

动态行为Javascript

采用面向对象的编程思维

1.小绿球在容器顶部随机位置生成

用random函数生成 [0,1)内的随机小数再乘以小绿球在水平方向的运动范围,最后floor求整并将整数作为初始时小绿球与容器左壁的距离

2.小绿球非水平非垂直方向的运动

设置X方向的速度值和Y方向的速度值,与(1)相同,采用random函数乘以初始化XY方向的速度值就可以得到随机方向
创建定时器获取并更新小绿球与容器的左壁和上壁的距离以实现小球运动

3.小绿球碰撞容器内壁后弹性运动

小绿球的边界判断,碰撞左壁和右壁时X方向的速度 * -1;碰撞上壁和下壁时Y方向的速度 * -1

4.生成多个小绿球

通过定时器不断调用构造函数生成多个小绿球,并置于一个数组中

5.拖拽红球

为红球添加点击、拖动、松开事件。记住红球上一页面停留位置,与现在页面停留位置做差得到红球在XY方向的移动距离,分别加上上一停留位置红球与容器左壁和上壁的距离得到现在红球与容器左壁和上壁的距离,不断循环更新上次停留位置和现在停留位置即可

6.红球的边界判断

红球和绿球的移动范围都是容器的宽度高度减去自身球面的宽度和高度。触碰边界则重载页面,为了避免页面重载时出现持续触碰边界的情况加了锁

7.红球与绿球的碰撞检测

判断两圆心之间的距离是否小于两圆半径之和

8.“坚持n秒”的定时器实现

定时器计时并修改span标签的innerHTML

9.清除定时器

游戏结束时清除定时器

下面展示代码:

/* 
 1.随机生成小绿球在顶部 位置随机
 3.小绿球自己运动
 4.弹性运动
 2.生成多个

 5.红球拖拽
 6.红球边界判断
 7.红球和绿球碰撞检测

 8.定时器清除
 9.坚持了多久
 (但对象编程)
*/

var game = {
 name:'游戏开始',
 redBall:document.getElementsByClassName('red')[0],
 RunTime:document.getElementsByTagName('span')[0],
 num:0,
 greenArr:[],
 flag:true,
 movePlus:{
 outer:document.getElementsByClassName('outer')[0],
 iWidth:document.getElementsByClassName('outer')[0].offsetWidth,
 iHeight:document.getElementsByClassName('outer')[0].offsetHeight,
 ispeedY:10,//小绿球的速度
 ispeedX:10
 },

 init:function(){
 console.log(this.name);
 // console.log(this.movePlus.iHeight);
 this.createBall(this.movePlus);
 this.dragRedBall(this.movePlus);
 this.runTime();
 },
 runTime:function(){
 var self = this;
 this.Timer = setInterval(function(){
  self.num++;
  self.RunTime.innerHTML = '坚持了' + self.num + '秒';
 },1000);
 },
 createBall:function(obj){
 var self = this;
 var plus = obj;

 function Green(plus){
  this.ball = document.createElement('div');
  this.ball.className = 'green';
  plus.outer.appendChild(this.ball);
  this.subWidth = Math.floor(Math.random()*(plus.iWidth - this.ball.offsetWidth));
  this.ball.style.left = this.subWidth + 'px';
  // this.subHeight = Math.floor(Math.random()*(plus.iHeight - this.ball.offsetHeight));
  // this.ball.style.top = this.subHeight + 'px';
  this.ispeedX = Math.floor(Math.random()*plus.ispeedX) + 1;
  this.ispeedY = Math.floor(Math.random()*plus.ispeedY) + 1;

  // 自定义属性
  this.iWidth = plus.iWidth;
  this.iHeight = plus.iHeight;
 }
 //先生出一个
 var greenBall = new Green(plus);
 this.greenArr.push(greenBall);

  this.creatTimer = setInterval(function(){
  var greenBall = new Green(plus);
  self.greenArr.push(greenBall)
 }, 2000);

 this.moveBall();
 },
 moveBall:function(){
 //创建定时器
 var self = this;
 // 保存window的this
 this.goTimer = setInterval(function(){

  for(var i = 0;i < self.greenArr.length;i ++){
  self.crashCheck(self.greenArr[i]);
  var newLeft = self.greenArr[i].ball.offsetLeft + self.greenArr[i].ispeedX ;
  var newTop = self.greenArr[i].ball.offsetTop + self.greenArr[i].ispeedY ;
  if(newLeft<0){
   self.greenArr[i].ispeedX *= -1;
  }
  else if(newLeft > (self.greenArr[i].iWidth - self.greenArr[i].ball.offsetWidth)){
   self.greenArr[i].ispeedX *= -1;
  }
  else if(newTop<0){
   self.greenArr[i].ispeedY *= -1;
   // self.greenArr[i].ispeedX *= -1;
  }
  else if(newTop > (self.greenArr[i].iHeight - self.greenArr[i].ball.offsetHeight)){
   self.greenArr[i].ispeedY *= -1;
   // self.greenArr[i].ispeedX *= -1;
  }
  // console.log((self.greenArr[i].iWidth - self.greenArr[i].ball.offsetWidth),(greenBall.iHeight - greenBall.ball.offsetHeight),greenBall.ispeedX,greenBall.ispeedY);
  self.greenArr[i].ball.style.left = newLeft + 'px';
  self.greenArr[i].ball.style.top = newTop + 'px';

  }
  
 },50)
 },

 dragRedBall:function(obj){
 var self = this;
 this.redBall.onmousedown = function(e){
  var lastX = e.pageX,
  lastY = e.pageY;
  // self.redBall.style.left = lastX;
  // self.redBall.style.top = lastY;
  document.onmousemove = function(e){
  var newX = e.pageX,
   newY = e.pageY;
  self.redBall.style.left = (newX - lastX) + self.redBall.offsetLeft + 'px';
  self.redBall.style.top = (newY - lastY) + self.redBall.offsetTop + 'px';
  // this.redBall.style.top = newY;
  lastX = newX;
  lastY = newY;

  //判断边界

  if(self.redBall.offsetLeft<0 && self.flag){
   alert("坚持了" + self.num + '秒' + "\n" + "游戏结束");
   self.flag = false;//加锁
   self.clearTimer();
   window.location.reload();
  }else if(self.redBall.offsetLeft>(obj.iWidth-self.redBall.offsetWidth) && self.flag){
   alert("坚持了" + self.num + '秒' + "\n" + "游戏结束");
   self.flag = false;
   self.clearTimer();
   window.location.reload();//刷新页面 游戏重开
  }else if(self.redBall.offsetTop<0 && self.flag){
   alert("坚持了" + self.num + '秒' + "\n" + "游戏结束");
   self.flag = false;
   self.clearTimer();
   window.location.reload();
  }else if(self.redBall.offsetTop>(obj.iHeight-self.redBall.offsetHeight ) && self.flag){
   alert("坚持了" + self.num + '秒' + "\n" + "游戏结束");
   self.flag = false;
   self.clearTimer();
   window.location.reload();
  }
  }

  this.onmouseup = function(){
  document.onmousemove = null;
  }
 }
 },

 crashCheck:function(greenBall){
 // var self = this;
 //效率球的圆心
 var greenX1 = greenBall.ball.offsetLeft + Math.floor(greenBall.ball.offsetWidth / 2),
  greenY1 = greenBall.ball.offsetTop + Math.floor(greenBall.ball.offsetHeight / 2),
 //小红求的圆心
  redX1 = this.redBall.offsetLeft + Math.floor(this.redBall.offsetWidth / 2),
  redY1 = this.redBall.offsetTop + Math.floor(this.redBall.offsetHeight / 2);
 // console.log(greenX1,greenY1,redX1,redY1);
 // debug成功
 //x1 - x2,y1 - y2 的绝对值
 var dx = Math.abs(greenX1 - redX1),
  dy = Math.abs(greenY1 - redY1);
 // console.log(dx,dy);
 var dis = Math.floor(Math.sqrt(Math.pow(dx,2) + Math.pow(dy,2)));
 // console.log(dis);
 var R = greenBall.ball.offsetWidth/2 + this.redBall.offsetWidth/2;

 if(dis < R && this.flag){
  alert("坚持了" + this.num + '秒' + "\n" + "游戏结束");
  this.flag = false;
  this.clearTimer();
  window.location.reload();
 }

 }, 

 clearTimer:function(){
 clearInterval(this.goTimer);
 clearInterval(this.creatTimer);
 clearInterval(this.Timer);
 }
}

game.init();//入口函数

请各位大佬指正

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript中变量提升 Hoisting
Jul 03 Javascript
jQuery在iframe中无法弹出对话框的解决方法
Jan 12 Javascript
jQuery下拉菜单的实现代码
Nov 03 Javascript
DOM事件探秘篇
Feb 15 Javascript
详解使用vue实现tab 切换操作
Jul 03 Javascript
vue获取当前点击的元素并传值的实例
Mar 09 Javascript
解决Angular4项目部署到服务器上刷新404的问题
Aug 31 Javascript
trackingjs+websocket+百度人脸识别API实现人脸签到
Nov 26 Javascript
JavaScript 实现同时选取多个时间段的方法
Oct 17 Javascript
小程序websocket心跳库(websocket-heartbeat-miniprogram)
Feb 23 Javascript
JS组件库AlloyTouch实现图片轮播过程解析
May 29 Javascript
vue根据条件不同显示不同按钮的操作
Aug 04 Javascript
html-webpack-plugin修改页面的title的方法
Jun 18 #Javascript
vue实现购物车结算功能
Jun 18 #Javascript
vue-cli4.x创建企业级项目的方法步骤
Jun 18 #Javascript
javascript实现文字跑马灯效果
Jun 18 #Javascript
node.js +mongdb实现登录功能
Jun 18 #Javascript
VSCode launch.json配置详细教程
Jun 18 #Javascript
JavaScript中使用Spread运算符的八种方法总结
Jun 18 #Javascript
You might like
如何用php获取程序执行的时间
2013/06/09 PHP
php获取网页上所有链接的方法
2015/04/03 PHP
php检测url是否存在的方法
2015/04/14 PHP
[原创]PHPCMS遭遇会员投稿审核无效的解决方法
2017/01/11 PHP
input、button的不同type值在ajax提交表单时导致的陷阱
2009/02/24 Javascript
用js解决数字不能换行问题
2010/08/10 Javascript
IE6、IE7中获取Button元素的值的bug说明
2011/08/28 Javascript
JQuery操作三大控件(下拉,单选,复选)的方法
2013/08/06 Javascript
完美解决AJAX跨域问题
2013/11/01 Javascript
jquery中$each()方法的使用指南
2015/04/30 Javascript
jquery实现适用于门户站的导航下拉菜单效果代码
2015/08/24 Javascript
JS清除字符串中重复值的实现方法
2016/08/03 Javascript
Javascript json object 与string 相互转换的简单实现
2016/09/27 Javascript
vue实现简单实时汇率计算功能
2017/01/15 Javascript
详解RequireJS按需加载样式文件
2017/04/12 Javascript
JS判断微信扫码的方法
2017/08/07 Javascript
使用vs code开发Nodejs程序的使用方法
2017/09/21 NodeJs
vue2.0使用swiper组件实现轮播效果
2017/11/27 Javascript
JS实现点击拉拽轮播图pc端移动端适配
2018/09/05 Javascript
在vue中使用vuex,修改state的值示例
2019/11/08 Javascript
javascript实现弹出层效果
2019/12/10 Javascript
基于JavaScript实现轮播图效果
2021/01/02 Javascript
Python使用urllib2获取网络资源实例讲解
2013/12/02 Python
利用Anaconda完美解决Python 2与python 3的共存问题
2017/05/25 Python
Python语言生成水仙花数代码示例
2017/12/18 Python
python flask web服务实现更换默认端口和IP的方法
2019/07/26 Python
Python切图九宫格的实现方法
2019/10/10 Python
pycharm 实现本地写代码,服务器运行的操作
2020/06/08 Python
在pycharm创建scrapy项目的实现步骤
2020/12/01 Python
HTML5中新标签和常用标签详解
2014/03/07 HTML / CSS
阿玛尼化妆品美国官网:Giorgio Armani Beauty
2017/02/02 全球购物
ASICS印度官方网站:日本专业运动品牌
2020/06/20 全球购物
小学后勤管理制度
2014/01/14 职场文书
社区平安建设方案
2014/05/25 职场文书
教师三严三实学习心得体会
2014/10/11 职场文书
Python Socket编程详解
2021/04/25 Python