creator 反复横跳瞄准线的实现
1.效果
2.原理
对有反射功能的物体添加物理引擎的刚体与碰撞器,利用射线检查路线上面是否有对应的碰撞物体。有就对当前碰撞点。进行向量加法与点乘计算(具体计算公式请面向百度或者查看代码)来得到反射的向量。然后重复之前的操作。
3.代码
const { ccclass, property } = cc._decorator;@ccclass
export default class PhysicalLineModule extends cc.Component {@property(cc.Graphics)private line_graphics: cc.Graphics = null;@property(cc.Node)private touch_node: cc.Node = null;/*** 连段的长度*/private line_height:number = 2000;onLoad() {cc.DistanceJointcc.director.getPhysicsManager().enabled = true;cc.director.getPhysicsManager().debugDrawFlags = cc.PhysicsManager.DrawBits.e_aabbBit |cc.PhysicsManager.DrawBits.e_jointBit |cc.PhysicsManager.DrawBits.e_shapeBit;this.initModule();}onEnable() {this.touch_node.on(cc.Node.EventType.TOUCH_START, this.onTouchStart, this);this.touch_node.on(cc.Node.EventType.TOUCH_MOVE, this.onTouchMove, this);}onDisable() {this.touch_node.off(cc.Node.EventType.TOUCH_START, this.onTouchStart, this);this.touch_node.off(cc.Node.EventType.TOUCH_MOVE, this.onTouchMove, this);}private onTouchStart(event: cc.Event.EventTouch) {this.resetLine(event.getLocation());}private onTouchMove(event: cc.Event.EventTouch) {this.resetLine(event.getLocation());}/*** 刷新线* @param touch_point */resetLine(touch_point: cc.Vec2) {this.line_graphics.clear();let start_point = this.line_graphics.node.convertToWorldSpaceAR(cc.Vec2.ZERO);let sub_vec = touch_point.sub(start_point);let end_point = sub_vec.div(sub_vec.mag()).mul(this.line_height).add(start_point);this.physicalRayCast(start_point,end_point,this.line_height);this.line_graphics.stroke();}/*** 射线检查* @param p1 * @param p2 * @param line_mag */physicalRayCast(p1:cc.Vec2,p2:cc.Vec2,line_mag:number){//射线检测var results = cc.director.getPhysicsManager().rayCast(p1, p2, cc.RayCastType.Closest)[0];let sub_vec:cc.Vec2;if(results){sub_vec = results.point.sub(p1);//计算长度let draw_mag = sub_vec.mag();//得到入射向量单位sub_vec.divSelf(sub_vec.mag());if(line_mag - draw_mag>0){this.drawLine(this.node.convertToNodeSpaceAR(p1),sub_vec,draw_mag);//法向量p1 = results.point;//反射法向量p2 = sub_vec.sub(results.normal.mul(2*sub_vec.dot(results.normal)));p2.mul(line_mag - draw_mag,p2);//反射点p2.add(p1,p2)this.physicalRayCast(p1,p2,line_mag - draw_mag);}else{this.drawLine(this.node.convertToNodeSpaceAR(p1),sub_vec,line_mag);}}else{sub_vec = p2.sub(p1);sub_vec.divSelf(sub_vec.mag());this.drawLine(this.node.convertToNodeSpaceAR(p1),sub_vec,line_mag);}}/*** 画线* @param start_point * @param sub_vec * @param line_mag */drawLine(start_point: cc.Vec2, sub_vec: cc.Vec2, line_mag: number) {//线段结束位置let end_point = start_point.add(sub_vec.mul(20));this.line_graphics.moveTo(start_point.x, start_point.y);this.line_graphics.lineTo(end_point.x, end_point.y);line_mag -= 30;if (line_mag > 0) {this.drawLine(end_point.addSelf(sub_vec.mul(10)), sub_vec, line_mag);}}initModule () {let width = this.node.width;let height = this.node.height;let node = new cc.Node();let body = node.addComponent(cc.RigidBody);body.type = cc.RigidBodyType.Static;this._addBound(node, 0, height/2, width, 20);this._addBound(node, 0, -height/2, width, 20);this._addBound(node, -width/2, 0, 20, height);this._addBound(node, width/2, 0, 20, height);node.parent = this.node;}_addBound (node, x, y, width, height) {let collider = node.addComponent(cc.PhysicsBoxCollider);collider.offset.x = x;collider.offset.y = y;collider.size.width = width;collider.size.height = height;}
}
creator 反复横跳瞄准线的实现相关推荐
- 奥义蛇皮走位之反复横跳(一)
今天让我们来学习一下奥义--反复横跳 ....额不,是奥义--反复循环 "愚公移山"之 while 循环 问:愚公移山,要移到什么时候? 答:只要山还在 ...
- LeetCode 周赛 334,在算法的世界里反复横跳
本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问. 大家好,我是小彭. 今天是 LeetCode 第 334 场周赛,你参加了吗?这场周赛考察范围比较基础,整体 ...
- 中兴捧月比特派E题——反复横跳
题目描述 牛牛在位置s,牛妹在位置t,初始时op=1,step=1,牛牛每次可以执行以下操作之一: 1.跳:牛牛从当前所在位置x跳到x=x+op*step,随后op=op∗−1,step=step∗2 ...
- 奥义蛇皮走位之反复横跳(二)
循环嵌套之暴力破解密码 //首先写一个登录程序 #include <iostream> #include <Windows.h> #include <string> ...
- 学习笔记——GEE\USGS\地理空间数据云\ENVI反复横跳的心酸过程
整个问题实际上是在用GEE做无监督分类时,发现影像拼接色彩差距较大.出现明显拼接缝的问题,在尝试了网上已有的直方图匹配算法之后效果不佳且经常溢出,所以回归本心用ENVI去校正,试图获得色彩统一的整个影 ...
- 能力一般,却可以大厂随便横跳?强在哪里?
职场需要的能力有很多种,面试能力往往就是高薪offer的敲门砖.很多人明明技术很强,但总是在面试中谈不下来一个好薪水,或者是拿不到心仪公司的offer,很可能就是面试能力不够. 最近看到这样一条职言, ...
- 第二个五年,左右横跳到P8年薪100w
原创不易,求分享.求一键三连 之前写了一篇个人经历介绍: 34岁回顾人生,也怕中年危机! 有人觉得很有帮助,有人觉得很啰嗦,但更多的是吐槽「太长了」,尼玛读完需要一个小时,谁还愿意读? 所以这里特意将 ...
- 每日一题,每日一练。11车的可用捕获量(半夜两点在棋盘上左右横跳),
在一个 8 x 8 的棋盘上,有一个白色车(rook).也可能有空方块,白色的象(bishop)和黑色的卒(pawn).它们分别以字符 "R",".",&quo ...
- 抛物线的瞄准线的绘制! Cocos Creator!
给平抛高抛发射添加一个瞄准线!文章底部附完整代码! 效果预览 在 如何实现高抛平抛发射?从抛物线说起! 中介绍了物体平抛或高抛发射的一种实现.这次我们为它添加一个瞄准线. 需求分析 已知物体初速度v, ...
最新文章
- 深度学习用途广:Nvidia工程师机智赶跑草坪上撒野的邻家喵星人
- 工作缺点和不足及措施_安全生产 | 查不足 定措施 抓落实 强管理 圣雄氯碱组织开展“事故回头看”工作...
- 孤荷凌寒自学python第五十四天使用python来删除Firebase数据库中的文档
- 最长上升子序列三种模板(n^2模板,二分模板,树状数组模板)
- 图像傅里叶变换频谱分析
- paip.php调试脱离IDE VC59
- cacti不能实时刷新流量图_解决Cacti无法正常监视超过100M以上流量的问题
- 【iOS】屏幕适配之NSLayoutConstraint
- hive怎么发音_Hadoop Hive概念学习系列之hive里的HiveQL——查询语言(十五)
- 金士顿服务器内存条怎么看型号,区分内存条型号的方法
- 一文看懂机器人技术的发展史
- 【记录】PR|一些使用技巧记录
- 华为RH2288 V3安装Windows server/Linux详细教程
- 简单记账本-android版
- 房产管理系统系统与数据中心对接要遵循的标准和规范
- 郭建兵:四个方面大力度促进云计算发展
- “This probably means that you are not using fork to start your child processes and you hav报错
- java从小白到老白⑤——传智播客27版笔记
- 学习AspectJ框架(一):AspectJ开发环境搭建与Hello World
- 阿里云服务器学生机购买教程最简单的方发(只需一步即可)
热门文章
- openssl工具详解及自建CA方法
- Hadoop 命令操作大全
- 哈工大计算机科学与技术硕士培养方案,计算机科学与技术学科硕士研究生培养方案哈工大计算机学院[文].pdf...
- 微信小程序获取用户运动步数后端返回-41003
- fatal: detected dubious ownership in repository git报错解决
- vue复制图片到剪切板
- Vue3初识 学习记录(一)
- 分享宝贵的考研心得, 做到这些,考研无惧暗箱操作!
- 世纪安图参加2014地理信息开发者大会
- linux编译ipp多线程,Linux下Intel IPP编程环境的配置