原生JS实现的跳一跳小游戏完整实例

yizhihongxing

作为网站的作者,我很乐意为大家提供原生JS实现的跳一跳小游戏的完整攻略。

简介

跳一跳是一款非常流行的手机游戏,它的玩法简单而又有趣。本攻略将介绍如何用原生JS实现一个跳一跳的小游戏,包括如何实现小人跳跃、生成随机方块、游戏分数计算等。

实现步骤

1. 初始化游戏画布

首先,我们需要在HTML页面中创建一个画布(canvas),并通过JS获取它的上下文(context)对象,以便在画布上绘制图形:

const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');

2. 绘制小人和起跳点

我们需要在画布上绘制一个小人和一个起跳点,代码如下:

// 绘制小人
function drawPlayer(x, y) {
  ctx.fillStyle = 'black';
  ctx.fillRect(x, y, 50, 50);
}

// 绘制起跳点
function drawStart(x, y, width) {
  ctx.fillStyle = 'red';
  ctx.fillRect(x, y, width, 10);
}

// 在画布中心位置绘制小人和起跳点
const startX = canvas.width / 2 - 25;
const startY = canvas.height - 60;
drawStart(startX, startY, 50);
drawPlayer(startX, startY - 50);

以上代码实现了在画布中心位置绘制一个小人和一个起跳点,其中参数x和y分别是小人或者起跳点在画布上绘制的起始坐标,width是起跳点的宽度。

3. 跳跃动画

当玩家点击起跳点之后,小人就会进行跳跃动画。我们需要实现一个函数来控制小人的跳跃,代码如下:

// 控制小人跳跃
function playerJump(distance, callback) {
  let height = distance;
  const jumpInterval = setInterval(() => {
    if (height > 0) {
      ctx.clearRect(startX, startY - height - 50, 50, 50);
      drawPlayer(startX, startY - height);
      height -= 2;
    } else {
      clearInterval(jumpInterval);
      callback && callback();
    }
  }, 5);
}

以上代码实现了一个名为playerJump的函数,该函数接受跳跃的距离distance和跳跃结束后的回调函数callback作为参数。在playerJump函数内部,我们先定义一个名为height的变量,封装关于控制小人跳跃的逻辑。通过setInterval实现小人跳跃动画,每隔5毫秒调用一次函数。其中,ctx.clearRect用于清除画布上原先的小人,然后调用drawPlayer函数在新位置绘制小人,height -= 2表示小人每次跳跃的高度减少2像素,直到height <= 0跳跃动画结束。

4. 生成随机方块

当小人跳跃结束后,我们需要在一个随机位置生成一个方块。代码如下:

// 生成随机方块
function generateBlock() {
  const startX = Math.floor(Math.random() * (canvas.width - 50));
  const startY = Math.floor(Math.random() * (canvas.height - 60));
  const width = Math.floor(Math.random() * 50 + 50);
  const block = { x: startX, y: startY, width: width };
  ctx.fillStyle = 'blue';
  ctx.fillRect(block.x, block.y, block.width, 10);
  return block;
}

以上代码实现了一个名为generateBlock的函数,该函数可以在画布上随机生成一个方块,函数返回一个包含方块坐标和长宽的对象。通过调用Math.floor和Math.random函数实现了随机生成方块的位置坐标和长度。

5. 计算得分

当小人跳跃且生成了方块后,我们还需要根据小人和方块的位置关系来计算得分,代码如下:

// 计算得分
function calculateScore(playerY, block) {
  if (playerY - block.y <= 10 && playerY - block.y >= -50) {
    const gap = Math.abs((block.x + block.width / 2) - (startX + 25));
    const score = Math.floor(10 * (100 - gap) / 100);
    return score > 0 ? score : 0;
  } else {
    return 0;
  }
}

以上代码实现了一个名为calculateScore的函数,该函数接受小人的Y坐标和方块的位置作为参数,根据它们的位置关系计算得分。如果小人在正上方跳过方块,则得分为100分;如果小人跳到方块两侧,则根据小人和方块的水平距离来计算得分。

6. 完整代码

最后,我们将以上函数整合为一个完整的游戏代码,如下所示:

const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');
const scoreBoard = document.getElementById('score');
let score = 0;
let block = null;

// 绘制小人
function drawPlayer(x, y) {
  ctx.fillStyle = 'black';
  ctx.fillRect(x, y, 50, 50);
}

// 绘制起跳点
function drawStart(x, y, width) {
  ctx.fillStyle = 'red';
  ctx.fillRect(x, y, width, 10);
}

// 在画布中心位置绘制小人和起跳点
const startX = canvas.width / 2 - 25;
const startY = canvas.height - 60;
drawStart(startX, startY, 50);
drawPlayer(startX, startY - 50);

// 控制小人跳跃
function playerJump(distance, callback) {
  let height = distance;
  const jumpInterval = setInterval(() => {
    if (height > 0) {
      ctx.clearRect(startX, startY - height - 50, 50, 50);
      drawPlayer(startX, startY - height);
      height -= 2;
    } else {
      clearInterval(jumpInterval);
      callback && callback();
    }
  }, 5);
}

// 生成随机方块
function generateBlock() {
  const startX = Math.floor(Math.random() * (canvas.width - 50));
  const startY = Math.floor(Math.random() * (canvas.height - 60));
  const width = Math.floor(Math.random() * 50 + 50);
  const block = { x: startX, y: startY, width: width };
  ctx.fillStyle = 'blue';
  ctx.fillRect(block.x, block.y, block.width, 10);
  return block;
}

// 计算得分
function calculateScore(playerY, block) {
  if (playerY - block.y <= 10 && playerY - block.y >= -50) {
    const gap = Math.abs((block.x + block.width / 2) - (startX + 25));
    const score = Math.floor(10 * (100 - gap) / 100);
    return score > 0 ? score : 0;
  } else {
    return 0;
  }
}

// 点击起跳点触发小人跳跃
document.addEventListener('click', () => {
  playerJump(150, () => {
    if (block) {
      score += calculateScore(startY - 150, block);
      scoreBoard.innerText = `得分:${score}`;
      ctx.clearRect(block.x, block.y, block.width, 10);
    }
    block = generateBlock();
  });
});

以上代码中,我们通过点击addEventListener事件触发小人跳跃动画,并计算得分。最后根据calculateScore函数的返回值更新得分和分数面板(scoreBoard)。

示例一: 小人跳跃距离

playerJump(150, function() {
  console.log('小人跳跃距离150px');
});

以上代码调用了playerJump函数,使得小人在画布上向上跳150px,完成一次跳跃动画。小人跳跃结束后,控制台将打印输出'小人跳跃距离150px'。

示例二: 计算得分

const playerY = 410;
const block = { x: 300, y: 350, width: 80 };
const score = calculateScore(playerY, block);
console.log(`玩家得分:${score}`);

以上代码调用了calculateScore函数,计算从画布底部高度为410px的小人跳跃过方块的得分。方块的位置是(x=300, y=350),长度为80。控制台将打印输出'玩家得分:60'。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:原生JS实现的跳一跳小游戏完整实例 - Python技术站

(1)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • javascript jQuery $.post $.ajax用法

    下面是关于JavaScript jQuery中$.post和$.ajax用法的详细攻略。 什么是 jQuery? jQuery 是 Javascript 中的一种框架,可以方便地操作 HTML 文档、处理事件、制作动画方法等。jQuery 中提供了很多常用的函数和方法,使用它可以更加高效、简洁地编写Javascript代码。 jQuery 的 $.post …

    JavaScript 2023年5月27日
    00
  • js实现鼠标悬浮框效果

    JavaScript 实现鼠标悬浮框效果的过程主要分为以下几步: 1. 创建 HTML 结构 首先需要在 HTML 中定义框架,例如容器、容器内的内容、触发事件的 DOM 元素等。其中包含一个容器作为悬浮框,在鼠标触发事件后自动显示,同时鼠标移出事件后自动隐藏。 例如: <div class="parent"> <but…

    JavaScript 2023年6月11日
    00
  • JavaScript中一些奇怪的问题及解决分享

    JavaScript中一些奇怪的问题及解决分享 在使用JavaScript开发过程中,我们难免会遇到一些奇怪的问题。本文将会介绍一些经典的JavaScript问题,以及如何解决它们。 1. 函数作用域 JavaScript中函数具有作用域,意味着函数所有的变量和参数只有在函数内部可见。下面的代码示例展示了这个问题。 var a = 1; function f…

    JavaScript 2023年5月18日
    00
  • 一看就懂:jsonp详解

    一看就懂:jsonp详解 什么是JSONP JSONP(JSON with Padding)是一种跨域的数据交互方式。它利用了script标签没有跨域限制的特点,通过动态创建script标签来请求服务器返回数据,并通过回调函数来处理返回的数据。 JSONP的原理 在客户端动态创建一个script标签,其中的src属性指向服务器端数据接口,并在接口地址中指定回…

    JavaScript 2023年5月27日
    00
  • 小程序列表懒加载的实现方式

    小程序列表懒加载是一种常用的优化手段,可以提高小程序的性能。它的实现方式有很多种,下面我将详细介绍其中的一种方式。 方案介绍 我们可以通过在小程序的<scroll-view>组件上监听scrolltolower事件来实现列表懒加载。当用户滑动到页面底部时,就可以通过发起请求获取更多数据,然后将新数据追加到原数据之后,以实现无限滚动的效果。 这种方…

    JavaScript 2023年6月11日
    00
  • js时间戳与日期格式之间相互转换

    关于“js时间戳与日期格式之间相互转换的攻略”,我会从以下方面进行详细讲解: 时间戳和日期格式的概念及区别 时间戳转日期格式的方法 日期格式转时间戳的方法 示例说明 1. 时间戳和日期格式的概念及区别 时间戳是1970年1月1日(UTC/GMT的午夜)距离某一时间点的秒数,可以简单理解成整数形式的时间点。而日期格式则是指可读性较好的时间表示形式,例如“202…

    JavaScript 2023年5月27日
    00
  • react-router-dom v6 使用详细示例

    这里给出使用 React-Router-Dom 版本 6.x 的详细攻略,包含基本概念、用法介绍、代码示例等,方便大家快速上手。 基本概念 React-Router-Dom 是一个 React 的声明式路由库,在 React 应用中使用路由的时候非常方便。在使用 React-Router-Dom 时,主要涉及到以下几个核心概念: Router:定义路由的容器…

    JavaScript 2023年6月11日
    00
  • JS 做一个简单的 Parser

    前言 前些天偶然看到以前写的一份代码,注意有一段尘封的代码,被我遗忘了。这段代码是一个简单的解析器,当时是为了解析日志而做的。最初解析日志时,我只是简单的正则加上分割,写着写着,我想,能不能用一个简单的方案做个解析器,这样可以解析多种日志。于是就有了这段代码,后来日志解析完了,没有解析其它日志就给忘了。再次看到这段代码,用非常简单易读的代码就实现了一个解析器…

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