RectMask2D详细解读
-
RectMaskD就是基于CanvasRenderer的一个EnableRectClipping方法。而RectMask2D的原理则比较简单,最复杂点是在于其上层逻辑会比较复杂。
启动RectMask2D时需要通过ClipperRegistry.Register(this);并且将自己注册到RectMask2D的管理类ClipperRegistry中,以便于后续统一调用,在Canvas的运作流程中CLipperRegistry会全程参与。
并且启动RectMask2D的同时还需要通过 MaskUtilities.Notify2DMaskStateChanged(this)语句通知所有子游戏物体,此子游戏物体继承自IClippable,后文统一简称为子Clippable,并且需要重新更新Clipp状态,会通过UpdateClipParent关键字重新确定影响自身Clip的RectMask2D;
考虑到可能存在多个Canvas以及RectMask2D的情况,所以子Clippable会在得到重新更新状态的通知时,就会调用MaskUtilities.GetRectMaskForClippable方法重新确认RectMask2D。在确认后每个子Clippable会将自己添加到对应的RectMask2D维护的列表中。
当Canvas更新时还会调用ClipperRegistry的cull放进行剔除,也可以称作为实现遮罩,同时cull方法会通知全部的RectMask2D进行PerformClipping。
当RectMask2D收到PerformClipping命令之后,会先获取到所有父类有效的RectMask2D。这也是为了后续能够计算遮罩的范围Rect。因为当有两个RectMask2D同时出现时,裁切的范围是两个共同存在的区域。之后会采用Clipping.FindCullAndClipWorldRect方法去计算裁切区域。通过方法的名字也可以了解到,计算出来的rect为world级别的,换句话说其实就是与之对应的Canvas下的坐标值。
在确定了裁切范围后,RectMask2D会通知自己维护的IClippable列表的成员进行裁切,然后每个IClippable列表成员统一调用 canvasRenderer.EnableRectClipping(clipRect);方法并进行裁切。
西南地区IT社群(QQ)
- 云南
- 【昆明网页设计交流吧】243627302
- 【昆明nodejs交流吧】 243626749
- 【VUE】838405306
- 【云南程序员总群】343606807
- 【昆明UI设计】104031254
- 【云南软件外包】15547313
- 贵州
- 【PHP/java源码/站长交流群】55692114
- 四川
- 【成都Java/JavaWeb交流】86669225
- 【vaScript+PHP+MySql】116270060
- 【UI设计/设计交流学习群】135794928
- 重庆
- 【诺基亚 JAVA游戏博物馆】 559479780
- 【PHP,Java,Python,C++接单】 442103442
- 西藏