JavaScript实现简易飞机大战

下面我将详细讲解“JavaScript实现简易飞机大战”的完整攻略。

前言

在开始编写代码之前,我们需要先了解一下游戏的基本结构和要素,主要包括游戏界面、玩家飞机、敌机、子弹、游戏结束等。在了解了这些基本要素后,我们才能更好的开始编写游戏代码。

游戏界面

游戏的界面主要由背景和玩家飞机、敌机等元素组成。我们可以使用HTML和CSS创建一个游戏界面,其中CSS的样式可以设定背景图片和其他元素的样式。

<div class="game">
  <div class="background"></div>
  <div class="player"></div>
  <div class="enemy"></div>
</div>

<style>
  .game {
    position: relative;
    width: 480px;
    height: 680px;
    margin: 0 auto;
  }

  .background {
    background-image: url(background.jpg);
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
  }

  .player {
    background-image: url(player.png);
    position: absolute;
    bottom: 20px;
    left: 50%;
    transform: translateX(-50%);
    width: 50px;
    height: 50px;
  }

  .enemy {
    background-image: url(enemy.png);
    position: absolute;
    top: 0;
    left: 50%;
    transform: translateX(-50%);
    width: 50px;
    height: 50px;
  }
</style>

玩家飞机

玩家飞机主要有移动和射击两种行为,我们可以分别编写两个函数来实现。移动函数需要监听键盘事件,根据按键的不同来改变玩家飞机的位置。射击函数需要在每个时间间隔内不断地创建子弹并移动,当子弹移出游戏界面时需要将其从DOM中移除。

<div class="game">
  <div class="background"></div>
  <div class="player"></div>
  <div class="enemy"></div>
  <div class="bullet"></div>
</div>

<style>
  /* 省略游戏界面的样式 */

  .bullet {
    background-image: url(bullet.png);
    position: absolute;
    width: 5px;
    height: 12px;
  }
</style>

<script>
  // 玩家飞机的移动函数
  function movePlayer(event) {
    const player = document.querySelector('.player')
    const game = document.querySelector('.game')
    const gameRect = game.getBoundingClientRect()
    const playerRect = player.getBoundingClientRect()

    // 根据按键来移动玩家飞机
    if (event.key === 'ArrowLeft' && playerRect.left > gameRect.left) {
      player.style.left = playerRect.left - 10 + 'px'
    } else if (event.key === 'ArrowRight' && playerRect.right < gameRect.right) {
      player.style.left = playerRect.left + 10 + 'px'
    } else if (event.key === 'ArrowUp' && playerRect.top > gameRect.top) {
      player.style.top = playerRect.top - 10 + 'px'
    } else if (event.key === 'ArrowDown' && playerRect.bottom < gameRect.bottom) {
      player.style.top = playerRect.top + 10 + 'px'
    }
  }

  // 玩家飞机的射击函数
  function shoot() {
    const player = document.querySelector('.player')
    const bullet = document.createElement('div')
    const bulletPos = {
      x: player.getBoundingClientRect().left + 22,
      y: player.getBoundingClientRect().top - 12
    }

    // 创建子弹并设置样式和位置
    bullet.classList.add('bullet')
    bullet.style.left = bulletPos.x + 'px'
    bullet.style.top = bulletPos.y + 'px'
    document.querySelector('.game').appendChild(bullet)

    // 移动子弹
    const timer = setInterval(() => {
      bulletPos.y -= 10
      bullet.style.top = bulletPos.y + 'px'

      // 如果子弹移出界面,就将其从DOM中移除
      if (bulletPos.y < -10) {
        clearInterval(timer)
        bullet.remove()
      }
    }, 30)
  }

  window.addEventListener('keydown', movePlayer)
  setInterval(shoot, 300)
</script>

敌机

敌机的出现也需要在一定的时间间隔内不断地创建,并且会向下移动。当敌机被子弹击中时,要将其从DOM中移除。当敌机与玩家飞机相撞时,游戏结束。

<div class="game">
  <div class="background"></div>
  <div class="player"></div>
  <div class="bullet"></div>
</div>

<style>
  /* 省略游戏界面和子弹的样式 */

  .enemy {
    background-image: url(enemy.png);
    position: absolute;
    width: 50px;
    height: 50px;
  }
</style>

<script>
  // 创建敌机
  function createEnemy() {
    const enemy = document.createElement('div')
    const enemyPos = {
      x: Math.random() * 430 + 25,
      y: -50
    }

    // 设置敌机的样式和位置
    enemy.classList.add('enemy')
    enemy.style.left = enemyPos.x + 'px'
    enemy.style.top = enemyPos.y + 'px'
    document.querySelector('.game').appendChild(enemy)

    // 移动敌机
    const timer = setInterval(() => {
      enemyPos.y += 5
      enemy.style.top = enemyPos.y + 'px'

      // 如果敌机移出界面,就将其从DOM中移除
      if (enemyPos.y > 680) {
        clearInterval(timer)
        enemy.remove()
      }

      // 检测敌机和子弹是否相撞
      const bullets = document.querySelectorAll('.bullet')

      bullets.forEach(bullet => {
        const bulletRect = bullet.getBoundingClientRect()
        const enemyRect = enemy.getBoundingClientRect()

        if (
          bulletRect.bottom >= enemyRect.top &&
          bulletRect.top <= enemyRect.bottom &&
          bulletRect.right >= enemyRect.left &&
          bulletRect.left <= enemyRect.right
        ) {
          clearInterval(timer)
          enemy.remove()
          bullet.remove()
        }
      })

      // 检测敌机和玩家飞机是否相撞
      const player = document.querySelector('.player')
      const playerRect = player.getBoundingClientRect()

      if (
        playerRect.bottom >= enemyRect.top &&
        playerRect.top <= enemyRect.bottom &&
        playerRect.right >= enemyRect.left &&
        playerRect.left <= enemyRect.right
      ) {
        clearInterval(timer)
        gameOver()
      }
    }, 30)
  }

  // 游戏结束函数
  function gameOver() {
    alert('Game Over!')
  }

  setInterval(createEnemy, 1000)
</script>

示例说明

为了更好的说明代码的作用和效果,以下展示两个简单的示例。

示例1

在游戏界面中,玩家飞机可以通过上下左右键来移动,按下空格键可以发射子弹。敌机则会在一定的时间间隔内从上方出现,并向下移动。

示例2

当子弹与敌机相撞时,敌机会被摧毁并从游戏界面中消失。当敌机与玩家飞机相撞时,游戏结束并显示提示框。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript实现简易飞机大战 - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • js中动态创建json,动态为json添加属性、属性值的实例

    让我们来详细讲解一下JS中动态创建JSON、动态为JSON添加属性、属性值的实例。 一、什么是JSON JSON,全称为JavaScript Object Notation,是一种结构化的数据格式。它以文本的形式表示数据,比XML更加轻量级,也更容易解析。JSON由键值对构成,键值对之间用逗号分隔,最外层使用花括号{}。 JSON的键必须是字符串类型,值可以…

    JavaScript 2023年5月27日
    00
  • 微信小程序 生命周期和页面的生命周期详细介绍

    下面详细讲解一下微信小程序的生命周期和页面的生命周期: 微信小程序生命周期介绍 微信小程序生命周期分为两个部分:全局生命周期和页面生命周期。全局生命周期是指在整个小程序中被执行的方法,而页面生命周期则是指在页面中被执行的方法。 全局生命周期 全局生命周期包含以下方法: 1. onLaunch(options) 在小程序初始化完成时执行,只会执行一次。 参数说…

    JavaScript 2023年6月11日
    00
  • jQuery对象和Javascript对象之间转换的实例代码

    让我来为您介绍一下如何在jQuery对象和JavaScript对象之间进行转换的实例代码。 转换jQuery对象为JavaScript对象 转换单一jQuery对象为JavaScript对象 我们可以使用 [0] 或者 get(0) 方法来获取单一jQuery对象的JavaScript对象表示。 “`javascript // 定义一个jQuery对象 v…

    JavaScript 2023年5月27日
    00
  • K8S 中 kubectl 命令详解

    当我们需要在 Kubernetes 集群中进行管理操作时,kubectl 是一个必不可少的工具。它是 Kubernetes 自带的命令行管理工具,可以用来管理集群内的 Pods、Services、Deployments 等资源对象。下面详细讲解一下 kubectl 的使用方法。 安装 kubectl 在使用 kubectl 命令之前,需要先安装 kubect…

    JavaScript 2023年6月11日
    00
  • javascript原生ajax写法分享

    下面是“javascript原生ajax写法分享”的完整攻略: 什么是ajax? Ajax(Asynchronous JavaScript and XML)是一种用于创建快速动态网页的技术,利用异步传输数据,实现网页无需刷新就能实现获取和更新数据。它最大的优点就是在不刷新页面的情况下与服务器端进行通信,提高用户的交互体验。 原生ajax实现步骤 步骤一:创建…

    JavaScript 2023年6月11日
    00
  • 用jQuery将JavaScript对象转换为querystring查询字符串的方法

    将JavaScript对象转换为querystring查询字符串是前端开发中非常常用的操作之一,可以通过jQuery的$.param()方法实现。 具体步骤如下: 1.创建一个JavaScript对象,用于测试示例。 例如,现在有一个名为person的JavaScript对象: var person = { name: "Tom", ag…

    JavaScript 2023年5月27日
    00
  • JSONP跨域请求实例详解

    JSONP跨域请求实例详解 什么是JSONP JSONP是JSON with Padding(填充式 JSON 或参数式 JSON)的缩写,是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题。JSONP 的优势在于它不像XMLHttpRequest对象实现的Ajax请求那样受到同源策略的限制,需服务器端改变响应头来实现跨域。 JSONP一…

    JavaScript 2023年5月27日
    00
  • document.all与getElementById、getElementsByName、getElementsByTagName用法区别-getElementById

    document.all是过时的DOM属性,已被所有主流浏览器弃用。它返回当前文档中包含的所有HTML元素,以类似于数组(但不是真正的数组)的方式进行索引。 由于兼容性问题,不建议使用它。 相反,getElementById是现代JS DOM API的一部分,它可以通过指定元素的ID属性来获取文档中的单个元素。它是非常常见和实用的DOM方法之一。 例如,如果…

    JavaScript 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部