Canvas动画之豌豆射手

news2024/10/2 22:27:13

🌹作者主页:青花锁 🌹简介:Java领域优质创作者🏆、Java微服务架构公号作者😄

🌹简历模板、学习资料、面试题库、技术互助

🌹文末获取联系方式 📝

在这里插入图片描述


往期热门专栏回顾

专栏描述
Java项目实战介绍Java组件安装、使用;手写框架等
Aws服务器实战Aws Linux服务器上操作nginx、git、JDK、Vue
Java微服务实战Java 微服务实战,Spring Cloud Netflix套件、Spring Cloud Alibaba套件、Seata、gateway、shadingjdbc等实战操作
Java基础篇Java基础闲聊,已出HashMap、String、StringBuffer等源码分析,JVM分析,持续更新中
Springboot篇从创建Springboot项目,到加载数据库、静态资源、输出RestFul接口、跨越问题解决到统一返回、全局异常处理、Swagger文档
Spring MVC篇从创建Spring MVC项目,到加载数据库、静态资源、输出RestFul接口、跨越问题解决到统一返回
华为云服务器实战华为云Linux服务器上操作nginx、git、JDK、Vue等,以及使用宝塔运维操作添加Html网页、部署Springboot项目/Vue项目等
Java爬虫通过Java+Selenium+GoogleWebDriver 模拟真人网页操作爬取花瓣网图片、bing搜索图片等
Vue实战讲解Vue3的安装、环境配置,基本语法、循环语句、生命周期、路由设置、组件、axios交互、Element-ui的使用等
Spring讲解Spring(Bean)概念、IOC、AOP、集成jdbcTemplate/redis/事务等

前端小游戏专栏回顾

专栏导航描述
前端小游戏- -Canvas魔法之黑客帝国特效
前端小游戏- -Canvas动画之豌豆射手

前言

今天我们实现豌豆射手自动发射豌豆的效果。
使用工具:Chrome浏览器(或其他支持H5的浏览器)
使用语言:HTML + JavaScript + Canvas + requestAnimationFrame
效果如下:
请添加图片描述


相关知识点介绍

HTML 、 JavaScript 、 Canvas 、 requestAnimationFrame
相关知识点介绍,详见 Canvas魔法之黑客帝国特效

豌豆射手自动发射豌豆效果实战

实现豌豆射手自动发射豌豆效果可以通过创建一个Canvas元素,并在上面使用JavaScript来绘制豌豆射手,豌豆从豌豆射手那里自动往前射击,到画布外之后子弹消失。并为整个画面设置一张草坪背景,意味着豌豆射手是在草坪上战斗。

分为2部分,Html画布(Canvas元素容器,设置草坪背景)、JavaScript脚本控制豌豆从豌豆射手那里自动往前射击。

Html画布

首先是HTML代码,你需要在HTML文件中添加一个Canvas元素:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Peashooter Animation</title>
<style>
  body {
    margin: 0;
    overflow: hidden;
    height: 100%;
  }
  canvas {
    background: #f4f4f4;
  }
</style>
</head>
<body onload="init()">
<canvas id="gameCanvas"></canvas>
<script src="script.js"></script>
</body>
</html>


动画控制

然后,是JavaScript代码,你可以将这部分代码保存为script.js文件:

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

canvas.width = window.innerWidth / 2;
canvas.height = window.innerHeight / 3;

const bullets = []; // 存储子弹
const bulletSpeed = 10; // 子弹的速度
const peashooterImg = new Image(); // 创建豌豆射手图片对象
peashooterImg.src = 'mutpea.png'; // 设置图片源文件路径

const peashooter = {
  x: 50,
  y: canvas.height / 3,
  width: 80, // 根据实际图片大小调整
  height: 80 // 根据实际图片大小调整
};

function drawPeashooter() {
  ctx.drawImage(peashooterImg, peashooter.x, peashooter.y, peashooter.width, peashooter.height);
}

function drawBullets() {
  ctx.fillStyle = 'green';
  for (let i = 0; i < bullets.length; i++) {
    const bullet = bullets[i];
    ctx.beginPath();
    ctx.arc(bullet.x, bullet.y, 10, 0, Math.PI * 2);
    ctx.fill();

    // 更新子弹的位置
    bullet.x += bulletSpeed;

    // 如果子弹超出画布范围,则移除
    if (bullet.x >= canvas.width) {
      bullets.splice(i, 1);  // 也可使用其他JavaScript 数组删除元素函数
      i--; // 修正数组长度变化后的索引
    }
  }
}

function shoot() {
  // 添加一个子弹到数组中
  const bulletY = peashooter.y + peashooter.height / 2; // 子弹从豌豆射手中间发射
  bullets.push({ x: peashooter.x + peashooter.width, y: bulletY });
}

// 定时发射子弹
setInterval(shoot, 500);

function animate() {
  // 创建垂直渐变
  var gradient = ctx.createLinearGradient(0, 0, 0, canvas.height);
  // 添加颜色断点
  gradient.addColorStop(0, '#00b4d8'); // 天空的颜色
  gradient.addColorStop(1, '#48c78e'); // 草地的颜色

  // 设置渐变为填充样式并绘制背景
  ctx.fillStyle = gradient;
  ctx.fillRect(0, 0, canvas.width, canvas.height);

  drawPeashooter(); // 绘制豌豆射手
  drawBullets(); // 绘制子弹
  requestAnimationFrame(animate); // 循环调用animate函数
}

// 确保图片加载后开始动画
peashooterImg.onload = animate;


讲解

在上述代码中,我们创建了一个Image对象来加载豌豆射手的图片。然后,我们定义了一个peashooter对象来存储豌豆射手的位置和大小。drawPeashooter函数使用drawImage方法将豌豆射手绘制到Canvas上。

drawBullets函数负责绘制和更新所有子弹的位置。shoot函数每隔一段时间被调用,以模拟豌豆射手发射子弹的动作(这里可以修改控制发射子弹的频率,现在的500毫秒,相当于0.5秒)。

最后,animate函数是动画的主循环,负责清除Canvas、绘制豌豆射手和子弹,并通过requestAnimationFrame递归调用自己。

注意,我们使用peashooterImg.onload来确保在图片加载完成后才开始动画循环,以避免在图片未加载完成时绘制。

将上述代码保存到相应的HTML和JavaScript文件中,并确保图片文件peashooter.png在项目目录中。打开HTML文件后,你应该能看到豌豆射手图片,并且它会定期发射子弹。

目录结构

  • index.html : html代码区域
  • mutpea.png、pea.png: 豌豆射手的图片,一张是多重豌豆射手、另一张是普通的豌豆射手
  • script.js:JavaScript脚本,控制豌豆发射
    在这里插入图片描述

资料获取,更多粉丝福利,关注下方公众号获取

在这里插入图片描述

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

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

相关文章

多线程基础说明【基础篇】

目录 &#x1f32d;1.相关概念 &#x1f37f;2.创建和启动线程 &#x1f95e;3.线程安全 &#x1f9c8;4.死锁 &#x1f953;5.线程通信的方法 1.相关概念 1.1程序 为完成特定任务&#xff0c;用某种语言编写的一组指令的集合。即指一段静态的代码&#xff0c;静态对象…

Flask基础学习3

参考视频&#xff1a;41-【实战】答案列表的渲染_哔哩哔哩_bilibili flask 实现发送短信功能 pip install flask-mail # 安装依赖 我这里用登录的网易邮箱获取的授权码&#xff08;登录QQ邮箱的授权码总是断开收不到邮件&#xff09;&#xff0c; # config # config mail MAI…

vue3 实现 el-pagination页面分页组件的封装以及调用

示例图 一、组件代码 <template><el-config-provider :locale"zhCn"><el-pagination background class"lj-paging" layout"prev, pager, next, jumper" :pager-count"5" :total"total":current-page"p…

LeetCode二叉树中的第 K 大层和

题目描述 给你一棵二叉树的根节点 root 和一个正整数 k 。 树中的 层和 是指 同一层 上节点值的总和。 返回树中第 k 大的层和&#xff08;不一定不同&#xff09;。如果树少于 k 层&#xff0c;则返回 -1 。 注意&#xff0c;如果两个节点与根节点的距离相同&#xff0c;则…

SocketWeb实现小小聊天室

SocketWeb实现小小聊天室 消息推送的常见方式轮询长轮询SSE&#xff08;server-sent event&#xff09;&#xff1a;服务器发送事件WebSocketWebSocket简介WebSocket API 实现小小聊天室实现流程消息格式客户端-->服务端服务端-->客户端 消息推送的常见方式 轮询 浏览器…

C# TesseractOCR识别身份证号

https://github.com/tesseract-ocr/tessdata 新建控制台项目并添加包 Tesseract和Tesseract.Drawing 下载训练的模型 地址 代码实现 using Tesseract;var filePath "F:\\Desktop\\韦小宝.png"; var exePath AppDomain.CurrentDomain.BaseDirectory; var …

远程连接Redis

以连接阿里云上的Redis为例 1. 在阿里云安全组中开放端口 2.修改Redis启动时所用的配置文件&#xff08;redis.conf&#xff09; 2.1 修改ip地址 如图&#xff1a;将默认的本地ip bind 127.0.0.1地址改为bind 0.0.0.0 2.2 将保护模式关闭 将默认的 supervised yes 改为 n…

Docker基础(一)

文章目录 1. 基础概念2. 安装docker3. docker常用命令3.1 帮助命令3.2 镜像命令3.3 容器命令3.4 其他命令 4. 使用案例 1. 基础概念 镜像&#xff08;Image&#xff09;&#xff1a;Docker 镜像&#xff08;Image&#xff09;&#xff0c;就相当于是一个 root 文件系统。比如官…

Java Web(八)--Servlet(一)

介绍 官网&#xff1a;Servlet 3.1 API Documentation - Apache Tomcat 8.0.53 为什么需要&#xff1f; 提出需求: 请用你现有的html css javascript&#xff0c;开发网站&#xff0c;比如可以让用户留言/购物/支付? 引入我们动态网页(能和用户交互)技术>Servlet 是什…

医院LIS(全称Laboratory Information Management System)系统源码

目录 一、医院LIS系统概况 二、医院LIS系统建设必要性 三、为什么要使用LIS系统 四、技术框架 &#xff08;1&#xff09;总体框架 &#xff08;2&#xff09;技术细节 &#xff08;3&#xff09;LIS主要功能模块 五、LIS系统优势 &#xff08;1&#xff09;客户/用户…

【Python】记录生产编程小tips(字符串处理、列表删除、字典、csv、excel操作)持续更新

文章目录 一.for循环删除列表元素1.删除list元素方法2.直接删除往往结果与期望不一致3.循环删除元素的正确方法&#xff1a;方法1&#xff1a;while循环i减方法2&#xff1a;使用copy方法3&#xff1a;倒叙遍历 二.字符串处理库三.字典—dict运用四.csv操作五.excel操作1.读exc…

AI:139-基于深度学习的语音指令识别与执行

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带关键代码,详细讲解供大家学习,希望…

改进 RAG:自查询检索

原文地址&#xff1a;Improving RAG: Self Querying Retrieval 2024 年 2 月 11 日 让我们来解决构建 RAG 系统时的一个大问题。 我们不能依赖语义搜索来完成每个检索任务。只有当我们追求单词的含义和意图时&#xff0c;语义搜索才有意义。 But in case&#xff0c;我们正…

python自动化管理和zabbix监控网络设备(有线网络和路由配置部分)

目录 目录 一、拓扑图 二、core-sw1 三、core-sw2 四、sum-sw1 五、sum-sw2 六、FW1 七、DMZ-SW1 结语 一、拓扑图 二、core-sw1 sys sysname core-sw1 vlan batch 10 20 30 40 50 60 100 vlan batch 200 210 220 230 240 250 stp region-configuration region-name…

选择稳定代理IP需要考虑哪些因素?

很多人不知道怎么选择稳定的代理IP&#xff0c;也不知道当前代理IP套餐是否稳定&#xff0c;今天我们一起来分析下&#xff0c;选择稳定的代理IP可以从哪几方面去考虑。 1、代理IP的可用性 代理IP要稳定&#xff0c;先要可以用。一个代理IP池是否稳定&#xff0c;要看代理IP的…

区分服务 DiffServ

目录 区分服务 DiffServ 区分服务的基本概念 区分服务 DiffServ 的要点 每跳行为 PHB DiffServ 定义的两种 PHB 区分服务 DiffServ 区分服务的基本概念 由于综合服务 IntServ 和资源预留协议 RSVP 都较复杂&#xff0c;很难在大规模的网络中实现&#xff0c;因此 IET…

Docker复习笔记

Centos7安装Docker Docker官网:www.docker.com Docker官网仓库:hub.docker.com Docker文档是比较详细的 安装相关依赖 yum -y install gcc gcc-c yum install -y yum-utils 设置docker镜像仓库 yum-config-manager --add-repo https://download.docker.com/linux/centos/do…

Mysql运维篇(五) 部署MHA--主机环境配置

一路走来&#xff0c;所有遇到的人&#xff0c;帮助过我的、伤害过我的都是朋友&#xff0c;没有一个是敌人。如有侵权&#xff0c;请留言&#xff0c;我及时删除&#xff01; 大佬博文 https://www.cnblogs.com/gomysql/p/3675429.html MySQL 高可用&#xff08;MHA&#x…

js:通过input标签或Drag拖拽文件实现浏览器文件上传获取File文件对象

文档 https://developer.mozilla.org/zh-CN/docs/Web/API/Filehttps://developer.mozilla.org/zh-CN/docs/Web/API/HTMLElement/drag_event 通过读取文件可以获取File对象的信息 lastModified: 1707210706000 lastModifiedDate: Tue Feb 06 2024 17:11:46 GMT0800 (中国标准…

使用 Verilog 做一个可编程数字延迟定时器 LS7211-7212

今天的项目是在 Verilog HDL 中实现可编程数字延迟定时器。完整呈现了延迟定时器的 Verilog 代码。 所实现的数字延迟定时器是 CMOS IC LS7212&#xff0c;用于生成可编程延迟。延迟定时器的规格可以在这里轻松找到。基本上&#xff0c;延迟定时器有 4 种操作模式&#xff1a;…