前端案例:像素鸟小游戏(js+dom操作,完整代码,附案例素材)

news2024/11/19 3:41:05

目录

一、案例效果

二、实现思路

三、完整代码+详细注释

四、案例素材


一、案例效果

二、实现思路

  1. 创建游戏背景板和小鸟,并分别设置相对定位与绝对定位;
  2. 初始化背景图的位置;
  3. 初始化小鸟的位置;
  4. 设置游戏状态,游戏开始时背景和管道全部向左运动,游戏结束全部停止运动;
  5. 使小鸟飞行,其实就是背景图在 X 轴方向的位置不断减小,实现小鸟向右飞行效果;
  6. 设置点击事件,每点击一次小鸟在Y轴的位置减小,实现向上飞的效果;
  7. 创建管道,X 方向上管道和下管道位置相同,Y 方向上上管道和下管道高度随机,但中间要空出200px;
  8. 实现管道向左运动,与背景图向左操作类似,也是在 X 轴方向的位置不断减小;
  9. 管道向左运动移出游戏面板最左侧时再回到原位重新执行,实现循环效果;
  10. 定义上下管道的临界值,也就是上下管道自身区域;
  11. 小鸟位置与上下管道位置重合(相碰撞)时游戏结束;
  12. 多次调用管道创建函数,产生多组管道。

三、完整代码+详细注释

<!DOCTYPE html>
<html>

<head>
  <meta charset="UTF-8">
  <title>小游戏:像素鸟</title>
  <style>
    * {
      margin: 0;
      padding: 0;
    }

    #game {
      width: 800px;
      height: 600px;
      background: url('./img/sky.png');
      position: relative;
      margin: auto;
      overflow: hidden;
    }

    #bird {
      width: 34px;
      height: 25px;
      background: url(./img/birds.png) -10px -8px no-repeat;
      position: absolute;
      top: 100px;
      left: 100px;
    }
  </style>
</head>

<body>
  <!-- 游戏背景 -->
  <div id="game">
    <!-- 小鸟 -->
    <div id="bird"></div>
  </div>
</body>

<script>
  //获取游戏背景和小鸟
  var game = document.getElementById('game');
  var birdEle = document.getElementById('bird');

  //初始化背景图
  var sky = {
    x: 0 //背景图初始位置为0
  }

  //初始化小鸟
  var bird = {
    speedX: 5, //小鸟在X轴的速度
    SpeedY: 0, //小鸟在Y轴的速度
    //小鸟坐标
    x: birdEle.offsetLeft, //小鸟初始位置在绝对定位的位置
    y: birdEle.offsetTop,
  }

  var runing = true; //游戏状态

  setInterval(function () {
    if (runing) {
      //小鸟飞行(其实是背景在动)
      sky.x -= 5; //背景每次-5px,以实现向左运动的效果
      game.style.backgroundPositionX = sky.x + 'px';
      //小鸟上下运动
      bird.SpeedY += 1; //每一次点击小鸟向上10px后开始自增也就是再自动向下
      bird.y += bird.SpeedY; //小鸟自动不断向下运动
      //判断游戏状态
      if (bird.y < 0) { //超出游戏背景顶部时游戏结束
        runing = false;
        bird.y = 0;
      }
      if (bird.y + birdEle.offsetHeight > 600) { //超出游戏背景底部时游戏结束
        runing = false;
        bird.y = 600 - birdEle.offsetHeight;
      }
      birdEle.style.top = bird.y + 'px';
    }
  }, 30);

  //点击时小鸟向上运动
  document.onclick = function () {
    bird.SpeedY = -10; //点击一次向上运动10px
  }

  //创建管道
  function creatPipe(position) {
    var pipe = {};
    pipe.x = position;
    pipe.upHeight = 200 + parseInt(Math.random() * 100); //上管道高度为200 - 300px
    pipe.doHeight = 600 - pipe.upHeight - 200; //下管道高度
    pipe.doTop = pipe.upHeight + 200; //上下两管道之间200px

    //创建上管道
    var upPipe = document.createElement('div'); //新建div
    upPipe.style.width = '52px';
    upPipe.style.height = pipe.upHeight + 'px';
    upPipe.style.background = 'url(./img/pipe2.png) no-repeat center bottom';
    upPipe.style.position = 'absolute';
    upPipe.style.top = '0px';
    upPipe.style.left = pipe.x + 'px';
    game.appendChild(upPipe); //将上管道追加到游戏页面中

    //创建下管道
    var doPipe = document.createElement('div'); //新建div
    doPipe.style.width = '52px';
    doPipe.style.height = pipe.doHeight + 'px';
    doPipe.style.background = 'url(./img/pipe1.png) no-repeat center top';
    doPipe.style.position = 'absolute';
    doPipe.style.top = pipe.doTop + 'px';
    doPipe.style.left = pipe.x + 'px';
    game.appendChild(doPipe); //将下管道追加到游戏页面中

    //管道进行运动
    setInterval(function () {
      if (runing) { //游戏处于运行状态时管道再运动
        pipe.x -= 2; //x方向不断-2px,以实现管道向左运动的效果
        upPipe.style.left = pipe.x + 'px';
        doPipe.style.left = pipe.x + 'px';
        if (pipe.x < -52) { //管道移出最左侧时回到原位,实现不间断效果
          pipe.x = 800;
        }
        //上下管道临界值
        var uCheck = bird.x + 34 > pipe.x && bird.x < pipe.x + 52 && bird.y < pipe.upHeight;
        var dCheck = bird.x + 34 > pipe.x && bird.x < pipe.x + 52 && bird.y > pipe.upHeight + 200;
        if (uCheck || dCheck) { //碰到上管道或下管道临界值则游戏终止
          runing = false;
        }
      }
    }, 30)
  }
  creatPipe(400); //产生四组管道
  creatPipe(600);
  creatPipe(800);
  creatPipe(1000);
</script>

</html>

四、案例素材

sky.png

birds.png

pipe1.png

pipe2.png

                                                                

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/409330.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue 的表单验证

1.使用<el-form>包裹整个表单 在其中使用:model 绑定数据 和 :rules绑定校验规则 <el-form :model"user" :rules"rules"> ...................................... </el-from> 2.在script中添加使用数据 以及 校验规则&#xff08;都添加…

Chrome浏览器中清除特定网站的Cookie数据

背景&#xff1a;当我们在网站上遇到错误时&#xff0c;经常会用到的一个方法就是清除Cookie&#xff0c;清除网站的Cookie和网站数据来重置本地的缓存&#xff0c;很多客户端引起的错误都可以使用该方法修复&#xff0c; 但是在清除Cookie时有一个问题是使用浏览器更多中的清…

css实现文字大小自适应

在页面编写中经常会碰到页面自适应的问题&#xff0c;也就是页面内部的元素会随着窗口的放大缩小而放大缩小&#xff0c;box可以通过calc 百分比的形式做到页面自适应&#xff0c;但是box内的字体却无法做到这点&#xff0c;往往box自适应大小了&#xff0c;内部的字体还是原来…

一行代码“黑”掉任意网站

文章目录只需一行代码&#xff0c;轻轻一点就可以把任意网站变成暗黑模式。 首先我们先做一个实验&#xff0c;在任意网站中&#xff0c;打开浏览器开发者工具(F12)&#xff0c;在 C1onsole 控制台输入如下代码并回车&#xff1a; document.documentElement.style.filterinve…

使用npm安装yarn

很多同学用惯了npm安装项目依赖&#xff0c; 想要尝试使用yarn的命令&#xff0c; 但是第一次使用yarn的时候&#xff0c;发现报错&#xff0c; 这是什么情况呢&#xff1f; 因为&#xff0c;想要使用yarn&#xff0c;需要首先安装yarn。 那么问题来了&#xff0c;如何安装呢…

IDEA 创建Maven Web项目

背景 公司有一个非常老的项目&#xff0c;决定进行简单重构&#xff0c;纳入自动化流水线部署的序列。原项目采用很古老的Jar包依赖模式&#xff0c;也就是直接将jar包放在项目中。同时&#xff0c;项目结构也非常奇特&#xff0c;不是标准的Web项目目录结果。 于是&#xff…

用vue实现打印页面的几种方法

1.第一种就是直接调用 window.print()方法 这种方法的坏处就是 默认打印整个页面&#xff0c;不能打印局部页面。 2.第二种使用v-print 首先先下载 npm install vue-print-nb --save 然后在main.js中引入 main.js中引入 import Print from vue-print-nb Vue.user(Print)由于…

JS 生成条形码(一维码)jsBarcode

jsBarcode 官网 一、安装 script 引入 <script src"JsBarcode.all.min.js"></script>地址&#xff1a;https://cdn.jsdelivr.net/npm/jsbarcode3.11.5/dist/JsBarcode.all.min.js 也可以进官网查看地址。 npm方式 安装&#xff1a; npm install jsb…

vue3路由配置与路由跳转

Vue Router 是Vue.js的官方路由器。它与 Vue.js 核心深度集成&#xff0c;使使用 Vue.js 构建单页应用程序变得轻而易举。特点包括&#xff1a; 嵌套路由映射 动态路由 模块化、基于组件的路由器配置 路由参数、查询、通配符 查看由 Vue.js 的过渡系统提供支持的过渡效果细粒度…

【蓝桥杯Web】第十四届蓝桥杯Web模拟赛 3 期 | 精品题解(下)

&#x1f9d1;‍&#x1f4bc; 个人简介&#xff1a;一个不甘平庸的平凡人&#x1f36c; &#x1f5a5;️ 蓝桥杯专栏&#xff1a;蓝桥杯题解/感悟 &#x1f5a5;️ TS知识总结&#xff1a;十万字TS知识点总结 &#x1f449; 你的一键三连是我更新的最大动力❤️&#xff01; &…

HTML插入图片

图片介绍一、src属性二、其余属性三、alt用法四、title用法五、属性特点六、src路径的讲解一、src属性 符号&#xff1a;img 特点&#xff1a;单标签 代码&#xff1a; <!doctype html> <html><head><meta charset"utf-8"><title>HT…

尚品汇后台管理项目(Vue)

简介 1:什么是后台管理系统项目? 注意&#xff1a;前端领域当中&#xff0c;开发后台管理系统项目&#xff0c;并非是java、php等后台语言项目。 在前面课程当中&#xff0c;我们已经开发了一个项目【尚品汇电商平台项目】&#xff0c;这个项目主要针对的是用户&#xff08;游…

vue表单验证rules以及validator验证器的使用

为防止用户犯错&#xff0c;尽可能更早地发现并纠正错误。 Element中Form &#xff08;表单&#xff09;组件提供了表单验证的功能&#xff0c;只需要通过 rules 属性传入约定的验证规则&#xff0c;并将 Form-Item 的 prop 属性设置为需校验的字段名即可。 注意&#xff1a;…

案例说明:vue中Element UI下拉列表el-option中的key、value、label含义各是什么

可以简单理解为&#xff1a;label 是给用户展示的东西&#xff0c;value是前端往后端传递的真实值 <template><div><el-page-header back"goBack" content"注册"></el-page-header><el-divider></el-divider><el-…

flex布局优化(两端对齐,从左至右)

文章目录前言方式一 nth-child方式二 gap属性方式三 设置margin左右两边为负值总结前言 flex布局是前端常用的布局方式之一&#xff0c;但在使用过程中&#xff0c;我们总是感觉不太方便&#xff0c;因为日常开发中&#xff0c;大多数时候&#xff0c;我们想要的效果是这样的 …

2023年网络安全比赛--CMS网站渗透中职组(超详细)

一、竞赛时间 180分钟 共计3小时 二、竞赛阶段 1.使用渗透机对服务器信息收集,并将服务器中网站服务端口号作为flag提交; 2.使用渗透机对服务器信息收集,将网站的名称作为flag提交; 3.使用渗透机对服务器渗透,将可渗透页面的名称作为flag提交; 4.使用渗透机对服务器渗透,…

全网最新的vue.js下载和安装的3种方法(2023年)

文章目录1. 文章引言2. 环境搭建3. 安装vue.js3.1 方法一&#xff1a;官网下载vue.js源代码3.2 方法二&#xff1a;使用npm install创建3.3 方法三&#xff1a;使用bower下载4. 总结1. 文章引言 我主要从事java后端开发&#xff0c;但对前端也非常感兴趣&#xff0c;立志成为全…

【vite·5】vite中环境变量的使用与配置(全网最全)

什么是环境变量 根据当前的代码环境变化的变量就叫做环境变量。比如&#xff0c;在生产环境和开发环境将BASE_URL设置成不同的值&#xff0c;用来请求不同的环境的接口。 环境变量一般可以在全局访问到。在webapck中&#xff0c;我们也许看到过这样的代码 // webpack.config.…

JavaWeb:实现购物商城(课程设计完整版)

前言 做一个javaweb可以对前后端基础知识进行巩固。 就比如 前端可以用 htmlcssjsjQuery&#xff1b; 后端Http协议&#xff0c;Servlet基础&#xff0c;JSP技术&#xff0c;Mysql等 该程序做的这个就相对比较基础&#xff0c;适合大学生当课程设计用 在文章结尾附项目源代码和…

Vue生命周期钩子剖析(共12个钩子)

生命周期示意图&#xff1a; 生命周期及其钩子函数理解 生命周期&#xff1a; Vue是一个构造函数&#xff0c;当执行执行这个函数时&#xff0c;相当于初始化vue实例&#xff1b;在创建实例过程中&#xff0c;需要设置数据监听&#xff0c;编译模板&#xff0c;将实例挂载到DO…