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 反复横跳瞄准线的实现相关推荐

  1. 奥义蛇皮走位之反复横跳(一)

    今天让我们来学习一下奥义--反复横跳 ....额不,是奥义--反复循环               "愚公移山"之 while 循环 问:愚公移山,要移到什么时候? 答:只要山还在 ...

  2. LeetCode 周赛 334,在算法的世界里反复横跳

    本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问. 大家好,我是小彭. 今天是 LeetCode 第 334 场周赛,你参加了吗?这场周赛考察范围比较基础,整体 ...

  3. 中兴捧月比特派E题——反复横跳

    题目描述 牛牛在位置s,牛妹在位置t,初始时op=1,step=1,牛牛每次可以执行以下操作之一: 1.跳:牛牛从当前所在位置x跳到x=x+op*step,随后op=op∗−1,step=step∗2 ...

  4. 奥义蛇皮走位之反复横跳(二)

    循环嵌套之暴力破解密码 //首先写一个登录程序 #include <iostream> #include <Windows.h> #include <string> ...

  5. 学习笔记——GEE\USGS\地理空间数据云\ENVI反复横跳的心酸过程

    整个问题实际上是在用GEE做无监督分类时,发现影像拼接色彩差距较大.出现明显拼接缝的问题,在尝试了网上已有的直方图匹配算法之后效果不佳且经常溢出,所以回归本心用ENVI去校正,试图获得色彩统一的整个影 ...

  6. 能力一般,却可以大厂随便横跳?强在哪里?

    职场需要的能力有很多种,面试能力往往就是高薪offer的敲门砖.很多人明明技术很强,但总是在面试中谈不下来一个好薪水,或者是拿不到心仪公司的offer,很可能就是面试能力不够. 最近看到这样一条职言, ...

  7. 第二个五年,左右横跳到P8年薪100w

    原创不易,求分享.求一键三连 之前写了一篇个人经历介绍: 34岁回顾人生,也怕中年危机! 有人觉得很有帮助,有人觉得很啰嗦,但更多的是吐槽「太长了」,尼玛读完需要一个小时,谁还愿意读? 所以这里特意将 ...

  8. 每日一题,每日一练。11车的可用捕获量(半夜两点在棋盘上左右横跳),

    在一个 8 x 8 的棋盘上,有一个白色车(rook).也可能有空方块,白色的象(bishop)和黑色的卒(pawn).它们分别以字符 "R",".",&quo ...

  9. 抛物线的瞄准线的绘制! Cocos Creator!

    给平抛高抛发射添加一个瞄准线!文章底部附完整代码! 效果预览 在 如何实现高抛平抛发射?从抛物线说起! 中介绍了物体平抛或高抛发射的一种实现.这次我们为它添加一个瞄准线. 需求分析 已知物体初速度v, ...

最新文章

  1. 深度学习用途广:Nvidia工程师机智赶跑草坪上撒野的邻家喵星人
  2. 工作缺点和不足及措施_安全生产 | 查不足 定措施 抓落实 强管理 圣雄氯碱组织开展“事故回头看”工作...
  3. 孤荷凌寒自学python第五十四天使用python来删除Firebase数据库中的文档
  4. 最长上升子序列三种模板(n^2模板,二分模板,树状数组模板)
  5. 图像傅里叶变换频谱分析
  6. paip.php调试脱离IDE VC59
  7. cacti不能实时刷新流量图_解决Cacti无法正常监视超过100M以上流量的问题
  8. 【iOS】屏幕适配之NSLayoutConstraint
  9. hive怎么发音_Hadoop Hive概念学习系列之hive里的HiveQL——查询语言(十五)
  10. 金士顿服务器内存条怎么看型号,区分内存条型号的方法
  11. 一文看懂机器人技术的发展史
  12. 【记录】PR|一些使用技巧记录
  13. 华为RH2288 V3安装Windows server/Linux详细教程
  14. 简单记账本-android版
  15. 房产管理系统系统与数据中心对接要遵循的标准和规范
  16. 郭建兵:四个方面大力度促进云计算发展
  17. “This probably means that you are not using fork to start your child processes and you hav报错
  18. java从小白到老白⑤——传智播客27版笔记
  19. 学习AspectJ框架(一):AspectJ开发环境搭建与Hello World
  20. 阿里云服务器学生机购买教程最简单的方发(只需一步即可)

热门文章

  1. openssl工具详解及自建CA方法
  2. Hadoop 命令操作大全
  3. 哈工大计算机科学与技术硕士培养方案,计算机科学与技术学科硕士研究生培养方案哈工大计算机学院[文].pdf...
  4. 微信小程序获取用户运动步数后端返回-41003
  5. fatal: detected dubious ownership in repository git报错解决
  6. vue复制图片到剪切板
  7. Vue3初识 学习记录(一)
  8. 分享宝贵的考研心得, 做到这些,考研无惧暗箱操作!
  9. 世纪安图参加2014地理信息开发者大会
  10. linux编译ipp多线程,Linux下Intel IPP编程环境的配置