Canvas动画之豌豆射手

🌹作者主页:青花锁 🌹简介: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.mzph.cn/news/704309.shtml

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

相关文章

Fl Studio 20.9.2.2963 中文破解版2024永久版下载(含Keygen)

FL Studio20.9是一款流行的图像线软件制作和编辑音频文件。作为一款领先的创新产品&#xff0c;该软件能够满足在创作音乐方面的需求。有了这个产品&#xff0c;可以完成制作音乐的整个过程。可以使用这个软件进行写作&#xff0c;编辑&#xff0c;录音&#xff0c;编辑和混合和…

DP读书:《工程热力学(第二版)》(一)绪论——能量及其利用

DP读书&#xff1a;《工程热力学&#xff08;第二版&#xff09;》绪论 0.1 能量及其利用 热力学——研究对象&#xff1a;能量 能量 物质能量传递 普遍规律 能源&#xff1a;直接提供能量的物质资源 一次能源&#xff1a;热能占比85% 直接利用——>冶金、采暖、炊煮 …

2024Node.js零基础教程(小白友好型),nodejs新手到高手,(九)NodeJS入门——http模块

060_http模块_网页URL之绝对路径 hello&#xff0c;大家好&#xff0c;这一个小题的话我们来补充一个之前学习过的内容&#xff0c;就是网页当中的URL&#xff0c;咱们这个小题的话主要是来说一下绝对路径&#xff0c;有同学可能会说&#xff0c;这这这&#xff0c;不对劲&…

抽象的后端

Connection refused: no further information 出现这条代码的核心是你使用redis&#xff0c;但是本地没有开启redis服务 如何启动redis服务 第一步&#xff1a;确定你安装了对应的框架 以spring为例 <dependency><groupId>org.springframework.boot</group…

架构设计实践:熟悉架构设计方法论,并动手绘制架构设计图

文章目录 一、架构设计要素1、架构设计目标2、架构设计模式&#xff08;1&#xff09;分而治之&#xff08;2&#xff09;迭代式设计 3、架构设计的输入&#xff08;1&#xff09;概览&#xff08;2&#xff09;功能需求 - WH分析法&#xff08;3&#xff09;质量 - “怎么”分…

卡玛网● 46. 携带研究材料 ● 01背包问题,你该了解这些! 滚动数组 力扣● 416. 分割等和子集

开始背包问题&#xff0c;掌握0-1背包和完全背包即可&#xff0c;注&#xff1a;0-1背包是完全背包的基础。 0-1背包问题&#xff1a;有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品只能用一次&#xff0c;求…

Windows计划任务执行日志和文件输出路径修改

在日常工作中&#xff0c;针对需重复执行的操作&#xff0c;通常都会使用系统的任务计划程序功能&#xff1b; 1、大家可以运行中&#xff0c;执行taskschd.msc来调用任务计划程序对话窗口&#xff0c;也可以在服务器管理的-工具菜单中-选择任务计划程序来调用对话窗口。 2、…

2024022502-数据库绪论

数据库绪论 数据管理的三个阶段 人工管理阶段 文件系统阶段 数据库系统阶段 基本术语 数据&#xff08;Data&#xff09; 计算机用来描述事物的记录&#xff08;文字&#xff0e;图形&#xff0e;图像&#xff0e;声音&#xff09;数据的形式本身并不能完全表达其内容&am…

宏景eHR DisplayFiles 任意文件读取漏洞复现

0x01 产品简介 宏景eHR人力资源管理软件是一款人力资源管理与数字化应用相融合,满足动态化、协同化、流程化、战略化需求的软件。 0x02 漏洞概述 宏景eHR DisplayFiles接口处存在任意文件读取漏洞,未经身份验证攻击者可通过该漏洞读取系统重要文件(如数据库配置文件、系统…

【PX4学习笔记】11.PX4飞行日志分析

目录 文章目录 目录日志分析的软件类型日志获取的方式官方网站PX4使用者官网推荐分析软件&#xff1a; 使用FIGHTPLOT软件分析日志FlightPlot软件的下载与安装使用flightplot软件进行简单的使用介绍log messagesFields List常用的数据姿态的四元数期望的姿态数据只看某一个数据…

Tomcat 学习之 Filter 过滤器

目录 1 Filter 介绍 2 Filter 的生命周期 3 Filter 和 FilterChain 4 Filter 拦截过程 5 FilterConfig 6 Filter 使用 1 Filter 介绍 在 Tomcat 中&#xff0c;Filter 是一种用于拦截请求和过滤响应的组件&#xff0c;可以在请求到达 Servlet 之前或响应离开 Servlet 之后…

C语言-程序环境和预处理

1.程序的翻译环境和执行环境 1.1翻译环境 1.2执行环境 2.预处理详解 2.1预定义符号 2.2#define 2.2.1#define定义标识符 2.2.2#define是否需要加上; 2.2.3#define定义宏 2.2.4#define替换 2.2.5#以及##的使用 2.2.6 带有副作用的宏定义 2.2.7宏定义与函数的比较 1.…

Three.js 基础属性

三维坐标系 辅助观察坐标系 THREE.AxesHelper()的参数表示坐标系坐标轴线段尺寸大小&#xff0c;你可以根据需要改变尺寸。 // AxesHelper&#xff1a;辅助观察的坐标系 const axesHelper new THREE.AxesHelper(150); scene.add(axesHelper);材质半透明设置 设置材质半透明…

【牛牛送书 | 第四期】《高效使用Redis:一书学透数据存储与高可用集群》带你快速学习使用Redis

前言&#xff1a; 当今互联网技术日新月异&#xff0c;随着数据量的爆炸式增长&#xff0c;如何高效地存储和管理数据成为了每个公司都必须面对的挑战。与此同时&#xff0c;用户对于应用程序的响应速度和稳定性要求也越来越高。在这个背景下&#xff0c;Redis 作为一个…

打包Docker镜像时候,ARG标签如何使用?

FROM registry.cn-qingdao.aliyuncs.com/dataease/fabric8-java-alpine-openjdk8-jre:edge-chromium-11这里这个标签如何使用 ARG IMAGE_TAGRUN mkdir -p /opt/apps /opt/dataease/data/feature/full /opt/dataease/drivers /opt/dataease/plugins/defaultADD core/mapFiles/fu…

Python炒股自动化(2):获取股票实时数据和历史数据

如果你是一位大佬&#xff0c;看我前面的分享即可&#xff0c;相信你有自己的思路&#xff0c;或者已经有了成熟的策略&#xff0c;你需要的只是API接口来实现你的想法&#xff0c;前面的分享是你需要的&#xff0c;这些是给刚开始接触程序交易的朋友分享的。 前面发了股票程序…

【刷题】leetcode 1544.整理字符串

刷题 1544.整理字符串思路一&#xff08;模拟栈速解版&#xff09;思路二 &#xff08;原地算法巧解版&#xff09;思路三&#xff08;C栈版&#xff09; Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢阅读&#xff01;&#xff01;&#xff01;下一篇文章见&#xff…

“快递单号时效调整秘籍:轻松掌握,高效管理!“

亲爱的物流管理者们&#xff0c;您是否曾遇到过这样的问题&#xff1a;快递单号时效单位不符合您的实际需求&#xff0c;导致管理效率低下&#xff0c;无法准确追踪物流信息&#xff1f;现在&#xff0c;我们为您带来一份快递单号时效单位调整秘籍&#xff0c;让您轻松掌握&…

第三百六十七回

文章目录 1. 概念介绍2. 方法与细节2.1 获取方法2.2 使用细节 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何获取当前系统语言"相关的内容&#xff0c;本章回中将介绍如何获取时间戳.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在本章…

http协议基础与Apache的简单介绍

一、相关介绍&#xff1a; 互联网&#xff1a;是网络的网络&#xff0c;是所有类型网络的母集因特网&#xff1a;世界上最大的互联网网络。即因特网概念从属于互联网概念。习惯上&#xff0c;大家把连接在因特网上的计算机都成为主机。万维网&#xff1a;WWW&#xff08;world…