vue3实现打飞机(雷电)

代码可直接运行直接玩,而且要自己加上一些随机事件都很简单了(例如发射速度变快,子弹变大,敌人变慢等)

<template><div class="flex items-center justify-center h-100vh w-full"><div>SCORE: {{ score }}<div class="box w-400 h-500 relative p-8" ref="box"><divclass="tank-wrap absolute bottom-6"ref="tankWrap":style="{ left: tankLeft + 'px' }"><div class="tank" :style="{ width: tankWidth + 'px' }"></div></div></div></div></div>
</template><script setup lang="ts">
import { ref, onMounted, onUnmounted } from "vue";
const box = ref();
const tankWidth = 40;
const tankWrap = ref();/*** 左右方向键控制坦克*/
const tankLeft = ref<number>(150);
function mousemove(e: MouseEvent) {const boxRect = box.value.getBoundingClientRect();if (!boxRect) return;const left = e.clientX - boxRect.left;if (left < 0) {tankLeft.value = 0;} else if (left > boxRect.width - tankWidth) {tankLeft.value = boxRect.width - tankWidth;} else {tankLeft.value = left;}
}
/*** 发射子弹*/
function start() {const tankWrapRect = tankWrap.value.getBoundingClientRect();const boxRect = box.value.getBoundingClientRect();const bullet = document.createElement("div");bullet.className ="fixed top-0 left-0 w-6 h-6 bg-red-500 border-rd-50% bullet";// 加上一半的坦克宽度,再减去一半的自身宽度bullet.style.left = tankWrapRect.left + tankWidth / 2 - 3 + "px";bullet.style.top = tankWrapRect.top + "px";box.value.appendChild(bullet);let top = 0;const timer = setInterval(() => {top += 5;const result = tankWrapRect.top - top;bullet.style.top = result + "px";if (result < boxRect.top) {clearInterval(timer);bullet.remove();}}, 16);
}
const score = ref(0);
/*** 生成敌人*/
const enemyCreator = () => {const boxRect = box.value.getBoundingClientRect();const enemy = document.createElement("div");//  宽度10-75px随机const enemyWidth = Math.floor(Math.random() * 66) + 10;const enemyHeight = Math.floor(Math.random() * 25) + 5;enemy.style.width = enemyWidth + "px";enemy.style.height = enemyHeight + "px";// 0% 到 50%随机enemy.style.borderRadius = Math.floor(Math.random() * 51) + "%";enemy.style.backgroundColor = `rgb(${Math.floor(Math.random() * 256)},${Math.floor(Math.random() * 256)},${Math.floor(Math.random() * 256)})`;enemy.className = "fixed enemy";//boxRect.left 到 (boxRect.left + boxRect.width) 之间的随机数enemy.style.left =Math.floor(Math.random() * (boxRect.width - enemyWidth)) +boxRect.left +"px";enemy.style.top = boxRect.top + "px";box.value.appendChild(enemy);let top = 0;const speed = Math.floor(Math.random() * 7) + 2;let timer: any = setInterval(() => {top += speed;enemy.style.top = boxRect.top + top + "px";/*** 检测碰撞敌人*/const enemies = document.querySelectorAll(".fixed.enemy");const bullets = document.querySelectorAll(".fixed.bullet");for (let i = 0; i < bullets.length; i++) {const bulletRect = bullets[i].getBoundingClientRect();if (bulletRect.left < enemy.getBoundingClientRect().right &&bulletRect.right > enemy.getBoundingClientRect().left &&bulletRect.top < enemy.getBoundingClientRect().bottom &&bulletRect.bottom > enemy.getBoundingClientRect().top) {clearInterval(timer);score.value ++;bullets[i].remove();enemy.remove();}}if (enemy && boxRect.top + top + enemyHeight > boxRect.bottom) {alert("你已经输了");clearInterval(timer);window.location.reload();}}, 30);
};let fireTimer: any = null;
let enemyTimer: any = null;
onMounted(() => {document.addEventListener("mousemove", mousemove);fireTimer = setInterval(() => {start();}, 260);enemyTimer = setInterval(() => {enemyCreator();}, 750);
});
const clear = () => {document.removeEventListener("mousemove", mousemove);clearInterval(fireTimer);clearInterval(enemyTimer);
};
onUnmounted(() => {clear();
});
</script>
<style>
.enemy {box-shadow: 0 2px 4px #0000006e;
}
</style>
<style lang="scss" scoped>
.box {border-radius: 4px;border: 1px solid #adadad;background: #ccc;overflow: hidden;
}
// tank-head-percentage
$t-h: 40%;
.tank-wrap {filter: drop-shadow(0 4px 2px #1c0099cc);.tank {height: 40px;border-radius: 8px;background-image: linear-gradient(90deg, #0b33b6 0%, #aaf2ff 100%);clip-path: polygon(0 58%,36% $t-h,36% 20%,50% 0%,64% 20%,64% $t-h,100% 58%,100% 100%,0 100%);}
}
</style>

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

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

相关文章

.net MAUI应用生命周期

.NET Multi-platform App UI (.NET MAUI) 应用通常有四种执行状态&#xff1a;“未运行”、“运行中”、“已停用”和“已停止”。 当应用从未运行状态转换为运行状态、从运行状态转换为已停用状态、从已停用状态转换为已停止状态、从已停止状态转换为运行状态&#xff0c;以及…

【Kubernetes】K8s 的鉴权管理(二):基于属性 / 节点 / Webhook 的访问控制

K8s 的鉴权管理&#xff08;二&#xff09;&#xff1a;基于属性 / 节点 / Webhook 的访问控制 1.基于属性的访问控制&#xff08;ABAC 鉴权&#xff09;2.基于节点的访问控制&#xff08;node 鉴权&#xff09;2.1 读取操作2.2 写入操作 3.基于 Webhook 的访问控制3.1 基于 We…

替换cython_bbox库中bbox_ious

说明一下问题&#xff1a;目标追踪代码里往往用到cython_bbox中的bbox_ious。但是该库需要用到 VC&#xff0c;按照有些麻烦。于是采用直接替换该方法&#xff0c;用纯代码实现&#xff0c;无需调用库。 File “src\cython_bbox.pyx”, line 17, in cython_bbox.bbox_overlaps…

深度学习-01 Pytorch

torchvision是一个用于计算机视觉任务的Python包&#xff0c;它是PyTorch的一个扩展库。它提供了一些流行的数据集、模型架构和图像转换函数&#xff0c;以方便用户进行计算机视觉任务的开发和研究。 1.torchvision中包含了许多常用的计算机视觉数据集&#xff0c;如MNIST、CIF…

【AcWing】861. 二分图的最大匹配(匈牙利算法)

匈牙利算法&#xff0c;他可以在比较快的时间复杂度之内告诉我们左边和右边成功匹配的最大数是多少 匹配指的是边的数量&#xff0c;成功的匹配指的是两个未被使用的点之间存在一条边(就不存在两条边共用了一个点的)。 匈牙利算法可以返回成功匹配的最大匹配数是多少。 #incl…

四、搭建网站服务器超详细步骤——解决宝塔界面无法登录问题

前言 本篇博客是搭建网站服务器的第四期&#xff0c;也到了中间的一节 先分享一下我在搭建网站时的个人感受&#xff0c;我在这个环节卡住了很久 后来突然醒悟了&#xff0c;然后成功进入了宝塔界面 现在就来分享一下&#xff0c;我所遇到的问题 小伙伴们坐好了 …

MySQL8 windows archive 安装

MySQL8超详细安装教程&#xff08;MySQL8安装图文教程&#xff09;_MySQL8安装包-CSDN博客 【补充&#xff1a;】 1.mysqld --install mysql // mysql是本次安装的服务命名&#xff0c;也可以叫做mysql8 etc. 2.手动卸载 2.1.net stop mysql 2.2.删除datadir // 即my.ini配置…

项目实战 ---- 商用落地视频搜索系统(9)---UI与上层service的交互优化

目录 背景 第一次优化(UI优化) 优化前UI 优化方向与问题 代码 修改效果 第二次优化(整合优化) 优化方向与问题 代码 优化效果 第三次优化(js层优化) 优化方向与问题 代码 优化效果 第四次优化(UI逻辑再优化) 优化方向与问题 代码 优化效果 第五次优化(纯U…

通信工程学习:什么是FMC固定移动融合

FMC&#xff1a;固定移动融合 FMC固定移动融合&#xff0c;即Fixed Mobile Convergence&#xff08;固定移动网络融合&#xff09;&#xff0c;是指通过固定网络与移动网络之间的融通、合作&#xff0c;实现全业务及融合业务的经营。这一技术旨在打破传统固定网络和移动网络之间…

使用 Parallel 类进行多线程编码(上)

用 C# 进行多线程编程有很多方式&#xff0c;比如使用 Thread 对象开启一个新线程&#xff0c;但这已经是一种落后的写法了&#xff0c;现在推荐的写法是使用 Parallel 类&#xff0c;它可以让我们像写传统代码一样编写多线程的程序&#xff0c;Parallel 类有三个常用的方法如下…

C#笔记8 线程是什么?多线程怎么实现和操作?

这和前面的学习内容可能有点不太连贯&#xff0c;但是呢我们一般来说的学习就是遇到什么困难就去学习什么&#xff0c;这也是为什么看那些循序渐进的教程虽然学的很饱满&#xff0c;但是我们有时会学了前面忘记了后面&#xff0c;或者对某个板块理解不深&#xff0c;乃至于写代…

VS Code 中提升编程效率的功能及使用方法

Visual Studio Code&#xff08;简称 VS Code&#xff09;是一款功能强大且灵活的源代码编辑器&#xff0c;支持多种编程语言&#xff0c;并提供了丰富的插件生态系统。对于开发者来说&#xff0c;掌握一些提升编程效率的功能是非常重要的。本文将介绍 VS Code 中一些能够显著提…

大学物理实验-杨氏双缝干涉实验

一、实验目的 1.理解杨氏双缝干涉现象的基本原理&#xff1b; 2.掌握用光具座调整杨氏双缝干涉装置的光路&#xff1b; 3.用CCD观察杨氏双缝干涉的实验现象&#xff1b; 4.学会用干涉法测量未知光波的波长。 二、仪器用具 FB760-6型光学实验仪多功能光学片 三、实验原理 1.波…

智能提取:OfficeImagesExtractor让文档图片提取更简单

“科技是国之利器&#xff0c;也是民之福祉。” 在数字化办公日益普及的今天&#xff0c;我们对文档处理的需求也在不断增长。尤其是对于Office文档中的图片、视频和音频等多媒体内容的提取&#xff0c;传统的方法是繁琐且效率低下的。在这样的背景下&#xff0c;一款能够高效、…

计算机毕业设计选题推荐-产品委托配送系统-Java/Python项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

视频监控管理平台LntonAIServer视频智能分析噪声检测应用场景

在视频监控系统中&#xff0c;噪声问题常常影响到视频画面的清晰度和可用性。噪声可能由多种因素引起&#xff0c;包括但不限于低光环境、摄像机传感器灵敏度过高、编码压缩失真等。LntonAIServer通过引入噪声检测功能&#xff0c;旨在帮助用户及时发现并解决视频流中的噪声问题…

原点安全荣获“AutoSec Awards 安全之星”优秀汽车数据安全合规方案奖

9月3日&#xff0c;「AutoSec 2024第八届中国汽车网络安全周暨第五届智能汽车数据安全展」在上海盛大开幕。本届大会由谈思实验室和谈思汽车主办、上海市车联网协会联合主办&#xff0c;以汽车“网络数据安全、软件安全、功能安全”为主题&#xff0c;汇聚了国内外的技术专家、…

公共组件和业务组件的区别

公共基础组件是构成用户界面的最小单位&#xff0c;如按钮、输入框、卡片等&#xff0c;封装基础组件&#xff0c;应考虑以下几点&#xff1a; 通用性&#xff1a;确保组件能够在不同场景下复用可配置性&#xff1a;提供灵活的属性配置&#xff0c;以适应不同的设计需求无状态…

第四次北漂----挣个独立游戏的素材钱

第四次北漂&#xff0c;在智联招聘上&#xff0c;有个小公司主动和我联系。面试了下&#xff0c;决定入职了&#xff0c;osg/osgearth的。月薪两万一。 大跌眼镜的是&#xff0c;我入职后&#xff0c;第一天的工作内容就是接手他的工作&#xff0c;三天后他就离职了。 我之所以…

sysbench下载与交叉编译

简介 sysbench是一个开源的多线程性能测试工具&#xff0c;广泛用于评估系统、数据库和硬件的性能。它支持多种测试模式&#xff0c;如 CPU、内存、磁盘 I/O 和数据库基准测试等。 下载 git clone https://gitee.com/cn-loongson/sysbench.git 这里使用国内的源&#xff0c…