最近踩的libGDX的坑

随手写的,有空再整理。

一、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属性就会被覆盖,这个原始的“期望”大小就会消失。

总结下来注意的就两点:

  1. 测量阶段的函数不要使用任何需要控件实际大小的依赖,某些处理空余空间分配的逻辑不要尝试写进测量阶段。
  2. 对于用户的期望大小,尽量使用控件外的逻辑来赋予,而不要使用width和height,否则会丢失原始数据。

三、布局默认会把transform设置为true,导致孩子的draw方法会使用父布局的坐标

他妈逼的煞笔默认逻辑,查了我半天为什么会出现偏移错误,关键是layout出来的位置都是对的。

先这样吧,

Leave a Reply

Your email address will not be published. Required fields are marked *