## 功能(面板源码,重启后仍在)
- 新增 AnimationTools:
- Animate Random Props:随机骨骼/插槽/附件 → ani_api_test
旋转 0°→90°、位移 (0,0)→(120,-60)、缩放 (1,1)→(1.6,0.6)、斜切 (0,0)→(25,15)
插槽颜色 (1,1,1,1)→(1,0.2,0.2,0.25)、附件 显示→隐藏;全部只在 0f/30f
- Curve Test 6 Modes:curve_test,6 根骨骼各一条旋转轴(0°→45°,0f/30f),
分别 linear / curve 平滑(0.25,0,0.75,1) / stepped / ease-in(0.42,0,1,1) /
ease-out(0,0,0.58,1) / 对称自动(0.25,0.25,0.75,0.75)
- ObjectPanel.build 里挂载这两个按钮,复用面板自己的 wire() 点击轮询
## 对照表(tools/deobf/anchors.tsv + 混淆名对照表.md 第十一节)
- GP.I=animations、GP.D:LFT;.D:F=fps、Gl=动画(name/skeleton/timelineGroups/register)
- Gl.D/B/L/I(Gp)=旋转/位移/缩放/斜切;Gl.D/B(Gp,GU)=插槽颜色/附件;Gl.D()=绘制顺序
- FH=组;FI=时间轴(runtimeTimelineClass、keys、findKey、insertKey、invalidateRuntime)
- FN=关键帧(time、curve、c2x/c2y/c3x/c3y、setAngle/setX/setY、Color、Gn)
- FV=曲线枚举(linear/curve/stepped;'自动'=curve+控制值)
- 踩坑记录:
* 关键帧数值写在 FN.D()/B()/L() 的 float 字段,**不是** FN.D():ga(ga 是 deform 的),
否则会出现'有帧但运行时不变'
* 编辑器时间轴刻度就是**帧**,关键帧时间写 0/30,不要按 1 秒=30 帧换算
* FI.D(float,int) 建帧要求时间轴已有关键帧(先有鸡问题)
* fI.removeRange 两个 (int,int) 重载都不缩容 → 清空动画直接换新 fI
names.tsv 合并成 380 条,payload-named.zip 重产(7271 处成员引用)。
验证:全部在运行中的编辑器里逐条读回(时间轴/关键帧/曲线枚举/控制值),
重启后 pid 94663 单实例,日志确认 '[animtool] 两个动画按钮已加入'。
21 KiB
21 KiB
| 1 | # 名字映射锚点(只放**已确定**的;每条都要能说清依据,依据写进 混淆名对照表.md) | |||
|---|---|---|---|---|
| 2 | # 列:owner | name | desc | newName (desc 写 * 表示该 owner 下所有同名成员) |
| 3 | # | |||
| 4 | # ---- libGDX:Table(载荷名 et);依据 Obf.java + 直读字节码 ---- | |||
| 5 | et | D | (Ldl;)LdR; | add |
| 6 | et | D | ([Ldl;)Let; | addAll |
| 7 | et | I | ()LdR; | row |
| 8 | et | Z | (Z)V | setFillParent |
| 9 | et | SourceFile | ()V | clearChildren |
| 10 | et | D | (Ljava/lang/CharSequence;)LdR; | addLabel |
| 11 | # ---- libGDX:Cell(载荷名 dR)---- | |||
| 12 | dR | StackMapTable | ()LdR; | expand |
| 13 | dR | D | ()LdR; | fill |
| 14 | dR | C | ()LdR; | left |
| 15 | dR | S | ()LdR; | top |
| 16 | # ---- libGDX:Button / Label(保名类)---- | |||
| 17 | com/badlogic/gdx/scenes/scene2d/ui/Button | String | ()Z | isChecked |
| 18 | com/badlogic/gdx/scenes/scene2d/ui/Button | I | (Z)V | setChecked |
| 19 | com/badlogic/gdx/scenes/scene2d/ui/Button | B | (ZZ)V | setCheckedAndFire |
| 20 | com/badlogic/gdx/scenes/scene2d/ui/Button | a_ | (Z)V | setDisabled |
| 21 | com/badlogic/gdx/scenes/scene2d/ui/Label | D | (Ljava/lang/CharSequence;)V | setText |
| 22 | com/badlogic/gdx/scenes/scene2d/ui/Label | D | ()Ljava/lang/StringBuilder; | getTextBuilder |
| 23 | # ---- libGDX:SelectBox(载荷名 KP);依据 DumpSites 解出的 (Ljava/lang/String;)V ---- | |||
| 24 | KP | B | (Ljava/lang/String;)V | setSelected |
| 25 | KP | B | ()Ljava/lang/String; | getSelected |
| 26 | KP | B | (I)V | setSelectedIndex |
| 27 | # ---- 场景模型:Gp = 骨骼;依据 gp_2.java 的 toString()/D(String,boolean)V ---- | |||
| 28 | Gp | D | Ljava/lang/String; | name |
| 29 | Gp | D | (Ljava/lang/String;Z)V | setName |
| 30 | # ---- 场景模型:Gp = 骨骼的变换字段 ---- | |||
| 31 | # 证据:用户在编辑器里把 root 转到 341.456 / 平移(-168,-116) / 缩放(0.8799,0.572) / 斜切(-52.221,-28.63), | |||
| 32 | # 面板 Inspector 同步显示 Z=-168.00009 V=-116.0 F=33.676704 Code=0.8799178 SourceFile=0.5720396 | |||
| 33 | # StackMapTable=-52.220505 LineNumberTable=-28.629883 —— 一一对应,故确定语义。 | |||
| 34 | Gp | Z | F | x |
| 35 | Gp | V | F | y |
| 36 | Gp | F | F | rotation |
| 37 | Gp | Code | F | scaleX |
| 38 | Gp | SourceFile | F | scaleY |
| 39 | Gp | StackMapTable | F | shearX |
| 40 | Gp | LineNumberTable | F | shearY |
| 41 | # C 只能是 length,故整组推断不成立;这些字段的语义**目前未定**,不写进表里(宁可显示混淆名也不写错名)。 | |||
| 42 | # Gp | D | F | setupX |
| 43 | # Gp | B | F | setupY |
| 44 | # Gp | L | F | setupRotation |
| 45 | # Gp | I | F | setupScaleX |
| 46 | # Gp | S | F | setupScaleY |
| 47 | # 引用类字段:skeleton 由 hd.D(set, bone.D)+GP.D(LGp;) 的用法确定;parent 由创建骨骼时 bone.D=parent 确定 | |||
| 48 | Gp | D | LGP; | skeleton |
| 49 | Gp | D | LGp; | parent |
| 50 | Gp | B | Lcom/badlogic/gdx/graphics/Color; | color |
| 51 | # ---- 2026-10-16 setup pose 实测补充(用户拍照:root/bone/slot/region 四种对象)---- | |||
| 52 | # 其中 length 已被 JSON 导出器改成 Gp.C:F(导出器写 length 时读的就是 C)。 | |||
| 53 | # 剩下 Class/Ljava/java/init/String 这几个 float 导出器一个都没用,语义未定,不写进表。 | |||
| 54 | # GU(插槽):面板 Slot 属性只有 Name/Color;Inspector 里 String D=mega_dg4、Gp D=所属骨骼 | |||
| 55 | GU | D | Ljava/lang/String; | name |
| 56 | GU | D | LGp; | bone |
| 57 | # GO(region 附件 mega_dg4):面板只有 Image path/Color;Inspector 六个 float 与 | |||
| 58 | # Region 附件的 旋转49.00014 / 缩放(1.997,1.335) / 宽高(157,154) 一一对应 | |||
| 59 | GO | S | F | rotation |
| 60 | GO | L | F | scaleX |
| 61 | GO | I | F | scaleY |
| 62 | GO | C | F | width |
| 63 | GO | Z | F | height |
| 64 | # ---- ScrollPane(保名类 com/badlogic/gdx/scenes/scene2d/ui/ScrollPane)---- | |||
| 65 | # 依据:MapMethods 对 gdx-1.11.0 指纹比对(tools/deobf/anchors-libgdx.tsv 自动生成), | |||
| 66 | # 并且**踩过一次**:一直以为 B(ZZ)V 是 setForceScroll,传了 (false,true), | |||
| 67 | com/badlogic/gdx/scenes/scene2d/ui/ScrollPane | B | (ZZ)V | setScrollingDisabled |
| 68 | com/badlogic/gdx/scenes/scene2d/ui/ScrollPane | L | (FFFF)V | scrollTo |
| 69 | com/badlogic/gdx/scenes/scene2d/ui/ScrollPane | D | (Ldl;)V | addActor |
| 70 | com/badlogic/gdx/scenes/scene2d/ui/ScrollPane | D | (Ldl;Z)Z | removeActor |
| 71 | # ---- ScrollPane / Cell 的滚动与尺寸方法(用于把面板列表改成可滚动;依据:MapMethods 指纹比对)---- | |||
| 72 | # ScrollPane:B(ZZ)V=setScrollingDisabled、I(ZZ)V=setForceScroll、L(ZZ)V=setOverscroll | |||
| 73 | #(候选顺序 size/… 已核对;踩坑:把 B(ZZ) 当 setForceScroll 用,等于关掉纵向滚动) | |||
| 74 | com/badlogic/gdx/scenes/scene2d/ui/ScrollPane | I | (ZZ)V | setForceScroll |
| 75 | com/badlogic/gdx/scenes/scene2d/ui/ScrollPane | L | (ZZ)V | setOverscroll |
| 76 | # Cell 的 (F)LdR; 成组按声明顺序:B=size L=width I=height S=minWidth C=minHeight Z=prefWidth V=prefHeight | |||
| 77 | dR | B | (F)LdR; | size |
| 78 | dR | L | (F)LdR; | width |
| 79 | dR | I | (F)LdR; | height |
| 80 | dR | S | (F)LdR; | minWidth |
| 81 | dR | C | (F)LdR; | minHeight |
| 82 | dR | Z | (F)LdR; | prefWidth |
| 83 | dR | V | (F)LdR; | prefHeight |
| 84 | # ---- Actor 的 Touchable(点击/进入命中相关;用于让 ScrollPane 收到鼠标进入→拿到 scroll focus)---- | |||
| 85 | # 定位方式(不靠名字):`Actor.getTouchable()` = **无参且返回枚举**的那个方法;枚举类 = dv; | |||
| 86 | # libGDX Touchable 声明顺序 enabled/disabled/childrenOnly → 第 0 个常量就是 enabled。 | |||
| 87 | # 现象佐证:ScrollPane 默认 childrenOnly 时自己不是命中目标,收不到 enter → 滚轮事件不会送到它, | |||
| 88 | # 但程序化 scrollY() 是生效的(实测 before=0 after=200)。 | |||
| 89 | dl | L | (Ldv;)V | setTouchable |
| 90 | # ---- Cell.height(2026-10-16 实测确认)---- | |||
| 91 | # Cell.I(900) -> root 高度 580 -> 1080(其它候选 L/B/Z/V/C/S/F 都没这个效果) | |||
| 92 | # => Cell.I(float) 就是 height(float);现象佐证:设了它之后列表区出现滚动条、可滚。 | |||
| 93 | dR | I | (F)LdR; | height |
| 94 | # ---- Stage 宽高(2026-10-16 实测)---- | |||
| 95 | # 依据:编辑器窗口 4K 下读 Stage 的无参 float 只有两个:B=2044、D=3726(高<宽), | |||
| 96 | # 故 B()F = getHeight、D()F = getWidth。 | |||
| 97 | dt | B | ()F | getHeight |
| 98 | dt | D | ()F | getWidth |
| 99 | # ---- 图片附件 GO 的 7 个 float 字段(2026-10-16 确认,两条独立证据)---- | |||
| 100 | # 证据 1:编辑器自己的 JSON 写入器 sb_0.java:669-675(写 region 时依次读) | |||
| 101 | # x=GO.D y=GO.B scaleX=GO.L scaleY=GO.I rotation=GO.S width=GO.C height=GO.Z | |||
| 102 | # 旁证:width/height 与图片实际像素一致(mega_dg4.png = 157x154,运行时读到的 C=157.0 Z=154.0) | |||
| 103 | # 证据 2:GO 自己的 setTransform 字节码 javap -c GO 的 D(FFFFF)V: | |||
| 104 | # putfield D(第1个参数) -> putfield B(2) -> putfield S(3) -> putfield L(4) -> putfield I(5) | |||
| 105 | # => D(float) = x、B(float) = y(这两个字段名与别的字段重复,必须按类型取 float 那个) | |||
| 106 | GO | D | F | x |
| 107 | GO | B | F | y |
| 108 | GO | D | (FFFFF)V | setTransform |
| 109 | # 图片附件没有 shear 字段:region 只有 x/y/rotation/scaleX/scaleY(+ 只读的 width/height) | |||
| 110 | # ---- 附件删除(编辑器自己的删除流程)---- | |||
| 111 | # 证据:javap -c Gn 的 L()V => this.GU.skeleton.removeAttachment(this, true, true) | |||
| 112 | # GP 的 D(Gn,ZZ)V 字节码里 getfield L:LfI; fI.B(Object,boolean) 把它从附件表移除, | |||
| 113 | # 并同步清掉 GU 上指向它的引用(同一方法里遍历 Z:LfI 即插槽表)。 | |||
| 114 | Gn | L | ()V | delete |
| 115 | GP | L | (LGn;ZZ)V | removeAttachment |
| 116 | GP | L | LfI | attachments |
| 117 | GP | Z | LfI | slots |
| 118 | # ---- 附件种类 / 占位附件 ---- | |||
| 119 | Gn | I | ()Ljava/lang/String; | type |
| 120 | # 附件上指向自己所属占位附件的引用:GP.removeAttachment 的占位分支按它级联删除 | |||
| 121 | Gn | D | LHi; | placeholderRef |
| 122 | # ============================================================================ | |||
| 123 | # 【权威来源】编辑器自带的 JSON 导出器(载荷类 sB,2026-10-16) | |||
| 124 | # ---------------------------------------------------------------------------- | |||
| 125 | # 为什么权威:导出 JSON 时**每个 key 后面紧跟被读的那个字段**,key 名就是字段语义。 | |||
| 126 | # 证据链(两处独立,顺序逐条一致): | |||
| 127 | # 1) 可读载荷 ~/Desktop/spine398/spine398.jar(DecAll 产出:ldc 密文已换明文、解密调用已换 nop) | |||
| 128 | # 2) 未解密载荷 (payload-public.zip) 的 strings.tsv(class sB, method D):同一(类,方法)内 | |||
| 129 | # 密文顺序 = 字节码顺序,281 条与可读副本里的 key 顺序逐条对得上(含三组解密器)。 | |||
| 130 | # 导出器方法:sB.D(GP,boolean,boolean,gy,StringBuilder)=骨架;sB.D(gy,String,Gn,boolean)=附件。 | |||
| 131 | # 字段名重复(D/B/L/I/S…)时**必须按描述符取**,表里已经带描述符。 | |||
| 132 | # ============================================================================ | |||
| 133 | Gp | C | F | length |
| 134 | # ^ length 是 C(之前写的 Class:F 是错的,已作废) | |||
| 135 | Gp | D | LiC; | transform |
| 136 | # ^ iC = 继承模式枚举(normal/onlyTranslation/noScale…) | |||
| 137 | Gp | String | Z | skinOverride |
| 138 | GU | B | Lcom/badlogic/gdx/graphics/Color; | color |
| 139 | GU | I | Lcom/badlogic/gdx/graphics/Color; | darkColor |
| 140 | GU | I | Z | hasDarkColor |
| 141 | GU | B | LGn; | attachment |
| 142 | GU | D | Liz; | blend |
| 143 | # ^ iz = 混合模式枚举 | |||
| 144 | # ---- Gn = 附件基类 ---- | |||
| 145 | Gn | D | Ljava/lang/String; | name |
| 146 | # ---- GO = 图片(region)附件 ---- | |||
| 147 | GO | D | Lcom/badlogic/gdx/graphics/Color; | color |
| 148 | GO | B | Ljava/lang/String; | path |
| 149 | # ---- GE = 点(point)附件 ---- | |||
| 150 | GE | B | Lcom/badlogic/gdx/graphics/Color; | color |
| 151 | GE | D | F | x |
| 152 | GE | B | F | y |
| 153 | GE | L | F | rotation |
| 154 | # ---- Gx = 网格(mesh / linkedmesh)附件 ---- | |||
| 155 | Gx | B | Lcom/badlogic/gdx/graphics/Color; | color |
| 156 | Gx | B | Ljava/lang/String; | path |
| 157 | Gx | D | Lga; | uvs |
| 158 | Gx | D | Lhp; | triangles |
| 159 | Gx | B | LHl; | vertices |
| 160 | Gx | L | I | hull |
| 161 | # ^ 导出器写 hull = Gx.L / 2 | |||
| 162 | Gx | D | Lgf; | edges |
| 163 | Gx | StackMapTable | Z | deform |
| 164 | Gx | D | F | width |
| 165 | # ^ 只在导出器带 extra 标志时写 | |||
| 166 | Gx | B | F | height |
| 167 | Gx | D | LGx; | parentMesh |
| 168 | Gx | D | LGT; | skin |
| 169 | Gx | D | LHi; | parentPlaceholder |
| 170 | # ^ 父网格的占位附件(Hi) | |||
| 171 | Gx | D | Ljava/lang/String; | parentName |
| 172 | # ---- Gr = 包围盒(boundingbox)附件 ---- | |||
| 173 | Gr | I | Lga; | vertexCount |
| 174 | Gr | B | LHl; | vertices |
| 175 | Gr | B | Lcom/badlogic/gdx/graphics/Color; | color |
| 176 | # ---- Gs = 裁剪(clipping)附件 ---- | |||
| 177 | Gs | I | Lga; | vertexCount |
| 178 | Gs | B | LHl; | vertices |
| 179 | Gs | B | Lcom/badlogic/gdx/graphics/Color; | color |
| 180 | Gs | B | LGU; | end |
| 181 | # ^ 裁剪结束的那个插槽 | |||
| 182 | # ---- Gw = IK 约束 ---- | |||
| 183 | Gw | D | Ljava/lang/String; | name |
| 184 | Gw | D | LGp; | target |
| 185 | Gw | D | F | mix |
| 186 | Gw | L | F | softness |
| 187 | Gw | F | Z | uniform |
| 188 | Gw | S | Z | stretch |
| 189 | Gw | Z | Z | compress |
| 190 | # ---- GX = 变换(transform)约束 ---- | |||
| 191 | GX | D | Ljava/lang/String; | name |
| 192 | GX | B | LGp; | target |
| 193 | GX | SourceFile | F | rotation |
| 194 | GX | S | Z | local |
| 195 | GX | C | Z | relative |
| 196 | GX | L | F | x |
| 197 | GX | I | F | y |
| 198 | GX | StackMapTable | F | scaleX |
| 199 | GX | init | F | scaleY |
| 200 | GX | LineNumberTable | F | shearY |
| 201 | GX | S | F | rotateMix |
| 202 | GX | D | F | translateMix |
| 203 | GX | Z | F | scaleMix |
| 204 | GX | F | F | shearMix |
| 205 | # ---- GD = 路径(path)约束 ---- | |||
| 206 | GD | D | Ljava/lang/String; | name |
| 207 | GD | D | LGU; | target |
| 208 | GD | D | Ljm; | positionMode |
| 209 | GD | D | Ljo; | spacingMode |
| 210 | GD | D | Ljn; | rotateMode |
| 211 | GD | Z | F | rotation |
| 212 | GD | D | F | position |
| 213 | GD | V | F | spacing |
| 214 | GD | S | F | rotateMix |
| 215 | GD | L | F | translateMix |
| 216 | # ============================================================================ | |||
| 217 | # 场景:点面板按钮 → 弹名称输入面板 → 按名字匹配附件 → 在当前选中骨骼下建 15 根骨骼, | |||
| 218 | # 每根 1 插槽 1 附件(输入的附件名),位移 xy 0~500 随机、缩放 1、旋转/斜切 0, | |||
| 219 | # 插槽 alpha 0.5~1 随机、blend normal/additive 随机、附件在插槽上变换 0/0/0/1/1。 | |||
| 220 | # 证据:`javap -p -c` 字节码 + attach 到运行进程逐条实测(每个 API 都真跑过并核对过结果)。 | |||
| 221 | # ============================================================================ | |||
| 222 | # UH = OG 的模型编辑助手(OG.D:LUH;)。下面两个都实测建出来过: | |||
| 223 | UH | D | (LGU;LGp;Z;LfI;)LGU; | addSlot |
| 224 | # ^ 加插槽:参数(插槽模板, 父骨骼, ?, 不重名用列表)。⚠️ 它会把模板插槽**整个复制**,连模板插槽上挂的附件一起复制(实测踩到过) | |||
| 225 | UH | D | (LGn;LGU;ZZLfI;)LGn; | addAttachmentCopy |
| 226 | # ^ 加附件:参数(附件模板, 插槽, ?, ?, 列表);内部就是 `Gn.D(LGP;)LGn;` 复制一份模板附件,并挂到该插槽 | |||
| 227 | GP | D | (LGp;)V | addBone |
| 228 | # ^ 加骨骼:字节码 `bone.B = array.size; array.add(bone)`(骨架的骨骼表) | |||
| 229 | OG | D | (Ljava/lang/String;LfI;LGU;)Ljava/lang/String; | uniqueName |
| 230 | GU | D | (LGn;Z)V | setAttachment |
| 231 | # ^ 设插槽的当前附件:第二参=是否记撤销;内部按 `Editor.V`(animate/setup)只写 `D:LGn;` 或 `B:LGn;` 其中一个 —— | |||
| 232 | GU | D | LGn; | attachmentAnimate |
| 233 | # ^ 与 `GU.B:LGn;` 成对:`D` 是 animate 模式用的当前附件,`B` 是 setup/非 animate 用的(JSON 导出器读的是 B) | |||
| 234 | VZ | D | (LGP;ZZ)V | refresh |
| 235 | # ^ 改完模型重建层级树节点(本次每批建完都调它) | |||
| 236 | un | D | ()V | undoBegin |
| 237 | un | B | ()V | undoCommit |
| 238 | # ^ 撤销帧的 开始/提交(改模型前 D()、改完 B()) | |||
| 239 | un | Z | ()V | undo |
| 240 | # ^ ★ 撤销一步:实测有效(`up.D:` 栈 23→22、redo 栈 0→1,场景对象数同步回退)。 | |||
| 241 | # 本次误删骨骼后就是用连点 un.Z() 一键一键撤回来的。另外 un.S()/un.C()/un.V()/un.I() 不是撤销: | |||
| 242 | # S=跳到历史某下标、C=置标志、V=按当前下标重放、I=up.D()(无效果) | |||
| 243 | # ---- 名称输入面板(编辑器自带的那套对话框)---- | |||
| 244 | xl | L | (Ljava/lang/Object;)V | onOkCancel |
| 245 | # ^ 对话框的 OK/Cancel 总回调:收到 Boolean(TRUE=OK、FALSE=Cancel)。 | |||
| 246 | # OK 时它会读名字框、去重校验,然后调下面的抽象方法;Cancel 直接 return | |||
| 247 | xl | L | (Ljava/lang/String;)V | onNameEntered |
| 248 | # ^ **抽象方法**:OK 且名字合法时被调用,参数就是输入的名字。想拿名字就子类化它(本次是 ASM 现生成子类) | |||
| 249 | xl | D | (Ldt;)LvH; | show |
| 250 | # ^ 显示对话框。⚠️ 实测:**光调它窗口不会挂进 Stage**(parent 一直 null、屏幕上什么都不出现), | |||
| 251 | # 必须再显式 `dt.D(Ldl;)V`(Stage.addActor)挂上去,然后自己 setPosition | |||
| 252 | xl | D | LKp; | nameField |
| 253 | # ^ 对话框里的名字输入框(Kp = TextField 子类):构造时会用它填入默认名,OK 时从它读名字 | |||
| 254 | vH | B | (Ljava/lang/Object;)V | okPressed |
| 255 | # ^ OK 按钮的回调:唯一会去调 `L(Object)` 的地方(javap -c vH 可见) | |||
| 256 | vH | L | (Ljava/lang/Object;)V | onOkCancelNoop |
| 257 | # ^ 空实现(xl 覆盖了它) | |||
| 258 | Kp | B | ()Ljava/lang/String; | getText |
| 259 | Kp | B | (Ljava/lang/String;)V | setText |
| 260 | # ^ 名字框取/填文字(xl/xp 的构造与 L(Object) 里就是这么用的) | |||
| 261 | # ---- Actor / Stage / WidgetGroup(定位、挂载、删除)---- | |||
| 262 | dt | D | (Ldl;)V | addActor |
| 263 | # ^ Stage.addActor:字节码就是 `this.D:Ldo;.addActor(actor)`(root.addActor)。 | |||
| 264 | # ⚠️ 用它把对话框挂上屏幕(配合 xl.D(dt));也踩过坑:它会把 Actor 从原父级摘走(当年把面板列表搬出面板就是它) | |||
| 265 | dl | D | Ldo; | parent |
| 266 | dl | D | Ldt; | stage |
| 267 | # ^ Actor 上的两个同名字段:`do` 类型的是父控件,`dt` 类型的是所在 Stage。按类型取,别按名字取 | |||
| 268 | dl | D | ()Ldt; | getStage |
| 269 | dl | b_ | ()Z | remove |
| 270 | eX | b_ | ()V | invalidate |
| 271 | eX | V | (Z)V | setFillParent |
| 272 | dl | c_ | ()F | getX |
| 273 | dl | d_ | ()F | getY |
| 274 | dl | L | ()F | getWidth |
| 275 | dl | I | ()F | getHeight |
| 276 | dl | S | ()F | getTop |
| 277 | dl | C | ()F | getRight |
| 278 | # ^ Actor 的几何读取(都在 dl 上用 `javap -p -c` 对出来的:c_=x、d_=y、L=width、I=height、S=y+h、C=x+w)。 | |||
| 279 | # ⚠️ `et`(Table) 自己还声明了 `int L()`/`int I()`(列数/行数),所以按名字取必须**同时按返回类型 float 过滤** | |||
| 280 | dl | D | (FFI)V | setPosition |
| 281 | # 本次要把对话框摆屏幕正中就是靠这个:直接传 Stage 中心即可 | |||
| 282 | # ---- 混合模式枚举(插槽 blend)---- | |||
| 283 | iz | D | Liz; | normal |
| 284 | iz | B | Liz; | additive |
| 285 | iz | L | Liz; | multiply |
| 286 | iz | I | Liz; | screen |
| 287 | # ---- 面板自己那套(本次复用的)---- | |||
| 288 | com.spineview.ObjectPanel | wire | (Ljava/lang/ClassLoader;Ljava/lang/Object;Ljava/lang/Runnable;)V | wireButton |
| 289 | # ^ 把按钮接上点击(轮询 isChecked + 路由线程)——新按钮直接复用它,不用自己写监听 | |||
| 290 | com.spineview.SceneObjects | listAllNodes | (Ljava/lang/ClassLoader;)Ljava/util/List; | listAllNodes |
| 291 | com.spineview.SceneActions | delete | (Ljava/lang/ClassLoader;Ljava/lang/Object;)Z | delete |
| 292 | # ============================================================================ | |||
| 293 | # 【动画模型】(2026-10-17 实测:新建 Gl / 4 条骨骼轴 / 2 条插槽轴 / 关键帧 / 6 种曲线均跑通并读回验证) | |||
| 294 | # ============================================================================ | |||
| 295 | # ---- 骨架上的动画表与 fps ---- | |||
| 296 | GP | I | LfI | animations |
| 297 | # ^ 骨架的动画表(fI,元素是 Gl)。新建动画 = new Gl() → 设 D:LGP、D:String → Gl.D() 注册 → animations.add(gl) | |||
| 298 | GP | D | LFT; | projectSettings |
| 299 | FT | D | F | fps |
| 300 | # ^ 本项目 fps=30(编辑器时间轴刻度直接用帧:关键帧时间写 0 和 30,不要换算成秒) | |||
| 301 | # ---- Gl = 动画 ---- | |||
| 302 | Gl | D | LGP; | skeleton |
| 303 | Gl | D | Ljava/lang/String; | name |
| 304 | Gl | D | LfI | timelineGroups |
| 305 | # ^ 时间轴组表(FH)。清空动画:直接换一个新的空 fI(removeRange 两个重载实测都不缩容) | |||
| 306 | Gl | D | ()V | register |
| 307 | # ^ 把动画注册进骨架的动画列表模型(编辑器 New Animation 命令里就是这么做的) | |||
| 308 | Gl | D | (LGp;)LFI; | rotateTimeline |
| 309 | Gl | B | (LGp;)LFI; | translateTimeline |
| 310 | Gl | L | (LGp;)LFI; | scaleTimeline |
| 311 | Gl | I | (LGp;)LFI; | shearTimeline |
| 312 | # ^ 骨骼四条轴(取或建):运行时类分别是 ih / io / ii / ij | |||
| 313 | Gl | D | (LGp;LGU;)LFI; | slotColorTimeline |
| 314 | Gl | B | (LGp;LGU;)LFI; | slotAttachmentTimeline |
| 315 | # ^ 插槽两条轴:hU / ip | |||
| 316 | Gl | D | ()LFI; | drawOrderTimeline |
| 317 | # ^ 骨架级绘制顺序轴(hZ) | |||
| 318 | # ---- FH = 时间轴组(按对象分组)---- | |||
| 319 | FH | D | LGl; | animation |
| 320 | FH | D | LGp; | bone |
| 321 | FH | D | LfI | timelines |
| 322 | # ---- FI = 时间轴 ---- | |||
| 323 | FI | D | Ljava/lang/Class; | runtimeTimelineClass |
| 324 | # ^ 运行时轴类:ih=Rotate(旋转) io=Translate(位移) ii=Scale(缩放) ij=Shear(斜切) | |||
| 325 | # hU=SlotColor(插槽颜色) ip=SlotAttachment(附件切换) hZ=DrawOrder(绘制顺序) | |||
| 326 | FI | D | LfI | keys |
| 327 | FI | D | (F)LFN; | findKey |
| 328 | # ^ 按时间精确找关键帧;找不到返回 null | |||
| 329 | FI | D | (LFN;Z)V | insertKey |
| 330 | # ^ 插入关键帧(第二参=是否记撤销) | |||
| 331 | FI | L | ()V | invalidateRuntime |
| 332 | # ^ 标脏运行时轴(改完关键帧调它,让编辑器重建 il) | |||
| 333 | FI | D | (FI;LFH;)V | copyFrom |
| 334 | # ---- FN = 关键帧(数值字段以动画 JSON 导出器为准)---- | |||
| 335 | FN | D | F | time |
| 336 | FN | D | LFV; | curve |
| 337 | # ^ 曲线类型;FV 枚举见下 | |||
| 338 | FN | B | F | curveC2x |
| 339 | FN | L | F | curveC2y |
| 340 | FN | I | F | curveC3x |
| 341 | FN | S | F | curveC3y |
| 342 | # ^ 贝塞尔四个控制值(新建关键帧默认 0.25 / 0 / 0.75 / 1) | |||
| 343 | FN | D | (F)V | setAngle |
| 344 | FN | D | ()F | getAngle |
| 345 | # ^ 旋转轴的 angle(**不是** FN.D():ga!ga 是 deform 的数值数组) | |||
| 346 | FN | B | (F)V | setX |
| 347 | FN | B | ()F | getX |
| 348 | FN | L | (F)V | setY |
| 349 | FN | L | ()F | getY |
| 350 | # ^ 位移/缩放/斜切轴的 x / y | |||
| 351 | FN | D | Lcom/badlogic/gdx/graphics/Color; | color |
| 352 | FN | D | LGn; | attachment |
| 353 | # ^ 插槽颜色 / 挂哪个附件(null = 隐藏) | |||
| 354 | FN | D | LOr; | valueSchema |
| 355 | FN | D | ()Lga; | values |
| 356 | # ^ deform 用的数值数组(旋转/位移/缩放/斜切**不要**写这里) | |||
| 357 | # ---- FV = 曲线枚举(名字来自 FV.<clinit>)---- | |||
| 358 | FV | D | LFV; | linear |
| 359 | FV | B | LFV; | curve |
| 360 | FV | L | LFV; | stepped |
| 361 | # ---- WidgetGroup 的尺寸读取(本次用来把对话框撑到合适大小)---- | |||
| 362 | eX | LineNumberTable | ()F | getMinWidth |
| 363 | eX | String | ()F | getMinHeight |
| 364 | eX | StackMapTable | ()F | getPrefWidth |
| 365 | eX | init | ()F | getPrefHeight |
| 366 | eX | Ljava | ()F | getMaxWidth |
| 367 | eX | Class | ()F | getMaxHeight |
| 368 | # ^ 六个 Layout 方法按 eX 声明顺序对应 minWidth/minHeight/prefWidth/prefHeight/maxWidth/maxHeight | |||
| 369 | # (面板日志里一直用的 `init` 读出来就是 prefHeight;本次实测对话框 pref=399x166) | |||
| 370 | # ^ ⚠️ 窗口刚建出来时的尺寸是默认的 150x150(所以正文/按钮会被裁), | |||
| 371 | # 要显式 `Actor.width/height = max(pref, min, 下限)` + `eX.b_()V`(invalidate) 才会按 pref 撑开 |