随手写的,有空再整理。
一、Stage、ViewPort、Camera、FrameBuffer、Batch
- Stage就是实在的游戏世界,Stage与显示逻辑毫无关系,Stage只是在客观的描述游戏世界的内容。
- ViewPort代表Stage到Screen的缩放方式(平铺、缩放、拉伸、延展等)。
- Camera包含两部分,观察世界的位置与方向,以及如何投射到FrameBuffer。
- FrameBuffer就是画布。
- Batch是连接Camera投射和FrameBuffer工具,Batch在事务过程中不能修改Camera投影,也不能改变画布大小。
任何时候必须保证Camera大小与FrameBuffer大小相同。
二、布局坑minWidth, minHeight, prefWidth, prefHeight, maxWidth, maxHeight的处理逻辑非常恶心,和width还有height的关系很迷惑。
恶心的根本原因在于框架的布局逻辑里没有专门为测量做设计。通常布局的逻辑有两个阶段:
- 测量阶段:布局控件要先测量所有孩子控件的大小,来计算自己需要的总大小。此时控件没有真实大小。
- 布局阶段:然后根据自己的可用大小和孩子的预期大小权衡后进行布局。此时父级(包括当前)布局都已拥有真实大小。
这两个阶段本都是相对比较独立的递归过程,单独写都很好写,但框架实际只有一个layout函数要处理完整个逻辑时就很容易出错。测量阶段被用prefWidth和prefHeight简化了。
但框架里prefWidth和prefHeight都是接口,而且只有WidgetGroup会提供这个接口,这意味着用户不能在布局文件中预设控件的大小——因为prefWidth和prefHeight不是所有控件都有,甚至也不是个能写的数值。如果使用width和hegiht来填写这个期望值,那么当父布局因为某些原因无法按照预期大小对控件进行布局时,原来的width和height属性就会被覆盖,这个原始的“期望”大小就会消失。
总结下来注意的就两点:
- 测量阶段的函数不要使用任何需要控件实际大小的依赖,某些处理空余空间分配的逻辑不要尝试写进测量阶段。
- 对于用户的期望大小,尽量使用控件外的逻辑来赋予,而不要使用width和height,否则会丢失原始数据。
三、布局默认会把transform设置为true,导致孩子的draw方法会使用父布局的坐标
他妈逼的煞笔默认逻辑,查了我半天为什么会出现偏移错误,关键是layout出来的位置都是对的。
先这样吧,

Leave a Reply