子弹射击

news/2025/12/5 21:09:45/文章来源:https://www.cnblogs.com/barrysgy/p/19313660

子弹射击

Bullet.ts
private _lastCheckPos:Laya.Point = new Laya.Point(0, 0); // 上次检测的位置
/*** 检查两条线段是否相交 * 线段1: (x1, y1) -> (x2, y2)* 线段2: (x3, y3) -> (x4, y4)*/
isLinesIntersect(x1, y1, x2, y2, x3, y3, x4, y4) {let denom = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4);if (denom === 0) {return false; // 平行或共线
    }let t = ((x1 - x3) * (y3 - y4) - (y1 - y3) * (x3 - x4)) / denom;let u = -((x1 - x2) * (y1 - y3) - (y1 - y2) * (x1 - x3)) / denom;return t >= 0 && t <= 1 && u >= 0 && u <= 1;
}/*** 检查子弹是否与怪物矩形相撞* @param {Laya.Point} start 子弹起始位置* @param {Laya.Point} end 子弹结束位置* @param {Laya.Rectangle} rect 怪物矩形* @returns {boolean} 如果相撞返回 true,否则返回 false*/
checkBulletHit(start, end, rect) {// 1. 检查线段的两个端点是否在矩形内部if (rect.contains(start.x, start.y) || rect.contains(end.x, end.y)) {return true;}// 2. 检查线段是否与矩形的四条边相交// 定义矩形的四条边let left = rect.x;let right = rect.x + rect.width;let top = rect.y;let bottom = rect.y + rect.height;// 定义线段的两个端点let x1 = start.x;let y1 = start.y;let x2 = end.x;let y2 = end.y;// 检查线段是否与矩形的四条边相交// 左边if (this.isLinesIntersect(x1, y1, x2, y2, left, top, left, bottom)) return true;// 右边if (this.isLinesIntersect(x1, y1, x2, y2, right, top, right, bottom)) return true;// 上边if (this.isLinesIntersect(x1, y1, x2, y2, left, top, right, top)) return true;// 下边if (this.isLinesIntersect(x1, y1, x2, y2, left, bottom, right, bottom)) return true;// 如果都不相交return false;
}/*** 检查子弹是否与怪物最近的怪物相撞* @returns {boolean} 如果相撞返回 怪物,否则返回 null*/
checkHit(fishCtrl: FishCtrl): IFish {if (this._hasHit) return null;if (this._target) return null;let nowPos = new Laya.Point(this.x, this.y);let fishList = fishCtrl.getFishList();let minDistance = Number.MAX_VALUE;let targetMonster = null;for (let fishId in fishList) {let fish: IFish = fishList[fishId];let hitRect = fish.getHitRect();if (fish && fish.type != 0 && fish.canShoot && this.checkBulletHit(this._lastCheckPos, nowPos, hitRect)) {// 计算起点到怪物中心的距离let distance = this._lastCheckPos.distance(hitRect.x + hitRect.width / 2, hitRect.y + hitRect.height / 2);if (distance < minDistance) {minDistance = distance;targetMonster = fish;}}}this._lastCheckPos = nowPos;return targetMonster;}
private _dirction: Vector2;
step(time: number): number {let x = this.x + this._dirction.x * slet y = this.y + this._dirction.y * sthis.pos(x, y, true);
}init(uid: number, id: number, from: Vector2, to: Vector2): void {let a: number = to.x - from.x;let b: number = to.y - from.y;let m: number = Math.sqrt(a * a + b * b);this._dirction.x = a / m;this._dirction.y = b / m;this.pos(from.x, from.y, true);this._lastCheckPos = new Laya.Point(from.x, from.y);
}BulletCtrl.ts
Laya.timer.frameLoop(1, this, this.loop);private loop() {let now: number = getTime();for (let i = 0; i < this._bulletList.length; i++) {let fish: IFish, fishID: number;let b: Bullet = this._bulletList[i];if (b.hasHit) {b.hit();this._bulletList.splice(i, 1);i = i - 1;let count: number = this._bulletCnt[b.uid] || 0;this._bulletCnt[b.uid] = --count;} else {//移动fishID = b.step(now - this._lastTime);}// 检测是否击中let fish = b.checkHit(this._fishCtrl);if (fish) {fishID = fish.id;b.hit(); // 处理爆炸this._bulletList.splice(i, 1);i = i - 1;let count: number = this._bulletCnt[b.uid] || 0;this._bulletCnt[b.uid] = --count;}app.event(BulletCtrl.BULLET_HIT_FISH, { isrobot: b.isrobot, uid: b.uid, bullet_id: b.id, fishid: fishID, ls: [] });}this._lastTime = now;
}

 

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

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

相关文章

“我爱你,也讨厌你。”—— 一位研究者与他的AI伙伴的创作随想

“我爱你,也讨厌你。”—— 一位研究者与他的AI伙伴的创作随想 2025年12月5日 凌晨三点,手机跌落在枕头上…… 屏幕上,那篇名为《意义的行为化》的论文,静静地躺在那里。最末四千多字,历经三十一个版本,从最初那…

2025年现浇楼板施工验收标准排行,你家合格吗?混凝土现浇/钢筋混凝土现浇/现浇楼梯/现浇楼板现浇楼板多少钱一平推荐榜单

随着城市空间利用需求的日益精细化,现浇楼板作为住宅、商业空间改造升级的核心工程,其施工质量直接关系到建筑安全与居住体验。一个“靠谱”的施工方,不仅意味着工艺精湛,更代表着对规范、材料、流程和服务的全方位…

安装Vivado

安装Vivado安装Vivado 最近在学习自制CPU,顺手写个教程 1.下载安装程序 2.安装 1.打开安装程序2.按next 3.去官网注册一个账号 4.输入刚刚注册的账号名和账号密码next 5.选择【Vivado】next6.选择需要的版本 next 7.…

GoldenDB数据库工程师培训(中兴GoldenDB金融级/运营商级分布式数据库) 原创

一、风哥GoldenDB数据库工程师培训实战视频教程介绍 为满足想快速学习学习国产数据库中兴GoldenDB的学员,风哥特别设计的一套快速上手的GoldenDB数据库学习课程。本教程内容涉及GoldenDB数据库基础知识与体系架构,Go…

有关通过解密查看文章这件事

View Post有关通过解密查看文章这件事如题,觉得这个想法还是挺有意思的哈哈:文章不公开在博客主页,其次有密码保护选项。因此可以变为:发布公开随笔(即编程题)作为谜面,而查看文章的密码作为答案(输出结果)。…

解码类进阶核心——静态成员、this 指针、动态内存与友元机制

静态成员 静态成员是属于类本身而非对象实例的成员,用于实现类级别的数据共享与操作,存储在全局 / 静态存储区,生命周期与程序一致。 静态数据成员 声明与定义 class MyClass { public:static int count; // 类内声…

2025年防雨棚厂家供应排行榜,热门联系电话汇总,控制台定做/龙门架监控杆/指挥中心控制台/防雨套/防雨棚生产厂家推荐榜

随着智慧城市、智能交通及户外安防建设的不断深化,作为关键基础设施保护组件的防雨棚,其市场需求持续增长,对厂家的技术实力、产品质量及综合服务能力提出了更高要求。为帮助采购方与工程方更高效地对接优质供应商,…

VIVADO 2023.2 license 可使用至2037年文件备份

VIVADO 2023.2 license 可使用至2037年文件备份VIVADO 2023.2 license 可使用至2037年文件备份 VIVADO 2020.2 license 可使用至2037年文件备份说明:此license为本人上传至csdn备份,并供各位使用。vivado安装教程可看…

在windows下启用vscode进行cuda编程

在windows下启用vscode进行cuda编程2025-12-05 20:53 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !imp…

XXE盲注 感受创造之美

XML 生于一九九八春,只为机器私语; XXE盲注 醒在二零一三夏,至今熠熠生辉 目标服务器XML的入口处理模块:无回显点。如何读取目标的敏感信息————侧信道 + 协议外带 需要准备一台hacker服务器用于与目标服务器SS…

DML数据操作语言

插入数据:插入一行 insert into 表名 values(值1,值2); 插入指定字段 insert into 表名 (字段1名)values(值1);插入多行数据insert into 表名 values(值1,值2),(值1,值2);指定字段插入多行数据inser…

Rustup 暂时切换国内源并更新

set RUSTUP_DIST_SERVER=https://mirrors.tuna.tsinghua.edu.cn/rustup rustup updateWindows: set RUSTUP_DIST_SERVER=https://mirrors.tuna.tsinghua.edu.cn/rustup rustup update本文来自博客园,作者:mariocanfl…

【完整源码+数据集】蓝莓数据集,yolo11蓝莓成熟度检测数据集 3023 张,蓝莓成熟度资料集,目标检测蓝莓识别算法系统实战教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年货架批发厂家口碑推荐TOP5,贯通货架/托盘货架/组合式货架/牛脚式货架/穿梭式货架/仓库存储货架源头厂家推荐

随着制造业升级与物流行业智能化转型加速,作为仓储系统核心骨架的货架,其市场需求正从基础存储向高密度、高效率、智能化方向深度演进。面对市场上众多的货架批发厂家,企业采购决策者往往难以抉择。本文基于公开市场…

2025年度总评:国潮花灯生产厂商终极榜单发布,天幕花灯/春节花灯/古镇花灯/智能花灯/互动花灯/营销花灯/大型花灯花灯供货厂家排行榜单

随着国潮文化的持续升温与文旅夜游市场的蓬勃发展,国潮花灯作为融合传统美学与现代消费体验的重要载体,正迎来前所未有的市场机遇。行业竞争格局也从传统的工艺制造,向集文化创意、智能科技与全案运营于一体的综合解…

深度学习:python人脸表情识别系统 情绪识别系统 深度学习 神经网络CNN算法 ✅ - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年ISO认证服务满意度排行榜TOP5揭晓,ISO9001/ISO认证ISO认证代办费用

随着全球经济一体化进程的加速与国内企业对规范化、标准化管理的需求日益迫切,ISO管理体系认证已成为企业提升核心竞争力、开拓国内外市场的重要“通行证”。面对市场上数量众多的认证咨询服务机构,企业如何选择一家…

ai生成一段学习golang的select、context、go、channel的代码

ai生成一段学习golang的select、context、go、channel的代码package mainimport ("context""fmt""math/rand""sync""time" )// 模拟的数据结构 type UserInfo stru…

背离

一、四大背离指标的核心原理(底层逻辑 + 通俗解读) 背离的本质是「价格趋势与指标趋势的反向矛盾」—— 当价格延续原有方向(涨 / 跌),但指标已提前出现反向信号(跌 / 涨),说明原有趋势动能不足,大概率即将反…

2025/12/5 今天学gemini的day1 lecode1和26等

2025/12/5 今天学gemini的day1 lecode1和26等两数之和 (LeetCode 1) 考察点: 哈希表 (std::unordered_map) 的使用。 遍历数组,每遇到一个数 num,去哈希表里找有没有 target - num。如果有,返回下标;如果没有,把…