jQuery实现简单飞机大战


Posted in jQuery onJuly 05, 2020

本文实例为大家分享了jQuery实现飞机大战的具体代码,供大家参考,具体内容如下

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <title>飞机大战</title>
 <style>
 * {
  margin: 0px
 }

 .container {
  height: 700px;
  width: 500px;
  background-color: black;
  margin: 5px auto; /*上下外边距5px,左右自动*/
  position: relative;
 }

 .plane {
  height: 80px;
  width: 80px;
  /*background:bg-color bg-image position/bg-size bg-repeat bg-origin bg-clip bg-attachment initial|inherit;
  */
  background: url(images/plane.png) no-repeat center / 100% 100%;
  position: absolute;
  bottom: 10px;
  left: calc(50% - 40px);
 }

 .bullet {
  height: 10px;
  width: 5px;
  /*border-radius
  *每个半径的四个值的顺序是:左上角,右上角,右下角,左下角。
  *如果省略左下角,右上角是相同的。如果省略右下角,左上角是相同的。
  *如果省略右上角,左上角是相同的。
  */
  border-radius: 45% 45% 0 0;
  /*box-shadow: h-shadow v-shadow blur spread color inset;
  *h-shadow: 必需,水平阴影的位置
  *v-shadow: 必需,垂直阴影的位置
  *blur: 可选,模糊距离
  *spread: 可选,阴影的大小
  *color: 可选,阴影的颜色
  *inset: 可选,从外层的阴影(开始时)改变阴影内侧阴影
  */
  box-shadow: 0px 2px 10px orange;
  background: gold;
  position: absolute;
 }

 .enemy {
  height: 34.4px;
  width: 32.5px;
  /*background:bg-color bg-image position/bg-size bg-repeat bg-origin bg-clip bg-attachment initial|inherit;
  */
  background: url(images/enemy.png) no-repeat center / 100% 100%;
  transform: rotate(180deg);
  position: absolute;
  overflow: hidden;
  top: 0px;
 }

 h2 {
  height: 40px;
  display: table;
  border-color: deepskyblue;
  border-radius: 5px;
  background-color: deepskyblue;
  text-align: center;
  padding: 5px;
  position: relative;
  float: right;
  right: 300px;
 }
 </style>
 <!--引入jQuery-->
 <script src="jquery-3.4.1.js"></script>
</head>
<body>
<h2>得分:
 <span id="score" style="color: white;">0</span>
</h2>
<div class="container">
 <div class="plane">

 </div>
</div>
<script type="text/javascript">
 // 入口函数
 $(function () {
 // 变量定义
 var bulletCreateInterval = 300; // 子弹发射时间间隔
 var bulletMoveInterval = 100; // 子弹飞行时间间隔
 var bulletSpeed = 10;  // 子弹飞行速度
 var enemyCreateInterval = 2000; // 敌机出生时间间隔
 var enemyMoveInterval = 100; // 敌机下降时间间隔
 var enemySpeed = 5;   // 敌机下降速度
 var bGamePlaying = false;  // 游戏状态
 var score = 0;
 var endTime = new Date();
 // 计算飞机位置
 var calcPosition = (left, top, maxLeft, maxTop, minLeft = 0, minTop = 0) => {
  left = left < minLeft ? minLeft : left > maxLeft ? maxLeft : left;
  top = top < minTop ? minTop : top > maxTop ? maxTop : top;
  return {left, top};
 }
 // 获取DOM对象的四个边界位置
 var getDomTRBL = (dom) => {
  var bounds = {};
  bounds.left = dom.offsetLeft;
  bounds.right = dom.offsetLeft + dom.offsetWidth;
  bounds.top = dom.offsetTop;
  bounds.bottom = dom.offsetTop + dom.offsetHeight;
  return bounds;
 }
 // 计算两个div是否相撞
 var calcHit = (div1, div2) => {
  var bounds1 = getDomTRBL(div1);
  var bounds2 = getDomTRBL(div2);
  if (bounds1.left >= bounds2.left && bounds1.left <= bounds2.right) {
  if (bounds1.top >= bounds2.top && bounds1.top <= bounds2.bottom) {
   return true;
  }
  else if (bounds1.bottom >= bounds2.top && bounds1.bottom <= bounds2.bottom) {
   return true;
  }
  }
  else if (bounds1.right >= bounds2.left && bounds1.right <= bounds2.right) {
  if (bounds1.top >= bounds2.top && bounds1.top <= bounds2.bottom) {
   return true;
  }
  else if (bounds1.bottom >= bounds2.top && bounds1.bottom <= bounds2.bottom) {
   return true;
  }
  }
  return false;
 }
 // 发射子弹
 var shoot = () => {
  // 控制发射时间间隔
  if (new Date() - endTime < bulletCreateInterval) {
  return false;
  }
  /*addClass() 方法向被选元素添加一个或多个类名。
  *该方法不会移除已存在的 class 属性,仅仅添加一个或多个类名到 class 属性。
  *提示:如需添加多个类,请使用空格分隔类名。
  */
  var planeLF = $(".plane").position().left;
  var planeTP = $(".plane").position().top;
  var bullet = $("<div></div>").addClass("bullet");
  $(".container").append(bullet);
  var bulletLF = planeLF + $(".plane").innerWidth() / 2 - bullet.innerWidth() / 2;
  var bulletTP = planeTP - $(".plane").innerHeight() / 2 + 20;
  bullet.css("left", bulletLF).css("top", bulletTP);

  endTime = new Date();
  return true;
 }
 // 键盘按下事件
 $(window).keydown(function (e) {
  if (e.keyCode == 13) { //enter 开始游戏
  bGamePlaying = true;
  console.log("game start!")
  }
  if (!bGamePlaying) return;
  var tp = $(".plane").position().top;
  var lf = $(".plane").position().left;
  switch (e.keyCode) {
  case 87:// w
   tp -= 10;
   break;
  case 83:// s
   tp += 10;
   break;
  case 65:// a
   lf -= 10;
   break;
  case 68:// d
   lf += 10;
   break;
  case 74:// j
   shoot(); // 发射子弹
   break;
  }
  var maxLeft = $(".container").innerWidth() - $(".plane").innerWidth();
  var maxTop = $(".container").innerHeight() - $(".plane").innerHeight();
  var position = calcPosition(lf, tp, maxLeft, maxTop);
  $(".plane").css("left", position.left).css("top", position.top);
 });
 // 鼠标移动事件
 var containerBounds = getDomTRBL($(".container")[0]);
 $(document).mousemove(function (e) {
  if (!bGamePlaying) return;
  var tp = e.pageY;
  var lf = e.pageX;
  if (tp >= containerBounds.top && tp <= containerBounds.bottom && lf >= containerBounds.left && lf <= containerBounds.right) {
  tp -= containerBounds.top;
  lf -= containerBounds.left;
  }
  else return;
  tp -= $(".plane").innerHeight() / 2;
  lf -= $(".plane").innerWidth() / 2;
  var maxLeft = $(".container").innerWidth() - $(".plane").innerWidth();
  var maxTop = $(".container").innerHeight() - $(".plane").innerHeight();
  var position = calcPosition(lf, tp, maxLeft, maxTop);
  $(".plane").css("left", position.left).css("top", position.top);
 });
 // 鼠标点击事件
 $(window).click(() => {
  if (!bGamePlaying) {
  bGamePlaying = true;
  }
  shoot();
 });
 // 为了便于对计时器进行操作,选择用一个计时器对选取到的所有元素进行操作
 // 这样可以大幅减少计时器的数目
 // 生成敌方战机计时器
 var enemyCreateTimer = setInterval(() => {
  var enemy = $("<div></div>").addClass("enemy").css("top", 0);
  $(".container").append(enemy);
  // round()方法可把一个数字舍入为最接近的整数(四舍五入)
  var left = Math.round(Math.random() * ($(".container").innerWidth() - $(".enemy").innerWidth()));
  enemy.css("left", left);
 }, enemyCreateInterval);
 // 让子弹飞计时器
 var bulletTimer = setInterval(() => {
  $(".bullet").each((index, element) => {
  var bullet = $(element);
  bullet.css("top", bullet.position().top - bulletSpeed);
  if (bullet.position().top < 0) {
   bullet.remove();
  }
  });
 }, bulletMoveInterval);
 // 敌机下落计时器
 var enemyTimer = setInterval(() => {
  $(".enemy").each((index, element) => {
  var enemy = $(element);
  enemy.css("top", enemy.position().top + enemySpeed);
  if (enemy.position().top > $(".container").innerHeight()) {
   enemy.remove();
  }
  });
 }, enemyMoveInterval);
 // 游戏主计时器
 var mainTimer = setInterval(() => {
  var plane = $(".plane").get(0);
  $(".enemy").each(function (index, enemy) {
  //判断玩家是否撞上了敌机
  if (calcHit(plane, enemy) || calcHit(enemy, plane)) {
   stopGame();
   return;
  }
  // 判断子弹是否撞上敌机
  $(".bullet").each((index, bullet) => {
   if (calcHit(enemy, bullet) || calcHit(bullet, enemy)) {
   enemy.remove();
   bullet.remove();
   score += 10;
   $("#score").text(score);
   }
  });
  });
 }, 50);
 // 停止游戏
 var stopGame = () => {
  bGamePlaying = false;
  clearInterval(enemyCreateTimer);
  clearInterval(enemyTimer);
  clearInterval(bulletTimer);
  clearInterval(mainTimer);
  alert("游戏结束!你的积分为" + score);
 }
 });
</script>
</body>
</html>

更多有趣的经典小游戏实现专题,分享给大家:

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

jQuery 相关文章推荐
Django1.7+JQuery+Ajax验证用户注册集成小例子
Apr 08 jQuery
jQuery+C#实现参数RSA加密传输功能【附jsencrypt.js下载】
Jun 26 jQuery
jQuery常见面试题之DOM操作详析
Jul 05 jQuery
jquery操作ul的一些操作笔记整理(干货)
Aug 31 jQuery
jQuery实现火车票买票城市选择切换功能
Sep 15 jQuery
jQuery进阶实践之利用最优雅的方式如何写ajax请求
Dec 20 jQuery
使用jQuery 操作table 完成单元格合并的实例
Dec 27 jQuery
jQuery轮播图实例详解
Aug 15 jQuery
jquery获取元素到屏幕四周可视距离的方法
Sep 05 jQuery
jQuery设置下拉框显示与隐藏效果的方法分析
Sep 15 jQuery
jQuery Raty星级评分插件使用方法实例分析
Nov 25 jQuery
jQuery实现简单弹幕效果
Nov 28 jQuery
jQuery实现简单日历效果
Jul 05 #jQuery
jQuery实现飞机大战小游戏
Jul 05 #jQuery
jquery实现上传图片功能
Jun 29 #jQuery
jQuery实时统计输入框字数及限制
Jun 24 #jQuery
jQuery实现移动端下拉展现新的内容回弹动画
Jun 24 #jQuery
如何解决jQuery 和其他JS库的冲突
Jun 22 #jQuery
jQuery 移除事件的方法
Jun 20 #jQuery
You might like
php-perl哈希算法实现(times33哈希算法)
2013/12/30 PHP
php 生成自动创建文件夹并上传文件的示例代码
2014/03/07 PHP
帝国CMS留言板回复后发送EMAIL通知客户
2015/07/06 PHP
浅谈php的优缺点
2015/07/14 PHP
Yii2实现ajax上传图片插件用法
2016/04/28 PHP
PHP高并发和大流量解决方案整理
2019/12/24 PHP
PHP设计模式(四)原型模式Prototype实例详解【创建型】
2020/05/02 PHP
javascript之解决IE下不渲染的bug
2007/06/29 Javascript
三种动态加载js的jquery实例代码另附去除js方法
2014/04/30 Javascript
JavaScript设计模式之策略模式实例
2014/10/10 Javascript
JavaScript中的Math.atan2()方法使用详解
2015/06/15 Javascript
使用jQuery UI库开发Web界面的简单入门指引
2016/04/22 Javascript
关于session和cookie的简单理解
2016/06/08 Javascript
Javascript计算二维数组重复值示例代码
2016/12/18 Javascript
javascript中json对象json数组json字符串互转及取值方法
2017/04/19 Javascript
详解Vue.js基于$.ajax获取数据并与组件的data绑定
2017/05/26 Javascript
浅谈在react中如何实现扫码枪输入
2018/07/04 Javascript
layui form表单提交后实现自动刷新
2019/10/25 Javascript
element实现合并单元格通用方法
2019/11/13 Javascript
jQuery实现验证用户登录
2019/12/10 jQuery
JS代码简洁方式之函数方法详解
2020/07/28 Javascript
python中map、any、all函数用法分析
2015/04/21 Python
使用Python机器学习降低静态日志噪声
2018/09/29 Python
python3爬虫获取html内容及各属性值的方法
2018/12/17 Python
python执行精确的小数计算方法
2019/01/21 Python
Python实现最大子序和的方法示例
2019/07/05 Python
pandas分批读取大数据集教程
2020/06/06 Python
高级文秘工作总结的自我评价
2013/09/28 职场文书
小学生开学第一课活动方案
2014/03/27 职场文书
交警失职检讨书
2015/01/26 职场文书
2015年化验室工作总结
2015/04/23 职场文书
婚育证明样本
2015/06/16 职场文书
消防宣传语大全
2015/07/13 职场文书
法律服务所工作总结
2015/08/10 职场文书
浅谈如何保证Mysql主从一致
2022/03/13 MySQL
SpringBoot2零基础到精通之数据与页面响应
2022/03/22 Java/Android